add gperf to heap check, use reload signal to terminate program normally
正在显示
6 个修改的文件
包含
55 行增加
和
11 行删除
| @@ -448,3 +448,15 @@ if [ $SRS_GPERF = YES ]; then | @@ -448,3 +448,15 @@ if [ $SRS_GPERF = YES ]; then | ||
| 448 | ret=$?; if [[ $ret -ne 0 ]]; then echo "build gperftools-2.1 failed, ret=$ret"; exit $ret; fi | 448 | ret=$?; if [[ $ret -ne 0 ]]; then echo "build gperftools-2.1 failed, ret=$ret"; exit $ret; fi |
| 449 | if [ ! -f ${SRS_OBJS}/gperf/bin/pprof ]; then echo "build gperftools-2.1 failed."; exit -1; fi | 449 | if [ ! -f ${SRS_OBJS}/gperf/bin/pprof ]; then echo "build gperftools-2.1 failed."; exit -1; fi |
| 450 | fi | 450 | fi |
| 451 | + | ||
| 452 | +if [ $SRS_GPERF = YES ]; then | ||
| 453 | + echo "#define SRS_GPERF" >> $SRS_AUTO_HEADERS_H | ||
| 454 | + #echo "#define SRS_GPERF_CPU_PROFILE" >> $SRS_AUTO_HEADERS_H | ||
| 455 | + #echo "#define SRS_GPERF_HEAP_PROFILE" >> $SRS_AUTO_HEADERS_H | ||
| 456 | + echo "#define SRS_GPERF_HEAP_CHECK" >> $SRS_AUTO_HEADERS_H | ||
| 457 | +else | ||
| 458 | + echo "#undef SRS_GPERF" >> $SRS_AUTO_HEADERS_H | ||
| 459 | + echo "#undef SRS_GPERF_CPU_PROFILE" >> $SRS_AUTO_HEADERS_H | ||
| 460 | + echo "#undef SRS_GPERF_HEAP_PROFILE" >> $SRS_AUTO_HEADERS_H | ||
| 461 | + echo "#undef SRS_GPERF_HEAP_CHECK" >> $SRS_AUTO_HEADERS_H | ||
| 462 | +fi |
| @@ -138,8 +138,6 @@ END | @@ -138,8 +138,6 @@ END | ||
| 138 | 138 | ||
| 139 | ##################################################################################### | 139 | ##################################################################################### |
| 140 | # build tools or compiler args. | 140 | # build tools or compiler args. |
| 141 | -# the performance analysis, uncomments the following when use gperf to analysis the performance. see third-party/readme.txt | ||
| 142 | -Performance="-pg" | ||
| 143 | # enable gdb debug | 141 | # enable gdb debug |
| 144 | GDBDebug="-g -O0" | 142 | GDBDebug="-g -O0" |
| 145 | # the warning level. | 143 | # the warning level. |
| @@ -150,7 +148,7 @@ CppStd="-ansi" | @@ -150,7 +148,7 @@ CppStd="-ansi" | ||
| 150 | LibraryCompile="-fPIC" | 148 | LibraryCompile="-fPIC" |
| 151 | # the cxx flag generated. | 149 | # the cxx flag generated. |
| 152 | CXXFLAGS="${CppStd} ${WarnLevel} ${GDBDebug} ${LibraryCompile}" | 150 | CXXFLAGS="${CppStd} ${WarnLevel} ${GDBDebug} ${LibraryCompile}" |
| 153 | -#CXXFLAGS="${CppStd} ${WarnLevel} ${GDBDebug} ${Performance}" | 151 | +if [ $SRS_GPERF = YES ]; then CXXFLAGS="${CXXFLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free"; fi |
| 154 | cat << END > ${SRS_OBJS}/${SRS_MAKEFILE} | 152 | cat << END > ${SRS_OBJS}/${SRS_MAKEFILE} |
| 155 | CC ?= gcc | 153 | CC ?= gcc |
| 156 | GCC ?= gcc | 154 | GCC ?= gcc |
| @@ -178,6 +176,9 @@ if [ $SRS_HTTP = YES ]; then LibHttpParserRoot="${SRS_OBJS}/hp"; LibHttpParserfi | @@ -178,6 +176,9 @@ if [ $SRS_HTTP = YES ]; then LibHttpParserRoot="${SRS_OBJS}/hp"; LibHttpParserfi | ||
| 178 | # openssl-1.0.1f, for the RTMP complex handshake. | 176 | # openssl-1.0.1f, for the RTMP complex handshake. |
| 179 | LibSSLRoot="";LibSSLfile="" | 177 | LibSSLRoot="";LibSSLfile="" |
| 180 | if [ $SRS_SSL = YES ]; then LibSSLRoot="${SRS_OBJS}/openssl/include"; LibSSLfile="${SRS_OBJS}/openssl/lib/libssl.a ${SRS_OBJS}/openssl/lib/libcrypto.a"; fi | 178 | if [ $SRS_SSL = YES ]; then LibSSLRoot="${SRS_OBJS}/openssl/include"; LibSSLfile="${SRS_OBJS}/openssl/lib/libssl.a ${SRS_OBJS}/openssl/lib/libcrypto.a"; fi |
| 179 | +# gperftools-2.1, for mem check and mem/cpu profile | ||
| 180 | +LibGperfRoot=""; LibGperfFile="" | ||
| 181 | +if [ $SRS_GPERF = YES ]; then LibGperfRoot="${SRS_OBJS}/gperf/include"; LibGperfFile="${SRS_OBJS}/gperf/lib/libtcmalloc_and_profiler.a"; fi | ||
| 181 | 182 | ||
| 182 | ##################################################################################### | 183 | ##################################################################################### |
| 183 | # Modules, compile each module, then link to binary | 184 | # Modules, compile each module, then link to binary |
| @@ -229,7 +230,7 @@ LIBS_OBJS="${MODULE_OBJS[@]}" | @@ -229,7 +230,7 @@ LIBS_OBJS="${MODULE_OBJS[@]}" | ||
| 229 | #Main Module | 230 | #Main Module |
| 230 | MODULE_ID="MAIN" | 231 | MODULE_ID="MAIN" |
| 231 | MODULE_DEPENDS=("CORE" "KERNEL" "RTMP" "APP") | 232 | MODULE_DEPENDS=("CORE" "KERNEL" "RTMP" "APP") |
| 232 | -ModuleLibIncs=(${LibSTRoot} ${SRS_OBJS}) | 233 | +ModuleLibIncs=(${LibSTRoot} ${SRS_OBJS} ${LibGperfRoot}) |
| 233 | MODULE_FILES=("srs_main_server" "srs_main_bandcheck") | 234 | MODULE_FILES=("srs_main_server" "srs_main_bandcheck") |
| 234 | MAIN_INCS="src/main"; MODULE_DIR=${MAIN_INCS} . auto/modules.sh | 235 | MAIN_INCS="src/main"; MODULE_DIR=${MAIN_INCS} . auto/modules.sh |
| 235 | MAIN_OBJS="${MODULE_OBJS[@]}" | 236 | MAIN_OBJS="${MODULE_OBJS[@]}" |
| @@ -242,10 +243,11 @@ MAIN_OBJS="${MODULE_OBJS[@]}" | @@ -242,10 +243,11 @@ MAIN_OBJS="${MODULE_OBJS[@]}" | ||
| 242 | MAIN_ENTRANCES=("srs_main_server" "srs_main_bandcheck") | 243 | MAIN_ENTRANCES=("srs_main_server" "srs_main_bandcheck") |
| 243 | # | 244 | # |
| 244 | # all depends libraries | 245 | # all depends libraries |
| 245 | -ModuleLibFiles=(${LibSTfile} ${LibHttpParserfile} ${LibSSLfile}) | 246 | +ModuleLibFiles=(${LibSTfile} ${LibHttpParserfile} ${LibSSLfile} ${LibGperfFile}) |
| 246 | # all depends objects | 247 | # all depends objects |
| 247 | MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${RTMP_OBJS[@]} ${APP_OBJS[@]} ${MAIN_OBJS[@]}" | 248 | MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${RTMP_OBJS[@]} ${APP_OBJS[@]} ${MAIN_OBJS[@]}" |
| 248 | LINK_OPTIONS="-ldl" | 249 | LINK_OPTIONS="-ldl" |
| 250 | +if [ $SRS_GPERF = YES ]; then LINK_OPTIONS="${LINK_OPTIONS} -lpthread"; fi | ||
| 249 | # | 251 | # |
| 250 | # srs: | 252 | # srs: |
| 251 | # srs(simple rtmp server) over st(state-threads) | 253 | # srs(simple rtmp server) over st(state-threads) |
| @@ -335,4 +337,8 @@ fi | @@ -335,4 +337,8 @@ fi | ||
| 335 | if [ $SRS_HTTP = YES ]; then | 337 | if [ $SRS_HTTP = YES ]; then |
| 336 | echo -e "\" python ./research/api-server/server.py 8085 \" to start the api-server" | 338 | echo -e "\" python ./research/api-server/server.py 8085 \" to start the api-server" |
| 337 | fi | 339 | fi |
| 338 | -echo "\" ./objs/srs -c conf/srs.conf \" to start the srs live server" | 340 | +if [ $SRS_GPERF = YES ]; then |
| 341 | + echo "\" env HEAPCHECK=normal ./objs/srs -c conf/srs.conf \" to start the srs live server" | ||
| 342 | +else | ||
| 343 | + echo "\" ./objs/srs -c conf/srs.conf \" to start the srs live server" | ||
| 344 | +fi |
trunk/research/gperftools/cpu-profiler/Makefile
100755 → 100644
| @@ -7,4 +7,4 @@ cpu_profiler: cpu_profiler.cc Makefile | @@ -7,4 +7,4 @@ cpu_profiler: cpu_profiler.cc Makefile | ||
| 7 | -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free \ | 7 | -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free \ |
| 8 | -I../../../objs/gperf/include ../../../objs/gperf/lib/libtcmalloc_and_profiler.a -lpthread | 8 | -I../../../objs/gperf/include ../../../objs/gperf/lib/libtcmalloc_and_profiler.a -lpthread |
| 9 | clean: | 9 | clean: |
| 10 | - rm -f cpu_profiler ./srs.conf* | 10 | + rm -f cpu_profiler ./srs.prof* |
| @@ -26,11 +26,11 @@ config srs with gperf(to make gperftools): | @@ -26,11 +26,11 @@ config srs with gperf(to make gperftools): | ||
| 26 | set the pprof path if not set: | 26 | set the pprof path if not set: |
| 27 | export PPROF_PATH=`pwd`/../../../objs/pprof | 27 | export PPROF_PATH=`pwd`/../../../objs/pprof |
| 28 | to do cpu profile: | 28 | to do cpu profile: |
| 29 | - make && rm -f ./srs.conf* && env CPUPROFILE=./srs.conf ./cpu_profiler | ||
| 30 | - $PPROF_PATH --text cpu_profiler ./srs.conf* | 29 | + make && rm -f ./srs.prof* && env CPUPROFILE=./srs.prof ./cpu_profiler |
| 30 | + $PPROF_PATH --text cpu_profiler ./srs.prof* | ||
| 31 | to do cpu profile by signal: | 31 | to do cpu profile by signal: |
| 32 | - make && rm -f ./srs.conf* && env CPUPROFILE=./srs.conf CPUPROFILESIGNAL=12 ./cpu_profiler | ||
| 33 | - $PPROF_PATH --text cpu_profiler ./srs.conf* | 32 | + make && rm -f ./srs.prof* && env CPUPROFILE=./srs.prof CPUPROFILESIGNAL=12 ./cpu_profiler |
| 33 | + $PPROF_PATH --text cpu_profiler ./srs.prof* | ||
| 34 | */ | 34 | */ |
| 35 | #include <stdio.h> | 35 | #include <stdio.h> |
| 36 | #include <unistd.h> | 36 | #include <unistd.h> |
| @@ -233,6 +233,14 @@ int SrsServer::cycle() | @@ -233,6 +233,14 @@ int SrsServer::cycle() | ||
| 233 | srs_update_system_time_ms(); | 233 | srs_update_system_time_ms(); |
| 234 | 234 | ||
| 235 | if (signal_reload) { | 235 | if (signal_reload) { |
| 236 | +// for gperf heap checker, | ||
| 237 | +// @see: research/gperftools/heap-checker/heap_checker.cc | ||
| 238 | +// if user interrupt the program, exit to check mem leak. | ||
| 239 | +// but, if gperf, use reload to terminate the server, | ||
| 240 | +// for the SIGINT will cause core-dump. | ||
| 241 | +#ifdef SRS_GPERF | ||
| 242 | + break; | ||
| 243 | +#endif | ||
| 236 | signal_reload = false; | 244 | signal_reload = false; |
| 237 | srs_info("get signal reload, to reload the config."); | 245 | srs_info("get signal reload, to reload the config."); |
| 238 | 246 |
| @@ -37,6 +37,13 @@ SrsServer* _srs_server = new SrsServer(); | @@ -37,6 +37,13 @@ SrsServer* _srs_server = new SrsServer(); | ||
| 37 | #include <stdlib.h> | 37 | #include <stdlib.h> |
| 38 | #include <signal.h> | 38 | #include <signal.h> |
| 39 | 39 | ||
| 40 | +#ifdef SRS_GPERF_HEAP_PROFILE | ||
| 41 | + #include <gperftools/heap-profiler.h> | ||
| 42 | +#endif | ||
| 43 | +#ifdef SRS_GPERF_CPU_PROFILE | ||
| 44 | + #include <gperftools/profiler.h> | ||
| 45 | +#endif | ||
| 46 | + | ||
| 40 | void handler(int signo) | 47 | void handler(int signo) |
| 41 | { | 48 | { |
| 42 | srs_trace("get a signal, signo=%d", signo); | 49 | srs_trace("get a signal, signo=%d", signo); |
| @@ -47,6 +54,17 @@ int main(int argc, char** argv) | @@ -47,6 +54,17 @@ int main(int argc, char** argv) | ||
| 47 | { | 54 | { |
| 48 | int ret = ERROR_SUCCESS; | 55 | int ret = ERROR_SUCCESS; |
| 49 | 56 | ||
| 57 | +#ifdef SRS_GPERF_HEAP_CHECK | ||
| 58 | + // env HEAPCHECK=normal ./objs/srs -c srs.conf | ||
| 59 | +#endif | ||
| 60 | + | ||
| 61 | +#ifdef SRS_GPERF_HEAP_PROFILE | ||
| 62 | + HeapProfilerStart("gperf.srs"); | ||
| 63 | +#endif | ||
| 64 | +#ifdef SRS_GPERF_CPU_PROFILE | ||
| 65 | + ProfilerStart("gperf.srs.prof"); | ||
| 66 | +#endif | ||
| 67 | + | ||
| 50 | signal(SIGNAL_RELOAD, handler); | 68 | signal(SIGNAL_RELOAD, handler); |
| 51 | 69 | ||
| 52 | if ((ret = _srs_config->parse_options(argc, argv)) != ERROR_SUCCESS) { | 70 | if ((ret = _srs_config->parse_options(argc, argv)) != ERROR_SUCCESS) { |
-
请 注册 或 登录 后发表评论