diff --git a/trunk/3rdparty/st-srs/Makefile b/trunk/3rdparty/st-srs/Makefile index 7102eedb4..71f96ba4e 100644 --- a/trunk/3rdparty/st-srs/Makefile +++ b/trunk/3rdparty/st-srs/Makefile @@ -286,6 +286,9 @@ endif # # make EXTRA_CFLAGS="-DMD_HAVE_SENDMMSG -D_GNU_SOURCE" # +# or to enable stats for ST: +# +# make EXTRA_CFLAGS=-DDEBUG_STATS ########################## CFLAGS += $(DEFINES) $(OTHER_FLAGS) $(EXTRA_CFLAGS) diff --git a/trunk/3rdparty/st-srs/event.c b/trunk/3rdparty/st-srs/event.c index 82354e174..4b54e69ef 100644 --- a/trunk/3rdparty/st-srs/event.c +++ b/trunk/3rdparty/st-srs/event.c @@ -48,7 +48,7 @@ #endif // Global stat. -#ifdef DEBUG +#if defined(DEBUG) && defined(DEBUG_STATS) unsigned long long _st_stat_epoll = 0; unsigned long long _st_stat_epoll_zero = 0; unsigned long long _st_stat_epoll_shake = 0; @@ -1213,7 +1213,7 @@ ST_HIDDEN void _st_epoll_dispatch(void) int events, op; short revents; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_epoll; #endif @@ -1225,12 +1225,12 @@ ST_HIDDEN void _st_epoll_dispatch(void) // At least wait 1ms when <1ms, to avoid epoll_wait spin loop. if (timeout == 0) { - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_epoll_zero; #endif if (min_timeout > 0) { - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_epoll_shake; #endif @@ -1262,7 +1262,7 @@ ST_HIDDEN void _st_epoll_dispatch(void) /* Check for I/O operations */ nfd = epoll_wait(_st_epoll_data->epfd, _st_epoll_data->evtlist, _st_epoll_data->evtlist_size, timeout); - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) if (nfd <= 0) { ++_st_stat_epoll_spin; } diff --git a/trunk/3rdparty/st-srs/io.c b/trunk/3rdparty/st-srs/io.c index 244db5a62..da9184091 100644 --- a/trunk/3rdparty/st-srs/io.c +++ b/trunk/3rdparty/st-srs/io.c @@ -53,7 +53,7 @@ #include "common.h" // Global stat. -#ifdef DEBUG +#if defined(DEBUG) && defined(DEBUG_STATS) unsigned long long _st_stat_recvfrom = 0; unsigned long long _st_stat_recvfrom_eagain = 0; unsigned long long _st_stat_sendto = 0; @@ -457,7 +457,7 @@ ssize_t st_read(_st_netfd_t *fd, void *buf, size_t nbyte, st_utime_t timeout) { ssize_t n; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_read; #endif @@ -467,7 +467,7 @@ ssize_t st_read(_st_netfd_t *fd, void *buf, size_t nbyte, st_utime_t timeout) if (!_IO_NOT_READY_ERROR) return -1; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_read_eagain; #endif @@ -499,7 +499,7 @@ ssize_t st_readv(_st_netfd_t *fd, const struct iovec *iov, int iov_size, st_utim { ssize_t n; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_readv; #endif @@ -509,7 +509,7 @@ ssize_t st_readv(_st_netfd_t *fd, const struct iovec *iov, int iov_size, st_utim if (!_IO_NOT_READY_ERROR) return -1; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_readv_eagain; #endif @@ -610,7 +610,7 @@ ssize_t st_writev(_st_netfd_t *fd, const struct iovec *iov, int iov_size, st_uti tmp_iov = (struct iovec *) iov; /* we promise not to modify iov */ iov_cnt = iov_size; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_writev; #endif @@ -658,7 +658,7 @@ ssize_t st_writev(_st_netfd_t *fd, const struct iovec *iov, int iov_size, st_uti } } - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_writev_eagain; #endif @@ -680,7 +680,7 @@ int st_writev_resid(_st_netfd_t *fd, struct iovec **iov, int *iov_size, st_utime { ssize_t n; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_writev; #endif @@ -710,7 +710,7 @@ int st_writev_resid(_st_netfd_t *fd, struct iovec **iov, int *iov_size, st_utime (*iov)->iov_len -= n; } - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_writev_eagain; #endif @@ -730,7 +730,7 @@ int st_recvfrom(_st_netfd_t *fd, void *buf, int len, struct sockaddr *from, int { int n; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_recvfrom; #endif @@ -740,7 +740,7 @@ int st_recvfrom(_st_netfd_t *fd, void *buf, int len, struct sockaddr *from, int if (!_IO_NOT_READY_ERROR) return -1; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_recvfrom_eagain; #endif @@ -757,7 +757,7 @@ int st_sendto(_st_netfd_t *fd, const void *msg, int len, const struct sockaddr * { int n; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_sendto; #endif @@ -767,7 +767,7 @@ int st_sendto(_st_netfd_t *fd, const void *msg, int len, const struct sockaddr * if (!_IO_NOT_READY_ERROR) return -1; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_sendto_eagain; #endif @@ -784,7 +784,7 @@ int st_recvmsg(_st_netfd_t *fd, struct msghdr *msg, int flags, st_utime_t timeou { int n; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_recvmsg; #endif @@ -794,7 +794,7 @@ int st_recvmsg(_st_netfd_t *fd, struct msghdr *msg, int flags, st_utime_t timeou if (!_IO_NOT_READY_ERROR) return -1; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_recvmsg_eagain; #endif @@ -811,7 +811,7 @@ int st_sendmsg(_st_netfd_t *fd, const struct msghdr *msg, int flags, st_utime_t { int n; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_sendmsg; #endif @@ -821,7 +821,7 @@ int st_sendmsg(_st_netfd_t *fd, const struct msghdr *msg, int flags, st_utime_t if (!_IO_NOT_READY_ERROR) return -1; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_sendmsg_eagain; #endif @@ -840,7 +840,7 @@ int st_sendmmsg(st_netfd_t fd, struct st_mmsghdr *msgvec, unsigned int vlen, int int left; struct mmsghdr *p; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_sendmmsg; #endif @@ -854,7 +854,7 @@ int st_sendmmsg(st_netfd_t fd, struct st_mmsghdr *msgvec, unsigned int vlen, int if (!_IO_NOT_READY_ERROR) break; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_sendmmsg_eagain; #endif diff --git a/trunk/3rdparty/st-srs/sched.c b/trunk/3rdparty/st-srs/sched.c index f69df556c..80d0e3968 100644 --- a/trunk/3rdparty/st-srs/sched.c +++ b/trunk/3rdparty/st-srs/sched.c @@ -53,7 +53,7 @@ #endif // Global stat. -#ifdef DEBUG +#if defined(DEBUG) && defined(DEBUG_STATS) unsigned long long _st_stat_sched_15ms = 0; unsigned long long _st_stat_sched_20ms = 0; unsigned long long _st_stat_sched_25ms = 0; @@ -136,7 +136,7 @@ void _st_vp_schedule(void) _st_thread_t *thread; if (_ST_RUNQ.next != &_ST_RUNQ) { - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_thread_run; #endif @@ -144,7 +144,7 @@ void _st_vp_schedule(void) thread = _ST_THREAD_PTR(_ST_RUNQ.next); _ST_DEL_RUNQ(thread); } else { - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_thread_idle; #endif @@ -509,7 +509,7 @@ void _st_vp_check_clock(void) elapsed = now < _ST_LAST_CLOCK? 0 : now - _ST_LAST_CLOCK; // Might step back. _ST_LAST_CLOCK = now; - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) if (elapsed <= 10000) { ++_st_stat_sched_15ms; } else if (elapsed <= 21000) { @@ -560,7 +560,7 @@ void st_thread_yield() { _st_thread_t *me = _ST_CURRENT_THREAD(); - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_thread_yield; #endif @@ -572,7 +572,7 @@ void st_thread_yield() return; } - #ifdef DEBUG + #if defined(DEBUG) && defined(DEBUG_STATS) ++_st_stat_thread_yield2; #endif diff --git a/trunk/auto/auto_headers.sh b/trunk/auto/auto_headers.sh index 0229996ea..19498237c 100755 --- a/trunk/auto/auto_headers.sh +++ b/trunk/auto/auto_headers.sh @@ -193,6 +193,12 @@ else srs_undefine_macro "SRS_DEBUG" $SRS_AUTO_HEADERS_H fi +if [ $SRS_DEBUG_STATS = YES ]; then + srs_define_macro "SRS_DEBUG_STATS" $SRS_AUTO_HEADERS_H +else + srs_undefine_macro "SRS_DEBUG_STATS" $SRS_AUTO_HEADERS_H +fi + # prefix echo "" >> $SRS_AUTO_HEADERS_H echo "#define SRS_PREFIX \"${SRS_PREFIX}\"" >> $SRS_AUTO_HEADERS_H diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index ee7d228d0..11b5785d0 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -347,6 +347,10 @@ else echo "Build ST without UDP sendmmsg support." _ST_EXTRA_CFLAGS="$_ST_EXTRA_CFLAGS -UMD_HAVE_SENDMMSG -U_GNU_SOURCE" fi +# Whether enable debug stats. +if [[ $SRS_DEBUG_STATS == YES ]]; then + _ST_EXTRA_CFLAGS="$_ST_EXTRA_CFLAGS -DDEBUG_STATS" +fi # Always alloc on heap, @see https://github.com/ossrs/srs/issues/509#issuecomment-719931676 _ST_EXTRA_CFLAGS="$_ST_EXTRA_CFLAGS -DMALLOC_STACK" # Pass the global extra flags. diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh index 23aab3509..a727e5513 100755 --- a/trunk/auto/options.sh +++ b/trunk/auto/options.sh @@ -133,6 +133,7 @@ SRS_NASM=YES SRS_SRTP_ASM=YES SRS_SENDMMSG=NO SRS_DEBUG=NO +SRS_DEBUG_STATS=NO ##################################################################################### # menu @@ -162,6 +163,7 @@ Features: --prefix= The absolute installation path. Default: $SRS_PREFIX --gcov=on|off Whether enable the GCOV compiler options. Default: $(value2switch $SRS_GCOV) --debug=on|off Whether enable the debug code, may hurt performance. Default: $(value2switch $SRS_DEBUG) + --debug-stats=on|off Whether enable the debug stats, may hurt performance. Default: $(value2switch $SRS_DEBUG_STATS) --jobs[=N] Allow N jobs at once; infinite jobs with no arg. Default: $SRS_JOBS --log-verbose Whether enable the log verbose level. Default: $(value2switch $SRS_LOG_VERBOSE) --log-info Whether enable the log info level. Default: $(value2switch $SRS_LOG_INFO) @@ -222,7 +224,8 @@ function parse_user_option() { --log-info) SRS_LOG_INFO=YES ;; --log-trace) SRS_LOG_TRACE=YES ;; --gcov) SRS_GCOV=YES ;; - --debug) SRS_DEBUG=YES ;; + --debug) if [[ $value == off ]]; then SRS_DEBUG=NO; else SRS_DEBUG=YES; fi ;; + --debug-stats) if [[ $value == off ]]; then SRS_DEBUG_STATS=NO; else SRS_DEBUG_STATS=YES; fi ;; --arm) SRS_CROSS_BUILD=YES ;; --mips) SRS_CROSS_BUILD=YES ;; @@ -572,7 +575,8 @@ function regenerate_options() { if [ $SRS_LOG_INFO = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --log-info"; fi if [ $SRS_LOG_TRACE = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --log-trace"; fi if [ $SRS_GCOV = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gcov"; fi - if [ $SRS_DEBUG = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --debug"; fi + if [ $SRS_DEBUG = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --debug=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --debug=off"; fi + if [ $SRS_DEBUG_STATS = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --debug-stats=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --debug-stats=off"; fi if [[ $SRS_EXTRA_FLAGS != '' ]]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --extra-flags=\\\"$SRS_EXTRA_FLAGS\\\""; fi if [[ $SRS_BUILD_TAG != '' ]]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --build-tag=\\\"$SRS_BUILD_TAG\\\""; fi if [[ $SRS_TOOL_CC != '' ]]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cc=$SRS_TOOL_CC"; fi diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 9f7a37343..b8645bb4f 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -39,6 +39,7 @@ extern SrsPps* _srs_pps_pub; extern SrsPps* _srs_pps_conn; extern SrsPps* _srs_pps_dispose; +#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) extern unsigned long long _st_stat_recvfrom; extern unsigned long long _st_stat_recvfrom_eagain; extern unsigned long long _st_stat_sendto; @@ -101,6 +102,7 @@ SrsPps* _srs_pps_sched_40ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_sched_80ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_sched_160ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_sched_s = new SrsPps(_srs_clock); +#endif SrsPps* _srs_pps_clock_15ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_20ms = new SrsPps(_srs_clock); @@ -112,6 +114,7 @@ SrsPps* _srs_pps_clock_80ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_160ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_timer_s = new SrsPps(_srs_clock); +#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) extern int _st_active_count; extern unsigned long long _st_stat_thread_run; extern unsigned long long _st_stat_thread_idle; @@ -121,6 +124,7 @@ SrsPps* _srs_pps_thread_run = new SrsPps(_srs_clock); SrsPps* _srs_pps_thread_idle = new SrsPps(_srs_clock); SrsPps* _srs_pps_thread_yield = new SrsPps(_srs_clock); SrsPps* _srs_pps_thread_yield2 = new SrsPps(_srs_clock); +#endif ISrsHybridServer::ISrsHybridServer() { @@ -372,14 +376,17 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t } string recvfrom_desc; +#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) _srs_pps_recvfrom->update(_st_stat_recvfrom); _srs_pps_recvfrom_eagain->update(_st_stat_recvfrom_eagain); _srs_pps_sendto->update(_st_stat_sendto); _srs_pps_sendto_eagain->update(_st_stat_sendto_eagain); if (_srs_pps_recvfrom->r10s() || _srs_pps_recvfrom_eagain->r10s() || _srs_pps_sendto->r10s() || _srs_pps_sendto_eagain->r10s()) { snprintf(buf, sizeof(buf), ", udp=%d,%d,%d,%d", _srs_pps_recvfrom->r10s(), _srs_pps_recvfrom_eagain->r10s(), _srs_pps_sendto->r10s(), _srs_pps_sendto_eagain->r10s()); recvfrom_desc = buf; } +#endif string io_desc; +#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) _srs_pps_read->update(_st_stat_read); _srs_pps_read_eagain->update(_st_stat_read_eagain); _srs_pps_readv->update(_st_stat_readv); _srs_pps_readv_eagain->update(_st_stat_readv_eagain); _srs_pps_writev->update(_st_stat_writev); _srs_pps_writev_eagain->update(_st_stat_writev_eagain); @@ -387,8 +394,10 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t snprintf(buf, sizeof(buf), ", io=%d,%d,%d,%d,%d,%d", _srs_pps_read->r10s(), _srs_pps_read_eagain->r10s(), _srs_pps_readv->r10s(), _srs_pps_readv_eagain->r10s(), _srs_pps_writev->r10s(), _srs_pps_writev_eagain->r10s()); io_desc = buf; } +#endif string msg_desc; +#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) _srs_pps_recvmsg->update(_st_stat_recvmsg); _srs_pps_recvmsg_eagain->update(_st_stat_recvmsg_eagain); _srs_pps_sendmsg->update(_st_stat_sendmsg); _srs_pps_sendmsg_eagain->update(_st_stat_sendmsg_eagain); _srs_pps_sendmmsg->update(_st_stat_sendmmsg); _srs_pps_sendmmsg_eagain->update(_st_stat_sendmmsg_eagain); @@ -396,16 +405,20 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t snprintf(buf, sizeof(buf), ", msg=%d,%d,%d,%d,%d,%d", _srs_pps_recvmsg->r10s(), _srs_pps_recvmsg_eagain->r10s(), _srs_pps_sendmsg->r10s(), _srs_pps_sendmsg_eagain->r10s(), _srs_pps_sendmmsg->r10s(), _srs_pps_sendmmsg_eagain->r10s()); msg_desc = buf; } +#endif string epoll_desc; +#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) _srs_pps_epoll->update(_st_stat_epoll); _srs_pps_epoll_zero->update(_st_stat_epoll_zero); _srs_pps_epoll_shake->update(_st_stat_epoll_shake); _srs_pps_epoll_spin->update(_st_stat_epoll_spin); if (_srs_pps_epoll->r10s() || _srs_pps_epoll_zero->r10s() || _srs_pps_epoll_shake->r10s() || _srs_pps_epoll_spin->r10s()) { snprintf(buf, sizeof(buf), ", epoll=%d,%d,%d,%d", _srs_pps_epoll->r10s(), _srs_pps_epoll_zero->r10s(), _srs_pps_epoll_shake->r10s(), _srs_pps_epoll_spin->r10s()); epoll_desc = buf; } +#endif string sched_desc; +#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) _srs_pps_sched_160ms->update(_st_stat_sched_160ms); _srs_pps_sched_s->update(_st_stat_sched_s); _srs_pps_sched_15ms->update(_st_stat_sched_15ms); _srs_pps_sched_20ms->update(_st_stat_sched_20ms); _srs_pps_sched_25ms->update(_st_stat_sched_25ms); _srs_pps_sched_30ms->update(_st_stat_sched_30ms); @@ -415,6 +428,7 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t snprintf(buf, sizeof(buf), ", sched=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_sched_15ms->r10s(), _srs_pps_sched_20ms->r10s(), _srs_pps_sched_25ms->r10s(), _srs_pps_sched_30ms->r10s(), _srs_pps_sched_35ms->r10s(), _srs_pps_sched_40ms->r10s(), _srs_pps_sched_80ms->r10s(), _srs_pps_sched_160ms->r10s(), _srs_pps_sched_s->r10s()); sched_desc = buf; } +#endif string clock_desc; _srs_pps_clock_15ms->update(); _srs_pps_clock_20ms->update(); @@ -428,12 +442,14 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t } string thread_desc; +#if defined(SRS_DEBUG) && defined(SRS_DEBUG_STATS) _srs_pps_thread_run->update(_st_stat_thread_run); _srs_pps_thread_idle->update(_st_stat_thread_idle); _srs_pps_thread_yield->update(_st_stat_thread_yield); _srs_pps_thread_yield2->update(_st_stat_thread_yield2); if (_st_active_count > 0 || _srs_pps_thread_run->r10s() || _srs_pps_thread_idle->r10s() || _srs_pps_thread_yield->r10s() || _srs_pps_thread_yield2->r10s()) { snprintf(buf, sizeof(buf), ", co=%d,%d,%d, yield=%d,%d", _st_active_count, _srs_pps_thread_run->r10s(), _srs_pps_thread_idle->r10s(), _srs_pps_thread_yield->r10s(), _srs_pps_thread_yield2->r10s()); thread_desc = buf; } +#endif srs_trace("Hybrid cpu=%.2f%%,%dMB%s%s%s%s%s%s%s%s%s%s", u->percent * 100, memory,