diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index cb8af00c6..b8164d5df 100644 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -448,3 +448,15 @@ if [ $SRS_GPERF = YES ]; then ret=$?; if [[ $ret -ne 0 ]]; then echo "build gperftools-2.1 failed, ret=$ret"; exit $ret; fi if [ ! -f ${SRS_OBJS}/gperf/bin/pprof ]; then echo "build gperftools-2.1 failed."; exit -1; fi fi + +if [ $SRS_GPERF = YES ]; then + echo "#define SRS_GPERF" >> $SRS_AUTO_HEADERS_H + #echo "#define SRS_GPERF_CPU_PROFILE" >> $SRS_AUTO_HEADERS_H + #echo "#define SRS_GPERF_HEAP_PROFILE" >> $SRS_AUTO_HEADERS_H + echo "#define SRS_GPERF_HEAP_CHECK" >> $SRS_AUTO_HEADERS_H +else + echo "#undef SRS_GPERF" >> $SRS_AUTO_HEADERS_H + echo "#undef SRS_GPERF_CPU_PROFILE" >> $SRS_AUTO_HEADERS_H + echo "#undef SRS_GPERF_HEAP_PROFILE" >> $SRS_AUTO_HEADERS_H + echo "#undef SRS_GPERF_HEAP_CHECK" >> $SRS_AUTO_HEADERS_H +fi diff --git a/trunk/configure b/trunk/configure index bdf2f5287..392020251 100755 --- a/trunk/configure +++ b/trunk/configure @@ -138,8 +138,6 @@ END ##################################################################################### # build tools or compiler args. -# the performance analysis, uncomments the following when use gperf to analysis the performance. see third-party/readme.txt -Performance="-pg" # enable gdb debug GDBDebug="-g -O0" # the warning level. @@ -150,7 +148,7 @@ CppStd="-ansi" LibraryCompile="-fPIC" # the cxx flag generated. CXXFLAGS="${CppStd} ${WarnLevel} ${GDBDebug} ${LibraryCompile}" -#CXXFLAGS="${CppStd} ${WarnLevel} ${GDBDebug} ${Performance}" +if [ $SRS_GPERF = YES ]; then CXXFLAGS="${CXXFLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free"; fi cat << END > ${SRS_OBJS}/${SRS_MAKEFILE} CC ?= gcc GCC ?= gcc @@ -178,6 +176,9 @@ if [ $SRS_HTTP = YES ]; then LibHttpParserRoot="${SRS_OBJS}/hp"; LibHttpParserfi # openssl-1.0.1f, for the RTMP complex handshake. LibSSLRoot="";LibSSLfile="" if [ $SRS_SSL = YES ]; then LibSSLRoot="${SRS_OBJS}/openssl/include"; LibSSLfile="${SRS_OBJS}/openssl/lib/libssl.a ${SRS_OBJS}/openssl/lib/libcrypto.a"; fi +# gperftools-2.1, for mem check and mem/cpu profile +LibGperfRoot=""; LibGperfFile="" +if [ $SRS_GPERF = YES ]; then LibGperfRoot="${SRS_OBJS}/gperf/include"; LibGperfFile="${SRS_OBJS}/gperf/lib/libtcmalloc_and_profiler.a"; fi ##################################################################################### # Modules, compile each module, then link to binary @@ -229,7 +230,7 @@ LIBS_OBJS="${MODULE_OBJS[@]}" #Main Module MODULE_ID="MAIN" MODULE_DEPENDS=("CORE" "KERNEL" "RTMP" "APP") -ModuleLibIncs=(${LibSTRoot} ${SRS_OBJS}) +ModuleLibIncs=(${LibSTRoot} ${SRS_OBJS} ${LibGperfRoot}) MODULE_FILES=("srs_main_server" "srs_main_bandcheck") MAIN_INCS="src/main"; MODULE_DIR=${MAIN_INCS} . auto/modules.sh MAIN_OBJS="${MODULE_OBJS[@]}" @@ -242,10 +243,11 @@ MAIN_OBJS="${MODULE_OBJS[@]}" MAIN_ENTRANCES=("srs_main_server" "srs_main_bandcheck") # # all depends libraries -ModuleLibFiles=(${LibSTfile} ${LibHttpParserfile} ${LibSSLfile}) +ModuleLibFiles=(${LibSTfile} ${LibHttpParserfile} ${LibSSLfile} ${LibGperfFile}) # all depends objects MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${RTMP_OBJS[@]} ${APP_OBJS[@]} ${MAIN_OBJS[@]}" LINK_OPTIONS="-ldl" +if [ $SRS_GPERF = YES ]; then LINK_OPTIONS="${LINK_OPTIONS} -lpthread"; fi # # srs: # srs(simple rtmp server) over st(state-threads) @@ -335,4 +337,8 @@ fi if [ $SRS_HTTP = YES ]; then echo -e "\" python ./research/api-server/server.py 8085 \" to start the api-server" fi -echo "\" ./objs/srs -c conf/srs.conf \" to start the srs live server" +if [ $SRS_GPERF = YES ]; then + echo "\" env HEAPCHECK=normal ./objs/srs -c conf/srs.conf \" to start the srs live server" +else + echo "\" ./objs/srs -c conf/srs.conf \" to start the srs live server" +fi diff --git a/trunk/research/gperftools/cpu-profiler/Makefile b/trunk/research/gperftools/cpu-profiler/Makefile old mode 100755 new mode 100644 index ea52b3126..15c7e8699 --- a/trunk/research/gperftools/cpu-profiler/Makefile +++ b/trunk/research/gperftools/cpu-profiler/Makefile @@ -7,4 +7,4 @@ cpu_profiler: cpu_profiler.cc Makefile -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free \ -I../../../objs/gperf/include ../../../objs/gperf/lib/libtcmalloc_and_profiler.a -lpthread clean: - rm -f cpu_profiler ./srs.conf* + rm -f cpu_profiler ./srs.prof* diff --git a/trunk/research/gperftools/cpu-profiler/cpu_profiler.cc b/trunk/research/gperftools/cpu-profiler/cpu_profiler.cc index 62b60e3c3..de8c7c059 100644 --- a/trunk/research/gperftools/cpu-profiler/cpu_profiler.cc +++ b/trunk/research/gperftools/cpu-profiler/cpu_profiler.cc @@ -26,11 +26,11 @@ config srs with gperf(to make gperftools): set the pprof path if not set: export PPROF_PATH=`pwd`/../../../objs/pprof to do cpu profile: - make && rm -f ./srs.conf* && env CPUPROFILE=./srs.conf ./cpu_profiler - $PPROF_PATH --text cpu_profiler ./srs.conf* + make && rm -f ./srs.prof* && env CPUPROFILE=./srs.prof ./cpu_profiler + $PPROF_PATH --text cpu_profiler ./srs.prof* to do cpu profile by signal: - make && rm -f ./srs.conf* && env CPUPROFILE=./srs.conf CPUPROFILESIGNAL=12 ./cpu_profiler - $PPROF_PATH --text cpu_profiler ./srs.conf* + make && rm -f ./srs.prof* && env CPUPROFILE=./srs.prof CPUPROFILESIGNAL=12 ./cpu_profiler + $PPROF_PATH --text cpu_profiler ./srs.prof* */ #include #include diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 6b002ff74..d2f450eb2 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -233,6 +233,14 @@ int SrsServer::cycle() srs_update_system_time_ms(); if (signal_reload) { +// for gperf heap checker, +// @see: research/gperftools/heap-checker/heap_checker.cc +// if user interrupt the program, exit to check mem leak. +// but, if gperf, use reload to terminate the server, +// for the SIGINT will cause core-dump. +#ifdef SRS_GPERF + break; +#endif signal_reload = false; srs_info("get signal reload, to reload the config."); diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index 2b9f90a3c..c661a86ed 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -37,6 +37,13 @@ SrsServer* _srs_server = new SrsServer(); #include #include +#ifdef SRS_GPERF_HEAP_PROFILE + #include +#endif +#ifdef SRS_GPERF_CPU_PROFILE + #include +#endif + void handler(int signo) { srs_trace("get a signal, signo=%d", signo); @@ -47,6 +54,17 @@ int main(int argc, char** argv) { int ret = ERROR_SUCCESS; +#ifdef SRS_GPERF_HEAP_CHECK + // env HEAPCHECK=normal ./objs/srs -c srs.conf +#endif + +#ifdef SRS_GPERF_HEAP_PROFILE + HeapProfilerStart("gperf.srs"); +#endif +#ifdef SRS_GPERF_CPU_PROFILE + ProfilerStart("gperf.srs.prof"); +#endif + signal(SIGNAL_RELOAD, handler); if ((ret = _srs_config->parse_options(argc, argv)) != ERROR_SUCCESS) {