From e91e0eaf46c9a77d8914402927937df50c344c16 Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 10 Feb 2021 18:20:11 +0800 Subject: [PATCH 01/28] Perf: Add stat for io of ST. --- trunk/3rdparty/st-srs/io.c | 102 ++++++++++++++++++++++++++++- trunk/src/app/srs_app_hybrid.cpp | 100 +++++++++++++++++++++++++++- trunk/src/app/srs_app_rtc_conn.cpp | 4 +- 3 files changed, 200 insertions(+), 6 deletions(-) diff --git a/trunk/3rdparty/st-srs/io.c b/trunk/3rdparty/st-srs/io.c index 7e05f99ae..244db5a62 100644 --- a/trunk/3rdparty/st-srs/io.c +++ b/trunk/3rdparty/st-srs/io.c @@ -52,6 +52,25 @@ #include #include "common.h" +// Global stat. +#ifdef DEBUG +unsigned long long _st_stat_recvfrom = 0; +unsigned long long _st_stat_recvfrom_eagain = 0; +unsigned long long _st_stat_sendto = 0; +unsigned long long _st_stat_sendto_eagain = 0; +unsigned long long _st_stat_read = 0; +unsigned long long _st_stat_read_eagain = 0; +unsigned long long _st_stat_readv = 0; +unsigned long long _st_stat_readv_eagain = 0; +unsigned long long _st_stat_writev = 0; +unsigned long long _st_stat_writev_eagain = 0; +unsigned long long _st_stat_recvmsg = 0; +unsigned long long _st_stat_recvmsg_eagain = 0; +unsigned long long _st_stat_sendmsg = 0; +unsigned long long _st_stat_sendmsg_eagain = 0; +unsigned long long _st_stat_sendmmsg = 0; +unsigned long long _st_stat_sendmmsg_eagain = 0; +#endif #if EAGAIN != EWOULDBLOCK #define _IO_NOT_READY_ERROR ((errno == EAGAIN) || (errno == EWOULDBLOCK)) @@ -437,12 +456,21 @@ int st_connect(_st_netfd_t *fd, const struct sockaddr *addr, int addrlen, st_uti ssize_t st_read(_st_netfd_t *fd, void *buf, size_t nbyte, st_utime_t timeout) { ssize_t n; + + #ifdef DEBUG + ++_st_stat_read; + #endif while ((n = read(fd->osfd, buf, nbyte)) < 0) { if (errno == EINTR) continue; if (!_IO_NOT_READY_ERROR) return -1; + + #ifdef DEBUG + ++_st_stat_read_eagain; + #endif + /* Wait until the socket becomes readable */ if (st_netfd_poll(fd, POLLIN, timeout) < 0) return -1; @@ -470,12 +498,21 @@ int st_read_resid(_st_netfd_t *fd, void *buf, size_t *resid, st_utime_t timeout) ssize_t st_readv(_st_netfd_t *fd, const struct iovec *iov, int iov_size, st_utime_t timeout) { ssize_t n; + + #ifdef DEBUG + ++_st_stat_readv; + #endif while ((n = readv(fd->osfd, iov, iov_size)) < 0) { if (errno == EINTR) continue; if (!_IO_NOT_READY_ERROR) return -1; + + #ifdef DEBUG + ++_st_stat_readv_eagain; + #endif + /* Wait until the socket becomes readable */ if (st_netfd_poll(fd, POLLIN, timeout) < 0) return -1; @@ -572,6 +609,10 @@ ssize_t st_writev(_st_netfd_t *fd, const struct iovec *iov, int iov_size, st_uti nleft = nbyte; tmp_iov = (struct iovec *) iov; /* we promise not to modify iov */ iov_cnt = iov_size; + + #ifdef DEBUG + ++_st_stat_writev; + #endif while (nleft > 0) { if (iov_cnt == 1) { @@ -616,6 +657,11 @@ ssize_t st_writev(_st_netfd_t *fd, const struct iovec *iov, int iov_size, st_uti tmp_iov[iov_cnt].iov_len = iov[index].iov_len; } } + + #ifdef DEBUG + ++_st_stat_writev_eagain; + #endif + /* Wait until the socket becomes writable */ if (st_netfd_poll(fd, POLLOUT, timeout) < 0) { rv = -1; @@ -633,6 +679,10 @@ ssize_t st_writev(_st_netfd_t *fd, const struct iovec *iov, int iov_size, st_uti int st_writev_resid(_st_netfd_t *fd, struct iovec **iov, int *iov_size, st_utime_t timeout) { ssize_t n; + + #ifdef DEBUG + ++_st_stat_writev; + #endif while (*iov_size > 0) { if (*iov_size == 1) @@ -659,6 +709,11 @@ int st_writev_resid(_st_netfd_t *fd, struct iovec **iov, int *iov_size, st_utime (*iov)->iov_base = (char *) (*iov)->iov_base + n; (*iov)->iov_len -= n; } + + #ifdef DEBUG + ++_st_stat_writev_eagain; + #endif + /* Wait until the socket becomes writable */ if (st_netfd_poll(fd, POLLOUT, timeout) < 0) return -1; @@ -674,12 +729,21 @@ int st_writev_resid(_st_netfd_t *fd, struct iovec **iov, int *iov_size, st_utime int st_recvfrom(_st_netfd_t *fd, void *buf, int len, struct sockaddr *from, int *fromlen, st_utime_t timeout) { int n; - + + #ifdef DEBUG + ++_st_stat_recvfrom; + #endif + while ((n = recvfrom(fd->osfd, buf, len, 0, from, (socklen_t *)fromlen)) < 0) { if (errno == EINTR) continue; if (!_IO_NOT_READY_ERROR) return -1; + + #ifdef DEBUG + ++_st_stat_recvfrom_eagain; + #endif + /* Wait until the socket becomes readable */ if (st_netfd_poll(fd, POLLIN, timeout) < 0) return -1; @@ -692,12 +756,21 @@ int st_recvfrom(_st_netfd_t *fd, void *buf, int len, struct sockaddr *from, int int st_sendto(_st_netfd_t *fd, const void *msg, int len, const struct sockaddr *to, int tolen, st_utime_t timeout) { int n; + + #ifdef DEBUG + ++_st_stat_sendto; + #endif while ((n = sendto(fd->osfd, msg, len, 0, to, tolen)) < 0) { if (errno == EINTR) continue; if (!_IO_NOT_READY_ERROR) return -1; + + #ifdef DEBUG + ++_st_stat_sendto_eagain; + #endif + /* Wait until the socket becomes writable */ if (st_netfd_poll(fd, POLLOUT, timeout) < 0) return -1; @@ -710,12 +783,21 @@ int st_sendto(_st_netfd_t *fd, const void *msg, int len, const struct sockaddr * int st_recvmsg(_st_netfd_t *fd, struct msghdr *msg, int flags, st_utime_t timeout) { int n; + + #ifdef DEBUG + ++_st_stat_recvmsg; + #endif while ((n = recvmsg(fd->osfd, msg, flags)) < 0) { if (errno == EINTR) continue; if (!_IO_NOT_READY_ERROR) return -1; + + #ifdef DEBUG + ++_st_stat_recvmsg_eagain; + #endif + /* Wait until the socket becomes readable */ if (st_netfd_poll(fd, POLLIN, timeout) < 0) return -1; @@ -728,12 +810,21 @@ int st_recvmsg(_st_netfd_t *fd, struct msghdr *msg, int flags, st_utime_t timeou int st_sendmsg(_st_netfd_t *fd, const struct msghdr *msg, int flags, st_utime_t timeout) { int n; + + #ifdef DEBUG + ++_st_stat_sendmsg; + #endif while ((n = sendmsg(fd->osfd, msg, flags)) < 0) { if (errno == EINTR) continue; if (!_IO_NOT_READY_ERROR) return -1; + + #ifdef DEBUG + ++_st_stat_sendmsg_eagain; + #endif + /* Wait until the socket becomes writable */ if (st_netfd_poll(fd, POLLOUT, timeout) < 0) return -1; @@ -749,6 +840,10 @@ int st_sendmmsg(st_netfd_t fd, struct st_mmsghdr *msgvec, unsigned int vlen, int int left; struct mmsghdr *p; + #ifdef DEBUG + ++_st_stat_sendmmsg; + #endif + left = (int)vlen; while (left > 0) { p = (struct mmsghdr*)msgvec + (vlen - left); @@ -758,6 +853,11 @@ int st_sendmmsg(st_netfd_t fd, struct st_mmsghdr *msgvec, unsigned int vlen, int continue; if (!_IO_NOT_READY_ERROR) break; + + #ifdef DEBUG + ++_st_stat_sendmmsg_eagain; + #endif + /* Wait until the socket becomes writable */ if (st_netfd_poll(fd, POLLOUT, timeout) < 0) break; diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 8f7300215..184ff7378 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -39,6 +39,41 @@ extern SrsPps* _srs_pps_pub; extern SrsPps* _srs_pps_conn; extern SrsPps* _srs_pps_dispose; +extern unsigned long long _st_stat_recvfrom; +extern unsigned long long _st_stat_recvfrom_eagain; +extern unsigned long long _st_stat_sendto; +extern unsigned long long _st_stat_sendto_eagain; +SrsPps* _srs_pps_recvfrom = new SrsPps(_srs_clock); +SrsPps* _srs_pps_recvfrom_eagain = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sendto = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sendto_eagain = new SrsPps(_srs_clock); + +extern unsigned long long _st_stat_read; +extern unsigned long long _st_stat_read_eagain; +extern unsigned long long _st_stat_readv; +extern unsigned long long _st_stat_readv_eagain; +extern unsigned long long _st_stat_writev; +extern unsigned long long _st_stat_writev_eagain; +SrsPps* _srs_pps_read = new SrsPps(_srs_clock); +SrsPps* _srs_pps_read_eagain = new SrsPps(_srs_clock); +SrsPps* _srs_pps_readv = new SrsPps(_srs_clock); +SrsPps* _srs_pps_readv_eagain = new SrsPps(_srs_clock); +SrsPps* _srs_pps_writev = new SrsPps(_srs_clock); +SrsPps* _srs_pps_writev_eagain = new SrsPps(_srs_clock); + +extern unsigned long long _st_stat_recvmsg; +extern unsigned long long _st_stat_recvmsg_eagain; +extern unsigned long long _st_stat_sendmsg; +extern unsigned long long _st_stat_sendmsg_eagain; +extern unsigned long long _st_stat_sendmmsg; +extern unsigned long long _st_stat_sendmmsg_eagain; +SrsPps* _srs_pps_recvmsg = new SrsPps(_srs_clock); +SrsPps* _srs_pps_recvmsg_eagain = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sendmsg = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sendmsg_eagain = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sendmmsg = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sendmmsg_eagain = new SrsPps(_srs_clock); + ISrsHybridServer::ISrsHybridServer() { } @@ -225,11 +260,70 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t // Resident Set Size: number of pages the process has in real memory. int memory = (int)(u->rss * 4 / 1024); - _srs_pps_timer->update(); _srs_pps_pub->update(); _srs_pps_conn->update(); + static char buf[128]; - srs_trace("Hybrid cpu=%.2f%%,%dMB, timer=%d,%d,%d", + string cid_desc; + _srs_pps_cids_get->update(); _srs_pps_cids_set->update(); + if (_srs_pps_cids_get->r10s() || _srs_pps_cids_set->r10s()) { + snprintf(buf, sizeof(buf), ", cid=%d,%d", _srs_pps_cids_get->r10s(), _srs_pps_cids_set->r10s()); + cid_desc = buf; + } + + string timer_desc; + _srs_pps_timer->update(); _srs_pps_pub->update(); _srs_pps_conn->update(); + if (_srs_pps_timer->r10s() || _srs_pps_pub->r10s() || _srs_pps_conn->r10s()) { + snprintf(buf, sizeof(buf), ", timer=%d,%d,%d", _srs_pps_timer->r10s(), _srs_pps_pub->r10s(), _srs_pps_conn->r10s()); + timer_desc = buf; + } + + string free_desc; + _srs_pps_dispose->update(); + if (_srs_pps_dispose->r10s()) { + snprintf(buf, sizeof(buf), ", free=%d", _srs_pps_dispose->r10s()); + free_desc = buf; + } + + string recvfrom_desc; + _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; + } + + string io_desc; + _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); + if (_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()) { + 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; + } + + string msg_desc; + _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); + if (_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()) { + 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; + } + + srs_trace("Hybrid cpu=%.2f%%,%dMB%s%s%s%s%s%s", u->percent * 100, memory, - _srs_pps_timer->r10s(), _srs_pps_pub->r10s(), _srs_pps_conn->r10s() + cid_desc.c_str(), timer_desc.c_str(), free_desc.c_str(), + recvfrom_desc.c_str(), io_desc.c_str(), msg_desc.c_str() ); return err; diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 4a7558b72..f08d29684 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1282,8 +1282,8 @@ srs_error_t SrsRtcPublishStream::send_periodic_twcc() if (last_time_send_twcc_) { uint32_t nn = 0; srs_utime_t duration = srs_duration(last_time_send_twcc_, srs_get_system_time()); - if (duration > 80 * SRS_UTIME_MILLISECONDS && twcc_epp_->can_print(0, &nn)) { - srs_warn2(TAG_LARGE_TIMER, "send_twcc interval exceeded %dms > 80ms, count=%u/%u", + if (duration > 100 * SRS_UTIME_MILLISECONDS && twcc_epp_->can_print(0, &nn)) { + srs_warn2(TAG_LARGE_TIMER, "twcc delay %dms > 100ms, count=%u/%u", srsu2msi(duration), nn, twcc_epp_->nn_count); } } From 70fb647ac97e151a9ebde7a1469cf170121c4768 Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 10 Feb 2021 20:00:33 +0800 Subject: [PATCH 02/28] Perf: Add stat for sched of ST. --- trunk/3rdparty/st-srs/event.c | 32 ++++++++++++++- trunk/3rdparty/st-srs/sched.c | 35 ++++++++++++++++ trunk/src/app/srs_app_hybrid.cpp | 69 ++++++++++++++++++++++++-------- 3 files changed, 118 insertions(+), 18 deletions(-) diff --git a/trunk/3rdparty/st-srs/event.c b/trunk/3rdparty/st-srs/event.c index 5b640c104..82354e174 100644 --- a/trunk/3rdparty/st-srs/event.c +++ b/trunk/3rdparty/st-srs/event.c @@ -47,6 +47,14 @@ #include #endif +// Global stat. +#ifdef DEBUG +unsigned long long _st_stat_epoll = 0; +unsigned long long _st_stat_epoll_zero = 0; +unsigned long long _st_stat_epoll_shake = 0; +unsigned long long _st_stat_epoll_spin = 0; +#endif + #if defined(USE_POLL) && !defined(MD_HAVE_POLL) /* Force poll usage if explicitly asked for it */ #define MD_HAVE_POLL @@ -1205,6 +1213,10 @@ ST_HIDDEN void _st_epoll_dispatch(void) int events, op; short revents; + #ifdef DEBUG + ++_st_stat_epoll; + #endif + if (_ST_SLEEPQ == NULL) { timeout = -1; } else { @@ -1212,8 +1224,18 @@ ST_HIDDEN void _st_epoll_dispatch(void) timeout = (int) (min_timeout / 1000); // At least wait 1ms when <1ms, to avoid epoll_wait spin loop. - if (min_timeout > 0 && timeout == 0) { - timeout = 1; + if (timeout == 0) { + #ifdef DEBUG + ++_st_stat_epoll_zero; + #endif + + if (min_timeout > 0) { + #ifdef DEBUG + ++_st_stat_epoll_shake; + #endif + + timeout = 1; + } } } @@ -1240,6 +1262,12 @@ 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 (nfd <= 0) { + ++_st_stat_epoll_spin; + } + #endif + if (nfd > 0) { for (i = 0; i < nfd; i++) { osfd = _st_epoll_data->evtlist[i].data.fd; diff --git a/trunk/3rdparty/st-srs/sched.c b/trunk/3rdparty/st-srs/sched.c index 87515827e..58bc5b911 100644 --- a/trunk/3rdparty/st-srs/sched.c +++ b/trunk/3rdparty/st-srs/sched.c @@ -52,6 +52,19 @@ #include #endif +// Global stat. +#ifdef DEBUG +unsigned long long _st_stat_clock_us = 0; +unsigned long long _st_stat_clock_10ms = 0; +unsigned long long _st_stat_clock_20ms = 0; +unsigned long long _st_stat_clock_40ms = 0; +unsigned long long _st_stat_clock_80ms = 0; +unsigned long long _st_stat_clock_160ms = 0; +unsigned long long _st_stat_clock_320ms = 0; +unsigned long long _st_stat_clock_1000ms = 0; +unsigned long long _st_stat_clock_s = 0; +#endif + /* Global data */ _st_vp_t _st_this_vp; /* This VP */ @@ -482,6 +495,28 @@ void _st_vp_check_clock(void) now = st_utime(); elapsed = now - _ST_LAST_CLOCK; _ST_LAST_CLOCK = now; + + #ifdef DEBUG + if (elapsed < 1000) { + ++_st_stat_clock_us; + } else if (elapsed < 10000) { + ++_st_stat_clock_10ms; + } else if (elapsed < 20000) { + ++_st_stat_clock_20ms; + } else if (elapsed < 40000) { + ++_st_stat_clock_40ms; + } else if (elapsed < 80000) { + ++_st_stat_clock_80ms; + } else if (elapsed < 160000) { + ++_st_stat_clock_160ms; + } else if (elapsed < 320000) { + ++_st_stat_clock_320ms; + } else if (elapsed < 1000000) { + ++_st_stat_clock_1000ms; + } else { + ++_st_stat_clock_s; + } + #endif if (_st_curr_time && now - _st_last_tset > 999000) { _st_curr_time = time(NULL); diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 184ff7378..8cb549dc8 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -74,6 +74,34 @@ SrsPps* _srs_pps_sendmsg_eagain = new SrsPps(_srs_clock); SrsPps* _srs_pps_sendmmsg = new SrsPps(_srs_clock); SrsPps* _srs_pps_sendmmsg_eagain = new SrsPps(_srs_clock); +extern unsigned long long _st_stat_epoll; +extern unsigned long long _st_stat_epoll_zero; +extern unsigned long long _st_stat_epoll_shake; +extern unsigned long long _st_stat_epoll_spin; +SrsPps* _srs_pps_epoll = new SrsPps(_srs_clock); +SrsPps* _srs_pps_epoll_zero = new SrsPps(_srs_clock); +SrsPps* _srs_pps_epoll_shake = new SrsPps(_srs_clock); +SrsPps* _srs_pps_epoll_spin = new SrsPps(_srs_clock); + +extern unsigned long long _st_stat_clock_us; +extern unsigned long long _st_stat_clock_10ms; +extern unsigned long long _st_stat_clock_20ms; +extern unsigned long long _st_stat_clock_40ms; +extern unsigned long long _st_stat_clock_80ms; +extern unsigned long long _st_stat_clock_160ms; +extern unsigned long long _st_stat_clock_320ms; +extern unsigned long long _st_stat_clock_1000ms; +extern unsigned long long _st_stat_clock_s; +SrsPps* _srs_pps_clock_us = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_10ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_20ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_40ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_80ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_160ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_320ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_1000ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_s = new SrsPps(_srs_clock); + ISrsHybridServer::ISrsHybridServer() { } @@ -287,10 +315,7 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t _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() - ); + 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; } @@ -299,11 +324,7 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t _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); if (_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()) { - 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() - ); + 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; } @@ -312,18 +333,34 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t _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); if (_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()) { - 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() - ); + 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; } - srs_trace("Hybrid cpu=%.2f%%,%dMB%s%s%s%s%s%s", + string epoll_desc; + _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; + } + + string clock_desc; + _srs_pps_clock_us->update(_st_stat_clock_us); _srs_pps_clock_s->update(_st_stat_clock_s); + _srs_pps_clock_10ms->update(_st_stat_clock_10ms); _srs_pps_clock_20ms->update(_st_stat_clock_20ms); + _srs_pps_clock_40ms->update(_st_stat_clock_40ms); _srs_pps_clock_80ms->update(_st_stat_clock_80ms); + _srs_pps_clock_160ms->update(_st_stat_clock_160ms); _srs_pps_clock_320ms->update(_st_stat_clock_320ms); + _srs_pps_clock_1000ms->update(_st_stat_clock_1000ms); + if (_srs_pps_clock_us->r10s() || _srs_pps_clock_s->r10s() || _srs_pps_clock_10ms->r10s() || _srs_pps_clock_20ms->r10s() || _srs_pps_clock_40ms->r10s() || _srs_pps_clock_80ms->r10s() || _srs_pps_clock_160ms->r10s() || _srs_pps_clock_320ms->r10s() || _srs_pps_clock_1000ms->r10s()) { + snprintf(buf, sizeof(buf), ", clock=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_clock_us->r10s(), _srs_pps_clock_10ms->r10s(), _srs_pps_clock_20ms->r10s(), _srs_pps_clock_40ms->r10s(), _srs_pps_clock_80ms->r10s(), _srs_pps_clock_160ms->r10s(), _srs_pps_clock_320ms->r10s(), _srs_pps_clock_1000ms->r10s(), _srs_pps_clock_s->r10s()); + clock_desc = buf; + } + + srs_trace("Hybrid cpu=%.2f%%,%dMB%s%s%s%s%s%s%s%s", u->percent * 100, memory, cid_desc.c_str(), timer_desc.c_str(), free_desc.c_str(), - recvfrom_desc.c_str(), io_desc.c_str(), msg_desc.c_str() + recvfrom_desc.c_str(), io_desc.c_str(), msg_desc.c_str(), + epoll_desc.c_str(), clock_desc.c_str() ); return err; From bddc787a164cfbf8e93b78639d301d9ea2e9098f Mon Sep 17 00:00:00 2001 From: winlin Date: Wed, 10 Feb 2021 21:20:49 +0800 Subject: [PATCH 03/28] Refine the pps. --- trunk/src/protocol/srs_protocol_kbps.cpp | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/trunk/src/protocol/srs_protocol_kbps.cpp b/trunk/src/protocol/srs_protocol_kbps.cpp index 712e684ad..2ae0f11aa 100644 --- a/trunk/src/protocol/srs_protocol_kbps.cpp +++ b/trunk/src/protocol/srs_protocol_kbps.cpp @@ -43,6 +43,15 @@ SrsRateSample* SrsRateSample::update(int64_t nn, srs_utime_t t, int k) return this; } +void srs_pps_update(SrsRateSample& sample, int64_t nn, srs_utime_t now) +{ + int pps = (int)((nn - sample.total) * 1000 / srsu2ms(now - sample.time)); + if (pps == 0 && nn > sample.total) { + pps = 1; // For pps in (0, 1), we set to 1. + } + sample.update(nn, now, pps); +} + SrsPps::SrsPps(SrsWallClock* c) { clk_ = c; @@ -76,24 +85,19 @@ void SrsPps::update(int64_t nn) } if (now - sample_10s_.time >= 10 * SRS_UTIME_SECONDS) { - int kps = (int)((nn - sample_10s_.total) * 1000 / srsu2ms(now - sample_10s_.time)); - sample_10s_.update(nn, now, kps); + srs_pps_update(sample_10s_, nn, now); } if (now - sample_30s_.time >= 30 * SRS_UTIME_SECONDS) { - int kps = (int)((nn - sample_30s_.total) * 1000 / srsu2ms(now - sample_30s_.time)); - sample_30s_.update(nn, now, kps); + srs_pps_update(sample_30s_, nn, now); } if (now - sample_1m_.time >= 60 * SRS_UTIME_SECONDS) { - int kps = (int)((nn - sample_1m_.total) * 1000 / srsu2ms(now - sample_1m_.time)); - sample_1m_.update(nn, now, kps); + srs_pps_update(sample_1m_, nn, now); } if (now - sample_5m_.time >= 300 * SRS_UTIME_SECONDS) { - int kps = (int)((nn - sample_5m_.total) * 1000 / srsu2ms(now - sample_5m_.time)); - sample_5m_.update(nn, now, kps); + srs_pps_update(sample_5m_, nn, now); } if (now - sample_60m_.time >= 3600 * SRS_UTIME_SECONDS) { - int kps = (int)((nn - sample_60m_.total) * 1000 / srsu2ms(now - sample_60m_.time)); - sample_60m_.update(nn, now, kps); + srs_pps_update(sample_60m_, nn, now); } } From c2332f9e55795e7bb664170c769a6e779f656afb Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 09:15:05 +0800 Subject: [PATCH 04/28] Core: Use 20ms wall clock --- trunk/src/app/srs_app_hybrid.cpp | 76 +++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 8cb549dc8..4d2bc4ea4 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -102,6 +102,16 @@ SrsPps* _srs_pps_clock_320ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_1000ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_s = new SrsPps(_srs_clock); +SrsPps* _srs_pps_timer_us = new SrsPps(_srs_clock); +SrsPps* _srs_pps_timer_10ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_timer_20ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_timer_40ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_timer_80ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_timer_160ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_timer_320ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_timer_1000ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_timer_s = new SrsPps(_srs_clock); + ISrsHybridServer::ISrsHybridServer() { } @@ -266,9 +276,14 @@ srs_error_t SrsHybridServer::setup_ticks() { srs_error_t err = srs_success; - timer_ = new SrsHourGlass("hybrid", this, 1 * SRS_UTIME_SECONDS); + // Start timer for system global works. + timer_ = new SrsHourGlass("hybrid", this, 20 * SRS_UTIME_MILLISECONDS); - if ((err = timer_->tick(1, 5 * SRS_UTIME_SECONDS)) != srs_success) { + if ((err = timer_->tick(1, 20 * SRS_UTIME_MILLISECONDS)) != srs_success) { + return srs_error_wrap(err, "tick"); + } + + if ((err = timer_->tick(2, 5 * SRS_UTIME_SECONDS)) != srs_success) { return srs_error_wrap(err, "tick"); } @@ -283,6 +298,41 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t { srs_error_t err = srs_success; + // Update system wall clock. + if (event == 1) { + static srs_utime_t clock = 0; + + srs_utime_t now = srs_update_system_time(); + if (!clock) { + clock = now; + return err; + } + + srs_utime_t elapsed = now - clock; + clock = now; + + if (elapsed < 1 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_timer_us->sugar; + } else if (elapsed < 10 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_timer_10ms->sugar; + } else if (elapsed < 20 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_timer_20ms->sugar; + } else if (elapsed < 40 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_timer_40ms->sugar; + } else if (elapsed < 80 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_timer_80ms->sugar; + } else if (elapsed < 160 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_timer_160ms->sugar; + } else if (elapsed < 320 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_timer_320ms->sugar; + } else if (elapsed < 1 * SRS_UTIME_SECONDS) { + ++_srs_pps_timer_1000ms->sugar; + } else { + ++_srs_pps_timer_s->sugar; + } + return err; + } + // Show statistics for RTC server. SrsProcSelfStat* u = srs_get_self_proc_stat(); // Resident Set Size: number of pages the process has in real memory. @@ -345,22 +395,34 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t epoll_desc = buf; } - string clock_desc; + string sched_desc; _srs_pps_clock_us->update(_st_stat_clock_us); _srs_pps_clock_s->update(_st_stat_clock_s); _srs_pps_clock_10ms->update(_st_stat_clock_10ms); _srs_pps_clock_20ms->update(_st_stat_clock_20ms); _srs_pps_clock_40ms->update(_st_stat_clock_40ms); _srs_pps_clock_80ms->update(_st_stat_clock_80ms); _srs_pps_clock_160ms->update(_st_stat_clock_160ms); _srs_pps_clock_320ms->update(_st_stat_clock_320ms); _srs_pps_clock_1000ms->update(_st_stat_clock_1000ms); if (_srs_pps_clock_us->r10s() || _srs_pps_clock_s->r10s() || _srs_pps_clock_10ms->r10s() || _srs_pps_clock_20ms->r10s() || _srs_pps_clock_40ms->r10s() || _srs_pps_clock_80ms->r10s() || _srs_pps_clock_160ms->r10s() || _srs_pps_clock_320ms->r10s() || _srs_pps_clock_1000ms->r10s()) { - snprintf(buf, sizeof(buf), ", clock=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_clock_us->r10s(), _srs_pps_clock_10ms->r10s(), _srs_pps_clock_20ms->r10s(), _srs_pps_clock_40ms->r10s(), _srs_pps_clock_80ms->r10s(), _srs_pps_clock_160ms->r10s(), _srs_pps_clock_320ms->r10s(), _srs_pps_clock_1000ms->r10s(), _srs_pps_clock_s->r10s()); + snprintf(buf, sizeof(buf), ", sched=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_clock_us->r10s(), _srs_pps_clock_10ms->r10s(), _srs_pps_clock_20ms->r10s(), _srs_pps_clock_40ms->r10s(), _srs_pps_clock_80ms->r10s(), _srs_pps_clock_160ms->r10s(), _srs_pps_clock_320ms->r10s(), _srs_pps_clock_1000ms->r10s(), _srs_pps_clock_s->r10s()); + sched_desc = buf; + } + + string clock_desc; + _srs_pps_timer_us->update(); _srs_pps_timer_10ms->update(); + _srs_pps_timer_20ms->update(); _srs_pps_timer_40ms->update(); + _srs_pps_timer_80ms->update(); _srs_pps_timer_160ms->update(); + _srs_pps_timer_320ms->update(); _srs_pps_timer_1000ms->update(); + _srs_pps_timer_s->update(); + if (_srs_pps_timer_us->r10s() || _srs_pps_timer_s->r10s() || _srs_pps_timer_10ms->r10s() || _srs_pps_timer_20ms->r10s() || _srs_pps_timer_40ms->r10s() || _srs_pps_timer_80ms->r10s() || _srs_pps_timer_160ms->r10s() || _srs_pps_timer_320ms->r10s() || _srs_pps_timer_1000ms->r10s()) { + snprintf(buf, sizeof(buf), ", clock=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_timer_us->r10s(), _srs_pps_timer_10ms->r10s(), _srs_pps_timer_20ms->r10s(), _srs_pps_timer_40ms->r10s(), _srs_pps_timer_80ms->r10s(), _srs_pps_timer_160ms->r10s(), _srs_pps_timer_320ms->r10s(), _srs_pps_timer_1000ms->r10s(), _srs_pps_timer_s->r10s()); clock_desc = buf; } - srs_trace("Hybrid cpu=%.2f%%,%dMB%s%s%s%s%s%s%s%s", + srs_trace("Hybrid cpu=%.2f%%,%dMB%s%s%s%s%s%s%s%s%s", u->percent * 100, memory, - cid_desc.c_str(), timer_desc.c_str(), free_desc.c_str(), + cid_desc.c_str(), timer_desc.c_str(), recvfrom_desc.c_str(), io_desc.c_str(), msg_desc.c_str(), - epoll_desc.c_str(), clock_desc.c_str() + epoll_desc.c_str(), sched_desc.c_str(), clock_desc.c_str(), + free_desc.c_str() ); return err; From 12d7e57011973748fa5d2ea4cb40a1661db8d7de Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 09:39:09 +0800 Subject: [PATCH 05/28] Core: Refine sched and clock stat --- trunk/3rdparty/st-srs/sched.c | 36 ++++++------- trunk/src/app/srs_app_hybrid.cpp | 90 ++++++++++++++++---------------- 2 files changed, 63 insertions(+), 63 deletions(-) diff --git a/trunk/3rdparty/st-srs/sched.c b/trunk/3rdparty/st-srs/sched.c index 58bc5b911..166e1dd4b 100644 --- a/trunk/3rdparty/st-srs/sched.c +++ b/trunk/3rdparty/st-srs/sched.c @@ -54,15 +54,15 @@ // Global stat. #ifdef DEBUG -unsigned long long _st_stat_clock_us = 0; -unsigned long long _st_stat_clock_10ms = 0; -unsigned long long _st_stat_clock_20ms = 0; -unsigned long long _st_stat_clock_40ms = 0; -unsigned long long _st_stat_clock_80ms = 0; -unsigned long long _st_stat_clock_160ms = 0; -unsigned long long _st_stat_clock_320ms = 0; -unsigned long long _st_stat_clock_1000ms = 0; -unsigned long long _st_stat_clock_s = 0; +unsigned long long _st_stat_sched_us = 0; +unsigned long long _st_stat_sched_10ms = 0; +unsigned long long _st_stat_sched_20ms = 0; +unsigned long long _st_stat_sched_40ms = 0; +unsigned long long _st_stat_sched_80ms = 0; +unsigned long long _st_stat_sched_160ms = 0; +unsigned long long _st_stat_sched_320ms = 0; +unsigned long long _st_stat_sched_1000ms = 0; +unsigned long long _st_stat_sched_s = 0; #endif @@ -498,23 +498,23 @@ void _st_vp_check_clock(void) #ifdef DEBUG if (elapsed < 1000) { - ++_st_stat_clock_us; + ++_st_stat_sched_us; } else if (elapsed < 10000) { - ++_st_stat_clock_10ms; + ++_st_stat_sched_10ms; } else if (elapsed < 20000) { - ++_st_stat_clock_20ms; + ++_st_stat_sched_20ms; } else if (elapsed < 40000) { - ++_st_stat_clock_40ms; + ++_st_stat_sched_40ms; } else if (elapsed < 80000) { - ++_st_stat_clock_80ms; + ++_st_stat_sched_80ms; } else if (elapsed < 160000) { - ++_st_stat_clock_160ms; + ++_st_stat_sched_160ms; } else if (elapsed < 320000) { - ++_st_stat_clock_320ms; + ++_st_stat_sched_320ms; } else if (elapsed < 1000000) { - ++_st_stat_clock_1000ms; + ++_st_stat_sched_1000ms; } else { - ++_st_stat_clock_s; + ++_st_stat_sched_s; } #endif diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 4d2bc4ea4..d370d5e21 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -83,33 +83,33 @@ SrsPps* _srs_pps_epoll_zero = new SrsPps(_srs_clock); SrsPps* _srs_pps_epoll_shake = new SrsPps(_srs_clock); SrsPps* _srs_pps_epoll_spin = new SrsPps(_srs_clock); -extern unsigned long long _st_stat_clock_us; -extern unsigned long long _st_stat_clock_10ms; -extern unsigned long long _st_stat_clock_20ms; -extern unsigned long long _st_stat_clock_40ms; -extern unsigned long long _st_stat_clock_80ms; -extern unsigned long long _st_stat_clock_160ms; -extern unsigned long long _st_stat_clock_320ms; -extern unsigned long long _st_stat_clock_1000ms; -extern unsigned long long _st_stat_clock_s; -SrsPps* _srs_pps_clock_us = new SrsPps(_srs_clock); +extern unsigned long long _st_stat_sched_us; +extern unsigned long long _st_stat_sched_10ms; +extern unsigned long long _st_stat_sched_20ms; +extern unsigned long long _st_stat_sched_40ms; +extern unsigned long long _st_stat_sched_80ms; +extern unsigned long long _st_stat_sched_160ms; +extern unsigned long long _st_stat_sched_320ms; +extern unsigned long long _st_stat_sched_1000ms; +extern unsigned long long _st_stat_sched_s; +SrsPps* _srs_pps_sched_us = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sched_10ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sched_20ms = new SrsPps(_srs_clock); +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_320ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sched_1000ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sched_s = new SrsPps(_srs_clock); + +SrsPps* _srs_pps_clock_s = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_10ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_20ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_30ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_40ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_80ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_160ms = new SrsPps(_srs_clock); -SrsPps* _srs_pps_clock_320ms = new SrsPps(_srs_clock); -SrsPps* _srs_pps_clock_1000ms = new SrsPps(_srs_clock); -SrsPps* _srs_pps_clock_s = new SrsPps(_srs_clock); - -SrsPps* _srs_pps_timer_us = new SrsPps(_srs_clock); -SrsPps* _srs_pps_timer_10ms = new SrsPps(_srs_clock); -SrsPps* _srs_pps_timer_20ms = new SrsPps(_srs_clock); -SrsPps* _srs_pps_timer_40ms = new SrsPps(_srs_clock); -SrsPps* _srs_pps_timer_80ms = new SrsPps(_srs_clock); -SrsPps* _srs_pps_timer_160ms = new SrsPps(_srs_clock); -SrsPps* _srs_pps_timer_320ms = new SrsPps(_srs_clock); -SrsPps* _srs_pps_timer_1000ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_500ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_timer_s = new SrsPps(_srs_clock); ISrsHybridServer::ISrsHybridServer() @@ -312,21 +312,21 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t clock = now; if (elapsed < 1 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_timer_us->sugar; + ++_srs_pps_clock_s->sugar; } else if (elapsed < 10 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_timer_10ms->sugar; + ++_srs_pps_clock_10ms->sugar; } else if (elapsed < 20 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_timer_20ms->sugar; + ++_srs_pps_clock_20ms->sugar; + } else if (elapsed < 30 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_30ms->sugar; } else if (elapsed < 40 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_timer_40ms->sugar; + ++_srs_pps_clock_40ms->sugar; } else if (elapsed < 80 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_timer_80ms->sugar; + ++_srs_pps_clock_80ms->sugar; } else if (elapsed < 160 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_timer_160ms->sugar; - } else if (elapsed < 320 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_timer_320ms->sugar; - } else if (elapsed < 1 * SRS_UTIME_SECONDS) { - ++_srs_pps_timer_1000ms->sugar; + ++_srs_pps_clock_160ms->sugar; + } else if (elapsed < 500 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_500ms->sugar; } else { ++_srs_pps_timer_s->sugar; } @@ -396,24 +396,24 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t } string sched_desc; - _srs_pps_clock_us->update(_st_stat_clock_us); _srs_pps_clock_s->update(_st_stat_clock_s); - _srs_pps_clock_10ms->update(_st_stat_clock_10ms); _srs_pps_clock_20ms->update(_st_stat_clock_20ms); - _srs_pps_clock_40ms->update(_st_stat_clock_40ms); _srs_pps_clock_80ms->update(_st_stat_clock_80ms); - _srs_pps_clock_160ms->update(_st_stat_clock_160ms); _srs_pps_clock_320ms->update(_st_stat_clock_320ms); - _srs_pps_clock_1000ms->update(_st_stat_clock_1000ms); - if (_srs_pps_clock_us->r10s() || _srs_pps_clock_s->r10s() || _srs_pps_clock_10ms->r10s() || _srs_pps_clock_20ms->r10s() || _srs_pps_clock_40ms->r10s() || _srs_pps_clock_80ms->r10s() || _srs_pps_clock_160ms->r10s() || _srs_pps_clock_320ms->r10s() || _srs_pps_clock_1000ms->r10s()) { - snprintf(buf, sizeof(buf), ", sched=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_clock_us->r10s(), _srs_pps_clock_10ms->r10s(), _srs_pps_clock_20ms->r10s(), _srs_pps_clock_40ms->r10s(), _srs_pps_clock_80ms->r10s(), _srs_pps_clock_160ms->r10s(), _srs_pps_clock_320ms->r10s(), _srs_pps_clock_1000ms->r10s(), _srs_pps_clock_s->r10s()); + _srs_pps_sched_us->update(_st_stat_sched_us); _srs_pps_sched_s->update(_st_stat_sched_s); + _srs_pps_sched_10ms->update(_st_stat_sched_10ms); _srs_pps_sched_20ms->update(_st_stat_sched_20ms); + _srs_pps_sched_40ms->update(_st_stat_sched_40ms); _srs_pps_sched_80ms->update(_st_stat_sched_80ms); + _srs_pps_sched_160ms->update(_st_stat_sched_160ms); _srs_pps_sched_320ms->update(_st_stat_sched_320ms); + _srs_pps_sched_1000ms->update(_st_stat_sched_1000ms); + if (_srs_pps_sched_us->r10s() || _srs_pps_sched_s->r10s() || _srs_pps_sched_10ms->r10s() || _srs_pps_sched_20ms->r10s() || _srs_pps_sched_40ms->r10s() || _srs_pps_sched_80ms->r10s() || _srs_pps_sched_160ms->r10s() || _srs_pps_sched_320ms->r10s() || _srs_pps_sched_1000ms->r10s()) { + snprintf(buf, sizeof(buf), ", sched=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_sched_us->r10s(), _srs_pps_sched_10ms->r10s(), _srs_pps_sched_20ms->r10s(), _srs_pps_sched_40ms->r10s(), _srs_pps_sched_80ms->r10s(), _srs_pps_sched_160ms->r10s(), _srs_pps_sched_320ms->r10s(), _srs_pps_sched_1000ms->r10s(), _srs_pps_sched_s->r10s()); sched_desc = buf; } string clock_desc; - _srs_pps_timer_us->update(); _srs_pps_timer_10ms->update(); - _srs_pps_timer_20ms->update(); _srs_pps_timer_40ms->update(); - _srs_pps_timer_80ms->update(); _srs_pps_timer_160ms->update(); - _srs_pps_timer_320ms->update(); _srs_pps_timer_1000ms->update(); + _srs_pps_clock_s->update(); _srs_pps_clock_10ms->update(); + _srs_pps_clock_20ms->update(); _srs_pps_clock_30ms->update(); + _srs_pps_clock_40ms->update(); _srs_pps_clock_80ms->update(); + _srs_pps_clock_160ms->update(); _srs_pps_clock_500ms->update(); _srs_pps_timer_s->update(); - if (_srs_pps_timer_us->r10s() || _srs_pps_timer_s->r10s() || _srs_pps_timer_10ms->r10s() || _srs_pps_timer_20ms->r10s() || _srs_pps_timer_40ms->r10s() || _srs_pps_timer_80ms->r10s() || _srs_pps_timer_160ms->r10s() || _srs_pps_timer_320ms->r10s() || _srs_pps_timer_1000ms->r10s()) { - snprintf(buf, sizeof(buf), ", clock=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_timer_us->r10s(), _srs_pps_timer_10ms->r10s(), _srs_pps_timer_20ms->r10s(), _srs_pps_timer_40ms->r10s(), _srs_pps_timer_80ms->r10s(), _srs_pps_timer_160ms->r10s(), _srs_pps_timer_320ms->r10s(), _srs_pps_timer_1000ms->r10s(), _srs_pps_timer_s->r10s()); + if (_srs_pps_clock_s->r10s() || _srs_pps_timer_s->r10s() || _srs_pps_clock_10ms->r10s() || _srs_pps_clock_20ms->r10s() || _srs_pps_clock_30ms->r10s() || _srs_pps_clock_40ms->r10s() || _srs_pps_clock_80ms->r10s() || _srs_pps_clock_160ms->r10s() || _srs_pps_clock_500ms->r10s()) { + snprintf(buf, sizeof(buf), ", clock=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_clock_s->r10s(), _srs_pps_clock_10ms->r10s(), _srs_pps_clock_20ms->r10s(), _srs_pps_clock_30ms->r10s(), _srs_pps_clock_40ms->r10s(), _srs_pps_clock_80ms->r10s(), _srs_pps_clock_160ms->r10s(), _srs_pps_clock_500ms->r10s(), _srs_pps_timer_s->r10s()); clock_desc = buf; } From 15f7fa2c36c2a5a1821d415a94b73d6c0d9470fb Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 12:07:38 +0800 Subject: [PATCH 06/28] Core: Refine ST stat for io events --- trunk/3rdparty/st-srs/sched.c | 16 ++++++------- trunk/src/app/srs_app_hybrid.cpp | 40 ++++++++++++++++---------------- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/trunk/3rdparty/st-srs/sched.c b/trunk/3rdparty/st-srs/sched.c index 166e1dd4b..71b2ad8e9 100644 --- a/trunk/3rdparty/st-srs/sched.c +++ b/trunk/3rdparty/st-srs/sched.c @@ -497,21 +497,21 @@ void _st_vp_check_clock(void) _ST_LAST_CLOCK = now; #ifdef DEBUG - if (elapsed < 1000) { + if (elapsed <= 1000) { ++_st_stat_sched_us; - } else if (elapsed < 10000) { + } else if (elapsed <= 10000) { ++_st_stat_sched_10ms; - } else if (elapsed < 20000) { + } else if (elapsed <= 21000) { ++_st_stat_sched_20ms; - } else if (elapsed < 40000) { + } else if (elapsed <= 40000) { ++_st_stat_sched_40ms; - } else if (elapsed < 80000) { + } else if (elapsed <= 80000) { ++_st_stat_sched_80ms; - } else if (elapsed < 160000) { + } else if (elapsed <= 160000) { ++_st_stat_sched_160ms; - } else if (elapsed < 320000) { + } else if (elapsed <= 320000) { ++_st_stat_sched_320ms; - } else if (elapsed < 1000000) { + } else if (elapsed <= 1000000) { ++_st_stat_sched_1000ms; } else { ++_st_stat_sched_s; diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index d370d5e21..f56b99eeb 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -102,14 +102,14 @@ SrsPps* _srs_pps_sched_320ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_sched_1000ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_sched_s = new SrsPps(_srs_clock); -SrsPps* _srs_pps_clock_s = new SrsPps(_srs_clock); -SrsPps* _srs_pps_clock_10ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_15ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_20ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_25ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_30ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_clock_35ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_40ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_80ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_160ms = new SrsPps(_srs_clock); -SrsPps* _srs_pps_clock_500ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_timer_s = new SrsPps(_srs_clock); ISrsHybridServer::ISrsHybridServer() @@ -311,22 +311,22 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t srs_utime_t elapsed = now - clock; clock = now; - if (elapsed < 1 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_clock_s->sugar; - } else if (elapsed < 10 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_clock_10ms->sugar; - } else if (elapsed < 20 * SRS_UTIME_MILLISECONDS) { + if (elapsed <= 15 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_15ms->sugar; + } else if (elapsed <= 21 * SRS_UTIME_MILLISECONDS) { ++_srs_pps_clock_20ms->sugar; - } else if (elapsed < 30 * SRS_UTIME_MILLISECONDS) { + } else if (elapsed <= 25 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_25ms->sugar; + } else if (elapsed <= 30 * SRS_UTIME_MILLISECONDS) { ++_srs_pps_clock_30ms->sugar; - } else if (elapsed < 40 * SRS_UTIME_MILLISECONDS) { + } else if (elapsed <= 35 * SRS_UTIME_MILLISECONDS) { + ++_srs_pps_clock_35ms->sugar; + } else if (elapsed <= 40 * SRS_UTIME_MILLISECONDS) { ++_srs_pps_clock_40ms->sugar; - } else if (elapsed < 80 * SRS_UTIME_MILLISECONDS) { + } else if (elapsed <= 80 * SRS_UTIME_MILLISECONDS) { ++_srs_pps_clock_80ms->sugar; - } else if (elapsed < 160 * SRS_UTIME_MILLISECONDS) { + } else if (elapsed <= 160 * SRS_UTIME_MILLISECONDS) { ++_srs_pps_clock_160ms->sugar; - } else if (elapsed < 500 * SRS_UTIME_MILLISECONDS) { - ++_srs_pps_clock_500ms->sugar; } else { ++_srs_pps_timer_s->sugar; } @@ -407,13 +407,13 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t } string clock_desc; - _srs_pps_clock_s->update(); _srs_pps_clock_10ms->update(); - _srs_pps_clock_20ms->update(); _srs_pps_clock_30ms->update(); - _srs_pps_clock_40ms->update(); _srs_pps_clock_80ms->update(); - _srs_pps_clock_160ms->update(); _srs_pps_clock_500ms->update(); + _srs_pps_clock_15ms->update(); _srs_pps_clock_20ms->update(); + _srs_pps_clock_25ms->update(); _srs_pps_clock_30ms->update(); + _srs_pps_clock_35ms->update(); _srs_pps_clock_40ms->update(); + _srs_pps_clock_80ms->update(); _srs_pps_clock_160ms->update(); _srs_pps_timer_s->update(); - if (_srs_pps_clock_s->r10s() || _srs_pps_timer_s->r10s() || _srs_pps_clock_10ms->r10s() || _srs_pps_clock_20ms->r10s() || _srs_pps_clock_30ms->r10s() || _srs_pps_clock_40ms->r10s() || _srs_pps_clock_80ms->r10s() || _srs_pps_clock_160ms->r10s() || _srs_pps_clock_500ms->r10s()) { - snprintf(buf, sizeof(buf), ", clock=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_clock_s->r10s(), _srs_pps_clock_10ms->r10s(), _srs_pps_clock_20ms->r10s(), _srs_pps_clock_30ms->r10s(), _srs_pps_clock_40ms->r10s(), _srs_pps_clock_80ms->r10s(), _srs_pps_clock_160ms->r10s(), _srs_pps_clock_500ms->r10s(), _srs_pps_timer_s->r10s()); + if (_srs_pps_clock_15ms->r10s() || _srs_pps_timer_s->r10s() || _srs_pps_clock_20ms->r10s() || _srs_pps_clock_25ms->r10s() || _srs_pps_clock_30ms->r10s() || _srs_pps_clock_35ms->r10s() || _srs_pps_clock_40ms->r10s() || _srs_pps_clock_80ms->r10s() || _srs_pps_clock_160ms->r10s()) { + snprintf(buf, sizeof(buf), ", clock=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_clock_15ms->r10s(), _srs_pps_clock_20ms->r10s(), _srs_pps_clock_25ms->r10s(), _srs_pps_clock_30ms->r10s(), _srs_pps_clock_35ms->r10s(), _srs_pps_clock_40ms->r10s(), _srs_pps_clock_80ms->r10s(), _srs_pps_clock_160ms->r10s(), _srs_pps_timer_s->r10s()); clock_desc = buf; } From 9db7126eb43fb38ea9c09b81118be6aca3673eba Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 13:26:20 +0800 Subject: [PATCH 07/28] Core: Refine ST stat for thread switch --- trunk/3rdparty/st-srs/sched.c | 11 +++++++++++ trunk/src/app/srs_app_hybrid.cpp | 17 +++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/trunk/3rdparty/st-srs/sched.c b/trunk/3rdparty/st-srs/sched.c index 71b2ad8e9..e7e8da36c 100644 --- a/trunk/3rdparty/st-srs/sched.c +++ b/trunk/3rdparty/st-srs/sched.c @@ -63,6 +63,9 @@ unsigned long long _st_stat_sched_160ms = 0; unsigned long long _st_stat_sched_320ms = 0; unsigned long long _st_stat_sched_1000ms = 0; unsigned long long _st_stat_sched_s = 0; + +unsigned long long _st_stat_thread_run = 0; +unsigned long long _st_stat_thread_idle = 0; #endif @@ -131,10 +134,18 @@ void _st_vp_schedule(void) _st_thread_t *thread; if (_ST_RUNQ.next != &_ST_RUNQ) { + #ifdef DEBUG + ++_st_stat_thread_run; + #endif + /* Pull thread off of the run queue */ thread = _ST_THREAD_PTR(_ST_RUNQ.next); _ST_DEL_RUNQ(thread); } else { + #ifdef DEBUG + ++_st_stat_thread_idle; + #endif + /* If there are no threads to run, switch to the idle thread */ thread = _st_this_vp.idle_thread; } diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index f56b99eeb..06fdc6464 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -112,6 +112,11 @@ 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); +extern unsigned long long _st_stat_thread_run; +extern unsigned long long _st_stat_thread_idle; +SrsPps* _srs_pps_thread_run = new SrsPps(_srs_clock); +SrsPps* _srs_pps_thread_idle = new SrsPps(_srs_clock); + ISrsHybridServer::ISrsHybridServer() { } @@ -248,7 +253,7 @@ srs_error_t SrsHybridServer::run() } // Wait for all server to quit. - srs_thread_exit(NULL); + srs_usleep(SRS_UTIME_NO_TIMEOUT); return err; } @@ -417,11 +422,19 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t clock_desc = buf; } - srs_trace("Hybrid cpu=%.2f%%,%dMB%s%s%s%s%s%s%s%s%s", + string thread_desc; + _srs_pps_thread_run->update(_st_stat_thread_run); _srs_pps_thread_idle->update(_st_stat_thread_idle); + if (_srs_pps_thread_run->r10s() || _srs_pps_thread_idle->r10s()) { + snprintf(buf, sizeof(buf), ", co=%d,%d", _srs_pps_thread_run->r10s(), _srs_pps_thread_idle->r10s()); + thread_desc = buf; + } + + srs_trace("Hybrid cpu=%.2f%%,%dMB%s%s%s%s%s%s%s%s%s%s", u->percent * 100, memory, cid_desc.c_str(), timer_desc.c_str(), recvfrom_desc.c_str(), io_desc.c_str(), msg_desc.c_str(), epoll_desc.c_str(), sched_desc.c_str(), clock_desc.c_str(), + thread_desc.c_str(), free_desc.c_str() ); From f987198af0c13efff25267b54411c12a8cb1453f Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 13:39:43 +0800 Subject: [PATCH 08/28] Clock: Use one system wall clock --- trunk/src/app/srs_app_rtc_conn.cpp | 3 ++- trunk/src/app/srs_app_rtc_source.cpp | 1 + trunk/src/app/srs_app_server.cpp | 7 ------- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index f08d29684..8e14af8ce 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -2271,8 +2271,9 @@ srs_error_t SrsRtcConnection::notify(int type, srs_utime_t interval, srs_utime_t // For publisher to send NACK. if (type == SRS_TICKID_SEND_NACKS) { + // TODO: FIXME: Merge with hybrid system clock. srs_update_system_time(); - + std::map::iterator it; for (it = publishers_.begin(); it != publishers_.end(); it++) { SrsRtcPublishStream* publisher = it->second; diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 24898f3fb..5988119b5 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -1749,6 +1749,7 @@ void SrsRtcRecvTrack::update_rtt(int rtt) void SrsRtcRecvTrack::update_send_report_time(const SrsNtp& ntp) { last_sender_report_ntp = ntp; + // TODO: FIXME: Use system wall clock. last_sender_report_sys_time = srs_update_system_time();; } diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 8d069161c..9be2a3bef 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -802,9 +802,6 @@ srs_error_t SrsServer::initialize(ISrsServerCycle* ch) { srs_error_t err = srs_success; - // ensure the time is ok. - srs_update_system_time(); - // for the main objects(server, config, log, context), // never subscribe handler in constructor, // instead, subscribe handler in initialize method. @@ -1273,9 +1270,6 @@ srs_error_t SrsServer::setup_ticks() srs_freep(timer_); timer_ = new SrsHourGlass("srs", this, 1 * SRS_UTIME_SECONDS); - if ((err = timer_->tick(1, 1 * SRS_UTIME_SECONDS)) != srs_success) { - return srs_error_wrap(err, "tick"); - } if ((err = timer_->tick(2, 3 * SRS_UTIME_SECONDS)) != srs_success) { return srs_error_wrap(err, "tick"); } @@ -1315,7 +1309,6 @@ srs_error_t SrsServer::notify(int event, srs_utime_t interval, srs_utime_t tick) srs_error_t err = srs_success; switch (event) { - case 1: srs_update_system_time(); break; case 2: srs_update_system_rusage(); break; case 3: srs_update_proc_stat(); break; case 4: srs_update_disk_stat(); break; From d8563398b2869aa540b70a82bb61fe78112d2b34 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 17:34:03 +0800 Subject: [PATCH 09/28] Clock: Update stat. Insert timer to execute first --- trunk/3rdparty/st-srs/common.h | 1 + trunk/3rdparty/st-srs/sched.c | 29 ++++++++-------- trunk/conf/full.conf | 3 ++ trunk/research/st/.gitignore | 2 ++ trunk/research/st/cost.cpp | 15 +++++++- trunk/src/app/srs_app_config.cpp | 19 +++++++++- trunk/src/app/srs_app_config.hpp | 2 ++ trunk/src/app/srs_app_hybrid.cpp | 38 +++++++++++--------- trunk/src/app/srs_app_server.cpp | 44 +++++++++++++----------- trunk/src/protocol/srs_protocol_kbps.cpp | 24 ++++++------- 10 files changed, 112 insertions(+), 65 deletions(-) diff --git a/trunk/3rdparty/st-srs/common.h b/trunk/3rdparty/st-srs/common.h index 0c0685b9a..80258b453 100644 --- a/trunk/3rdparty/st-srs/common.h +++ b/trunk/3rdparty/st-srs/common.h @@ -299,6 +299,7 @@ extern _st_eventsys_t *_st_eventsys; #define _ST_DEL_IOQ(_pq) ST_REMOVE_LINK(&_pq.links) #define _ST_ADD_RUNQ(_thr) ST_APPEND_LINK(&(_thr)->links, &_ST_RUNQ) +#define _ST_INSERT_RUNQ(_thr) ST_INSERT_LINK(&(_thr)->links, &_ST_RUNQ) #define _ST_DEL_RUNQ(_thr) ST_REMOVE_LINK(&(_thr)->links) #define _ST_ADD_SLEEPQ(_thr, _timeout) _st_add_sleep_q(_thr, _timeout) diff --git a/trunk/3rdparty/st-srs/sched.c b/trunk/3rdparty/st-srs/sched.c index e7e8da36c..aea6b555d 100644 --- a/trunk/3rdparty/st-srs/sched.c +++ b/trunk/3rdparty/st-srs/sched.c @@ -54,14 +54,14 @@ // Global stat. #ifdef DEBUG -unsigned long long _st_stat_sched_us = 0; -unsigned long long _st_stat_sched_10ms = 0; +unsigned long long _st_stat_sched_15ms = 0; unsigned long long _st_stat_sched_20ms = 0; +unsigned long long _st_stat_sched_25ms = 0; +unsigned long long _st_stat_sched_30ms = 0; +unsigned long long _st_stat_sched_35ms = 0; unsigned long long _st_stat_sched_40ms = 0; unsigned long long _st_stat_sched_80ms = 0; unsigned long long _st_stat_sched_160ms = 0; -unsigned long long _st_stat_sched_320ms = 0; -unsigned long long _st_stat_sched_1000ms = 0; unsigned long long _st_stat_sched_s = 0; unsigned long long _st_stat_thread_run = 0; @@ -504,26 +504,26 @@ void _st_vp_check_clock(void) st_utime_t elapsed, now; now = st_utime(); - elapsed = now - _ST_LAST_CLOCK; + elapsed = now < _ST_LAST_CLOCK? 0 : now - _ST_LAST_CLOCK; // Might step back. _ST_LAST_CLOCK = now; #ifdef DEBUG - if (elapsed <= 1000) { - ++_st_stat_sched_us; - } else if (elapsed <= 10000) { - ++_st_stat_sched_10ms; + if (elapsed <= 10000) { + ++_st_stat_sched_15ms; } else if (elapsed <= 21000) { ++_st_stat_sched_20ms; + } else if (elapsed <= 25000) { + ++_st_stat_sched_25ms; + } else if (elapsed <= 30000) { + ++_st_stat_sched_30ms; + } else if (elapsed <= 35000) { + ++_st_stat_sched_35ms; } else if (elapsed <= 40000) { ++_st_stat_sched_40ms; } else if (elapsed <= 80000) { ++_st_stat_sched_80ms; } else if (elapsed <= 160000) { ++_st_stat_sched_160ms; - } else if (elapsed <= 320000) { - ++_st_stat_sched_320ms; - } else if (elapsed <= 1000000) { - ++_st_stat_sched_1000ms; } else { ++_st_stat_sched_s; } @@ -548,7 +548,8 @@ void _st_vp_check_clock(void) /* Make thread runnable */ ST_ASSERT(!(thread->flags & _ST_FL_IDLE_THREAD)); thread->state = _ST_ST_RUNNABLE; - _ST_ADD_RUNQ(thread); + // Insert at the head of RunQ, to execute timer first. + _ST_INSERT_RUNQ(thread); } } diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index 142dfc233..4e0c76424 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -152,6 +152,9 @@ heartbeat { # @remark the heartbeat depends on the network, # for example, the eth0 maybe the device which index is 0. stats { + # Whether enable the stat of system resources. + # Default: on + enabled on; # the index of device ip. # we may retrieve more than one network device. # default: 0 diff --git a/trunk/research/st/.gitignore b/trunk/research/st/.gitignore index 827222cf2..95683a3be 100644 --- a/trunk/research/st/.gitignore +++ b/trunk/research/st/.gitignore @@ -1,2 +1,4 @@ udp-server udp-client +cost +cost.log diff --git a/trunk/research/st/cost.cpp b/trunk/research/st/cost.cpp index c7caeb5fa..78a71e554 100644 --- a/trunk/research/st/cost.cpp +++ b/trunk/research/st/cost.cpp @@ -1,10 +1,11 @@ /* -g++ -g -O0 cost.cpp -o cost && ./cost | grep COST +g++ -g -O0 cost.cpp ../../objs/st/libst.a -I../../objs/st -o cost && ./cost | grep COST */ #include #include #include #include +#include #define SRS_UTIME_MILLISECONDS 1000 #define srsu2i(us) ((int)(us)) @@ -143,6 +144,18 @@ int main(int argc, char** argv) ); } + // The cost for ST timer. + st_set_eventsys(ST_EVENTSYS_ALT); + st_init(); + for (;;) { + int64_t start = srs_update_system_time(); + st_usleep(20 * 1000); + int64_t cost = srs_update_system_time() - start; + if (cost > (20 + 10) * 1000) { + printf("[COST] timer=%dms\n", (int)(cost / 1000)); + } + } + return 0; } diff --git a/trunk/src/app/srs_app_config.cpp b/trunk/src/app/srs_app_config.cpp index 0d2575f3f..efd7e236b 100644 --- a/trunk/src/app/srs_app_config.cpp +++ b/trunk/src/app/srs_app_config.cpp @@ -3640,7 +3640,7 @@ srs_error_t SrsConfig::check_normal_config() SrsConfDirective* conf = get_stats(); for (int i = 0; conf && i < (int)conf->directives.size(); i++) { string n = conf->at(i)->name; - if (n != "network" && n != "disk") { + if (n != "enabled" && n != "network" && n != "disk") { return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal stats.%s", n.c_str()); } } @@ -8353,6 +8353,23 @@ SrsConfDirective* SrsConfig::get_stats() return root->get("stats"); } +bool SrsConfig::get_stats_enabled() +{ + static bool DEFAULT = true; + + SrsConfDirective* conf = get_stats(); + if (!conf) { + return DEFAULT; + } + + conf = conf->get("enabled"); + if (!conf || conf->arg0().empty()) { + return DEFAULT; + } + + return SRS_CONF_PERFER_TRUE(conf->arg0()); +} + int SrsConfig::get_stats_network() { static int DEFAULT = 0; diff --git a/trunk/src/app/srs_app_config.hpp b/trunk/src/app/srs_app_config.hpp index 485725912..507467073 100644 --- a/trunk/src/app/srs_app_config.hpp +++ b/trunk/src/app/srs_app_config.hpp @@ -1084,6 +1084,8 @@ private: // Get the stats directive. virtual SrsConfDirective* get_stats(); public: + // Whether enabled stats. + virtual bool get_stats_enabled(); // Get the network device index, used to retrieve the ip of device, // For heartbeat to report to server, or to get the local ip. // For example, 0 means the eth0 maybe. diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 06fdc6464..941fef02b 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -83,23 +83,23 @@ SrsPps* _srs_pps_epoll_zero = new SrsPps(_srs_clock); SrsPps* _srs_pps_epoll_shake = new SrsPps(_srs_clock); SrsPps* _srs_pps_epoll_spin = new SrsPps(_srs_clock); -extern unsigned long long _st_stat_sched_us; -extern unsigned long long _st_stat_sched_10ms; +extern unsigned long long _st_stat_sched_15ms; extern unsigned long long _st_stat_sched_20ms; +extern unsigned long long _st_stat_sched_25ms; +extern unsigned long long _st_stat_sched_30ms; +extern unsigned long long _st_stat_sched_35ms; extern unsigned long long _st_stat_sched_40ms; extern unsigned long long _st_stat_sched_80ms; extern unsigned long long _st_stat_sched_160ms; -extern unsigned long long _st_stat_sched_320ms; -extern unsigned long long _st_stat_sched_1000ms; extern unsigned long long _st_stat_sched_s; -SrsPps* _srs_pps_sched_us = new SrsPps(_srs_clock); -SrsPps* _srs_pps_sched_10ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sched_15ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_sched_20ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sched_25ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sched_30ms = new SrsPps(_srs_clock); +SrsPps* _srs_pps_sched_35ms = new SrsPps(_srs_clock); 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_320ms = new SrsPps(_srs_clock); -SrsPps* _srs_pps_sched_1000ms = new SrsPps(_srs_clock); SrsPps* _srs_pps_sched_s = new SrsPps(_srs_clock); SrsPps* _srs_pps_clock_15ms = new SrsPps(_srs_clock); @@ -112,6 +112,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); +extern int _st_active_count; extern unsigned long long _st_stat_thread_run; extern unsigned long long _st_stat_thread_idle; SrsPps* _srs_pps_thread_run = new SrsPps(_srs_clock); @@ -277,6 +278,9 @@ SrsServerAdapter* SrsHybridServer::srs() return NULL; } +extern void _srs_coroutine_switch_in(); +extern void _srs_coroutine_switch_out(); + srs_error_t SrsHybridServer::setup_ticks() { srs_error_t err = srs_success; @@ -401,13 +405,13 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t } string sched_desc; - _srs_pps_sched_us->update(_st_stat_sched_us); _srs_pps_sched_s->update(_st_stat_sched_s); - _srs_pps_sched_10ms->update(_st_stat_sched_10ms); _srs_pps_sched_20ms->update(_st_stat_sched_20ms); - _srs_pps_sched_40ms->update(_st_stat_sched_40ms); _srs_pps_sched_80ms->update(_st_stat_sched_80ms); - _srs_pps_sched_160ms->update(_st_stat_sched_160ms); _srs_pps_sched_320ms->update(_st_stat_sched_320ms); - _srs_pps_sched_1000ms->update(_st_stat_sched_1000ms); - if (_srs_pps_sched_us->r10s() || _srs_pps_sched_s->r10s() || _srs_pps_sched_10ms->r10s() || _srs_pps_sched_20ms->r10s() || _srs_pps_sched_40ms->r10s() || _srs_pps_sched_80ms->r10s() || _srs_pps_sched_160ms->r10s() || _srs_pps_sched_320ms->r10s() || _srs_pps_sched_1000ms->r10s()) { - snprintf(buf, sizeof(buf), ", sched=%d,%d,%d,%d,%d,%d,%d,%d,%d", _srs_pps_sched_us->r10s(), _srs_pps_sched_10ms->r10s(), _srs_pps_sched_20ms->r10s(), _srs_pps_sched_40ms->r10s(), _srs_pps_sched_80ms->r10s(), _srs_pps_sched_160ms->r10s(), _srs_pps_sched_320ms->r10s(), _srs_pps_sched_1000ms->r10s(), _srs_pps_sched_s->r10s()); + _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); + _srs_pps_sched_35ms->update(_st_stat_sched_35ms); _srs_pps_sched_40ms->update(_st_stat_sched_40ms); + _srs_pps_sched_80ms->update(_st_stat_sched_80ms); + if (_srs_pps_sched_160ms->r10s() || _srs_pps_sched_s->r10s() || _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()) { + 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; } @@ -424,8 +428,8 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t string thread_desc; _srs_pps_thread_run->update(_st_stat_thread_run); _srs_pps_thread_idle->update(_st_stat_thread_idle); - if (_srs_pps_thread_run->r10s() || _srs_pps_thread_idle->r10s()) { - snprintf(buf, sizeof(buf), ", co=%d,%d", _srs_pps_thread_run->r10s(), _srs_pps_thread_idle->r10s()); + if (_st_active_count > 0 || _srs_pps_thread_run->r10s() || _srs_pps_thread_idle->r10s()) { + snprintf(buf, sizeof(buf), ", co=%d,%d,%d", _st_active_count, _srs_pps_thread_run->r10s(), _srs_pps_thread_idle->r10s()); thread_desc = buf; } diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 9be2a3bef..5bfe48111 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -1270,27 +1270,31 @@ srs_error_t SrsServer::setup_ticks() srs_freep(timer_); timer_ = new SrsHourGlass("srs", this, 1 * SRS_UTIME_SECONDS); - if ((err = timer_->tick(2, 3 * SRS_UTIME_SECONDS)) != srs_success) { - return srs_error_wrap(err, "tick"); - } - if ((err = timer_->tick(3, 3 * SRS_UTIME_SECONDS)) != srs_success) { - return srs_error_wrap(err, "tick"); - } - if ((err = timer_->tick(4, 6 * SRS_UTIME_SECONDS)) != srs_success) { - return srs_error_wrap(err, "tick"); - } - if ((err = timer_->tick(5, 6 * SRS_UTIME_SECONDS)) != srs_success) { - return srs_error_wrap(err, "tick"); - } - if ((err = timer_->tick(6, 9 * SRS_UTIME_SECONDS)) != srs_success) { - return srs_error_wrap(err, "tick"); - } - if ((err = timer_->tick(7, 9 * SRS_UTIME_SECONDS)) != srs_success) { - return srs_error_wrap(err, "tick"); - } - if ((err = timer_->tick(8, 3 * SRS_UTIME_SECONDS)) != srs_success) { - return srs_error_wrap(err, "tick"); + if (_srs_config->get_stats_enabled()) { + if ((err = timer_->tick(2, 3 * SRS_UTIME_SECONDS)) != srs_success) { + return srs_error_wrap(err, "tick"); + } + if ((err = timer_->tick(3, 3 * SRS_UTIME_SECONDS)) != srs_success) { + return srs_error_wrap(err, "tick"); + } + if ((err = timer_->tick(4, 6 * SRS_UTIME_SECONDS)) != srs_success) { + return srs_error_wrap(err, "tick"); + } + if ((err = timer_->tick(5, 6 * SRS_UTIME_SECONDS)) != srs_success) { + return srs_error_wrap(err, "tick"); + } + if ((err = timer_->tick(6, 9 * SRS_UTIME_SECONDS)) != srs_success) { + return srs_error_wrap(err, "tick"); + } + if ((err = timer_->tick(7, 9 * SRS_UTIME_SECONDS)) != srs_success) { + return srs_error_wrap(err, "tick"); + } + + if ((err = timer_->tick(8, 3 * SRS_UTIME_SECONDS)) != srs_success) { + return srs_error_wrap(err, "tick"); + } } + if (_srs_config->get_heartbeat_enabled()) { if ((err = timer_->tick(9, _srs_config->get_heartbeat_interval())) != srs_success) { return srs_error_wrap(err, "tick"); diff --git a/trunk/src/protocol/srs_protocol_kbps.cpp b/trunk/src/protocol/srs_protocol_kbps.cpp index 2ae0f11aa..b0d4bfa0f 100644 --- a/trunk/src/protocol/srs_protocol_kbps.cpp +++ b/trunk/src/protocol/srs_protocol_kbps.cpp @@ -43,6 +43,13 @@ SrsRateSample* SrsRateSample::update(int64_t nn, srs_utime_t t, int k) return this; } +void srs_pps_init(SrsRateSample& sample, int64_t nn, srs_utime_t now) +{ + if (sample.time < 0 || nn < sample.total) { + sample.update(nn, now, 0); + } +} + void srs_pps_update(SrsRateSample& sample, int64_t nn, srs_utime_t now) { int pps = (int)((nn - sample.total) * 1000 / srsu2ms(now - sample.time)); @@ -71,18 +78,11 @@ void SrsPps::update(int64_t nn) { srs_utime_t now = clk_->now(); - if (sample_30s_.time < 0) { - sample_30s_.update(nn, now, 0); - } - if (sample_1m_.time < 0) { - sample_1m_.update(nn, now, 0); - } - if (sample_5m_.time < 0) { - sample_5m_.update(nn, now, 0); - } - if (sample_60m_.time < 0) { - sample_60m_.update(nn, now, 0); - } + srs_pps_init(sample_10s_, nn, now); + srs_pps_init(sample_30s_, nn, now); + srs_pps_init(sample_1m_, nn, now); + srs_pps_init(sample_5m_, nn, now); + srs_pps_init(sample_60m_, nn, now); if (now - sample_10s_.time >= 10 * SRS_UTIME_SECONDS) { srs_pps_update(sample_10s_, nn, now); From b4b9776b02b980d7715aacfbc438c9e60335e402 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 21:04:09 +0800 Subject: [PATCH 10/28] Core: Support yield current coroutine for high performance timer. --- trunk/3rdparty/st-srs/public.h | 1 + trunk/3rdparty/st-srs/sched.c | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/trunk/3rdparty/st-srs/public.h b/trunk/3rdparty/st-srs/public.h index 80fd93346..c911912b8 100644 --- a/trunk/3rdparty/st-srs/public.h +++ b/trunk/3rdparty/st-srs/public.h @@ -98,6 +98,7 @@ extern st_thread_t st_thread_self(void); extern void st_thread_exit(void *retval); extern int st_thread_join(st_thread_t thread, void **retvalp); extern void st_thread_interrupt(st_thread_t thread); +extern void st_thread_yield(); extern st_thread_t st_thread_create(void *(*start)(void *arg), void *arg, int joinable, int stack_size); extern int st_randomize_stacks(int on); extern int st_set_utime_function(st_utime_t (*func)(void)); diff --git a/trunk/3rdparty/st-srs/sched.c b/trunk/3rdparty/st-srs/sched.c index aea6b555d..f46a368f5 100644 --- a/trunk/3rdparty/st-srs/sched.c +++ b/trunk/3rdparty/st-srs/sched.c @@ -66,6 +66,7 @@ unsigned long long _st_stat_sched_s = 0; unsigned long long _st_stat_thread_run = 0; unsigned long long _st_stat_thread_idle = 0; +unsigned long long _st_stat_thread_yield = 0; #endif @@ -554,6 +555,31 @@ void _st_vp_check_clock(void) } +void st_thread_yield() +{ + _st_thread_t *me = _ST_CURRENT_THREAD(); + + // If not thread in RunQ to yield to, ignore and continue to run. + if (_ST_RUNQ.next == &_ST_RUNQ) { + return; + } + + #ifdef DEBUG + ++_st_stat_thread_yield; + #endif + + /* Check sleep queue for expired threads */ + _st_vp_check_clock(); + + // Append thread to the tail of RunQ, we will back after all threads executed. + me->state = _ST_ST_RUNNABLE; + _ST_ADD_RUNQ(me); + + // Yield to other threads in the RunQ. + _ST_SWITCH_CONTEXT(me); +} + + void st_thread_interrupt(_st_thread_t *thread) { /* If thread is already dead */ From 01687697a17ca0b8b2e3374c2a39007c5f8485d6 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 21:14:04 +0800 Subject: [PATCH 11/28] Fix circleci fail --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 129b11f61..d62fc838d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,8 +7,8 @@ jobs: - checkout - run: | cd trunk && - ./configure --without-rtc --without-gb28181 --without-utest --without-srtp-nasm && make && - ./configure --with-rtc --with-gb28181 --with-utest --with-srtp-nasm && make clean && make + ./configure --gb28181=off --utest=off --srtp-nasm=off && make && + ./configure --gb28181=on --utest=on --srtp-nasm=on && make clean && make test: docker: - image: ossrs/srs:dev @@ -16,7 +16,7 @@ jobs: - checkout - run: | cd trunk && - ./configure --with-rtc --with-gb28181 --with-srtp-nasm --with-utest --gcov && make && + ./configure --gb28181=on --srtp-nasm=on --utest=on --gcov=on && make && ./objs/srs_utest && bash auto/coverage.sh workflows: version: 2 From c0fda4274349ad20d80c23060c9b8012228aa684 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 21:14:45 +0800 Subject: [PATCH 12/28] For #2194, Support ST yield --- trunk/src/app/srs_app_hybrid.cpp | 7 +++++-- trunk/src/protocol/srs_service_st.cpp | 5 +++++ trunk/src/protocol/srs_service_st.hpp | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index 941fef02b..cecd3a2e0 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -115,8 +115,10 @@ SrsPps* _srs_pps_timer_s = new SrsPps(_srs_clock); extern int _st_active_count; extern unsigned long long _st_stat_thread_run; extern unsigned long long _st_stat_thread_idle; +extern unsigned long long _st_stat_thread_yield; 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); ISrsHybridServer::ISrsHybridServer() { @@ -428,8 +430,9 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t string thread_desc; _srs_pps_thread_run->update(_st_stat_thread_run); _srs_pps_thread_idle->update(_st_stat_thread_idle); - if (_st_active_count > 0 || _srs_pps_thread_run->r10s() || _srs_pps_thread_idle->r10s()) { - snprintf(buf, sizeof(buf), ", co=%d,%d,%d", _st_active_count, _srs_pps_thread_run->r10s(), _srs_pps_thread_idle->r10s()); + _srs_pps_thread_yield->update(_st_stat_thread_yield); + if (_st_active_count > 0 || _srs_pps_thread_run->r10s() || _srs_pps_thread_idle->r10s() || _srs_pps_thread_yield->r10s()) { + snprintf(buf, sizeof(buf), ", co=%d,%d,%d,%d", _st_active_count, _srs_pps_thread_run->r10s(), _srs_pps_thread_idle->r10s(), _srs_pps_thread_yield->r10s()); thread_desc = buf; } diff --git a/trunk/src/protocol/srs_service_st.cpp b/trunk/src/protocol/srs_service_st.cpp index 99cf856af..a4189dd8e 100644 --- a/trunk/src/protocol/srs_service_st.cpp +++ b/trunk/src/protocol/srs_service_st.cpp @@ -156,6 +156,11 @@ void srs_thread_exit(void* retval) st_thread_exit(retval); } +void srs_thread_yield() +{ + st_thread_yield(); +} + srs_error_t srs_tcp_connect(string server, int port, srs_utime_t tm, srs_netfd_t* pstfd) { st_utime_t timeout = ST_UTIME_NO_TIMEOUT; diff --git a/trunk/src/protocol/srs_service_st.hpp b/trunk/src/protocol/srs_service_st.hpp index 263bb5104..bcad9c8b9 100644 --- a/trunk/src/protocol/srs_service_st.hpp +++ b/trunk/src/protocol/srs_service_st.hpp @@ -58,6 +58,7 @@ extern srs_error_t srs_fd_keepalive(int fd); // Get current coroutine/thread. extern srs_thread_t srs_thread_self(); extern void srs_thread_exit(void* retval); +extern void srs_thread_yield(); // For client, to open socket and connect to server. // @param tm The timeout in srs_utime_t. From d1bcc03d9a3ef3adbdfdade738cfb5be0ffb821c Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 21:15:26 +0800 Subject: [PATCH 13/28] For #2194, yield for high performance timer, for live player --- trunk/src/app/srs_app_rtmp_conn.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index e41b1ec47..06e86d3c3 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -826,6 +826,9 @@ srs_error_t SrsRtmpConn::do_playing(SrsSource* source, SrsConsumer* consumer, Sr if (send_min_interval > 0) { srs_usleep(send_min_interval); } + + // Yield to another coroutines. + srs_thread_yield(); } return err; From a5a96491a37cdb19c3d96e5ee747743a3c1b3011 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 22:03:00 +0800 Subject: [PATCH 14/28] For #2194, yield for timer, for live publisher --- trunk/src/app/srs_app_recv_thread.cpp | 10 +++++++++- trunk/src/app/srs_app_recv_thread.hpp | 1 + trunk/src/app/srs_app_rtmp_conn.cpp | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/trunk/src/app/srs_app_recv_thread.cpp b/trunk/src/app/srs_app_recv_thread.cpp index bc063da26..5887b3710 100644 --- a/trunk/src/app/srs_app_recv_thread.cpp +++ b/trunk/src/app/srs_app_recv_thread.cpp @@ -288,7 +288,8 @@ SrsPublishRecvThread::SrsPublishRecvThread(SrsRtmpServer* rtmp_sdk, SrsRequest* _conn = conn; _source = source; - + + nn_msgs_for_yield_ = 0; recv_error = srs_success; _nb_msgs = 0; video_frames = 0; @@ -401,6 +402,13 @@ srs_error_t SrsPublishRecvThread::consume(SrsCommonMessage* msg) if (err != srs_success) { return srs_error_wrap(err, "handle publish message"); } + + // Yield to another coroutines. + // @see https://github.com/ossrs/srs/issues/2194#issuecomment-777463768 + if (++nn_msgs_for_yield_ >= 15) { + nn_msgs_for_yield_ = 0; + srs_thread_yield(); + } return err; } diff --git a/trunk/src/app/srs_app_recv_thread.hpp b/trunk/src/app/srs_app_recv_thread.hpp index c61cf33ed..13e55fe79 100644 --- a/trunk/src/app/srs_app_recv_thread.hpp +++ b/trunk/src/app/srs_app_recv_thread.hpp @@ -144,6 +144,7 @@ class SrsPublishRecvThread : virtual public ISrsMessagePumper, virtual public IS #endif { private: + uint32_t nn_msgs_for_yield_; SrsRecvThread trd; SrsRtmpServer* rtmp; SrsRequest* req; diff --git a/trunk/src/app/srs_app_rtmp_conn.cpp b/trunk/src/app/srs_app_rtmp_conn.cpp index 06e86d3c3..2acec6814 100644 --- a/trunk/src/app/srs_app_rtmp_conn.cpp +++ b/trunk/src/app/srs_app_rtmp_conn.cpp @@ -828,6 +828,7 @@ srs_error_t SrsRtmpConn::do_playing(SrsSource* source, SrsConsumer* consumer, Sr } // Yield to another coroutines. + // @see https://github.com/ossrs/srs/issues/2194#issuecomment-777437476 srs_thread_yield(); } From a049ce3fb7aa078b4f1351cd46009ceedbfa313e Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 22:49:08 +0800 Subject: [PATCH 15/28] For #2194, Core: Refine yield for high performance timer. --- trunk/3rdparty/st-srs/README.md | 1 + trunk/3rdparty/st-srs/sched.c | 15 ++++++++++----- trunk/src/app/srs_app_hybrid.cpp | 8 +++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/trunk/3rdparty/st-srs/README.md b/trunk/3rdparty/st-srs/README.md index b42c6e861..aa8ad70bc 100644 --- a/trunk/3rdparty/st-srs/README.md +++ b/trunk/3rdparty/st-srs/README.md @@ -68,6 +68,7 @@ The branch [srs](https://github.com/ossrs/state-threads/tree/srs) will be patche - [x] Support OSX for Apple Darwin, macOS, [#11](https://github.com/ossrs/state-threads/issues/11). - [x] Support sendmmsg for UDP, [#12](https://github.com/ossrs/state-threads/issues/12). - [x] Refine performance for sleep or epoll_wait(0), [#17](https://github.com/ossrs/state-threads/issues/17). +- [ ] Improve the performance of timer. [9fe8cfe5b](https://github.com/ossrs/state-threads/commit/9fe8cfe5b1c9741a2e671a46215184f267fba400), [7879c2b](https://github.com/ossrs/state-threads/commit/7879c2b), [387cddb](https://github.com/ossrs/state-threads/commit/387cddb) ## GDB Tools diff --git a/trunk/3rdparty/st-srs/sched.c b/trunk/3rdparty/st-srs/sched.c index f46a368f5..f69df556c 100644 --- a/trunk/3rdparty/st-srs/sched.c +++ b/trunk/3rdparty/st-srs/sched.c @@ -67,6 +67,7 @@ unsigned long long _st_stat_sched_s = 0; unsigned long long _st_stat_thread_run = 0; unsigned long long _st_stat_thread_idle = 0; unsigned long long _st_stat_thread_yield = 0; +unsigned long long _st_stat_thread_yield2 = 0; #endif @@ -559,11 +560,6 @@ void st_thread_yield() { _st_thread_t *me = _ST_CURRENT_THREAD(); - // If not thread in RunQ to yield to, ignore and continue to run. - if (_ST_RUNQ.next == &_ST_RUNQ) { - return; - } - #ifdef DEBUG ++_st_stat_thread_yield; #endif @@ -571,6 +567,15 @@ void st_thread_yield() /* Check sleep queue for expired threads */ _st_vp_check_clock(); + // If not thread in RunQ to yield to, ignore and continue to run. + if (_ST_RUNQ.next == &_ST_RUNQ) { + return; + } + + #ifdef DEBUG + ++_st_stat_thread_yield2; + #endif + // Append thread to the tail of RunQ, we will back after all threads executed. me->state = _ST_ST_RUNNABLE; _ST_ADD_RUNQ(me); diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index cecd3a2e0..c11be9493 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -116,9 +116,11 @@ extern int _st_active_count; extern unsigned long long _st_stat_thread_run; extern unsigned long long _st_stat_thread_idle; extern unsigned long long _st_stat_thread_yield; +extern unsigned long long _st_stat_thread_yield2; 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); ISrsHybridServer::ISrsHybridServer() { @@ -430,9 +432,9 @@ srs_error_t SrsHybridServer::notify(int event, srs_utime_t interval, srs_utime_t string thread_desc; _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); - if (_st_active_count > 0 || _srs_pps_thread_run->r10s() || _srs_pps_thread_idle->r10s() || _srs_pps_thread_yield->r10s()) { - snprintf(buf, sizeof(buf), ", co=%d,%d,%d,%d", _st_active_count, _srs_pps_thread_run->r10s(), _srs_pps_thread_idle->r10s(), _srs_pps_thread_yield->r10s()); + _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; } From df1eca10fbbcf566e20f2729a1fc5d280f308306 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 22:49:54 +0800 Subject: [PATCH 16/28] For #2194, yield for timer, for rtc publisher --- trunk/src/app/srs_app_listener.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/trunk/src/app/srs_app_listener.cpp b/trunk/src/app/srs_app_listener.cpp index a07ddc7cb..918ea91f7 100755 --- a/trunk/src/app/srs_app_listener.cpp +++ b/trunk/src/app/srs_app_listener.cpp @@ -593,7 +593,10 @@ srs_error_t SrsUdpMuxListener::cycle() // and the size is not determined, so we think there is at least one copy, // and we can reuse the plaintext h264/opus with players when got plaintext. SrsUdpMuxSocket skt(lfd); - + + // How many messages to run a yield. + uint32_t nn_msgs_for_yield = 0; + while (true) { if ((err = trd->pull()) != srs_success) { return srs_error_wrap(err, "udp listener"); @@ -660,7 +663,14 @@ srs_error_t SrsUdpMuxListener::cycle() if (SrsUdpPacketRecvCycleInterval > 0) { srs_usleep(SrsUdpPacketRecvCycleInterval); - } + } + + // Yield to another coroutines. + // @see https://github.com/ossrs/srs/issues/2194#issuecomment-777485531 + if (++nn_msgs_for_yield > 10) { + nn_msgs_for_yield = 0; + srs_thread_yield(); + } } return err; From ebcba149aecebf956c4d6eb3c6de282d5e12fc27 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 11 Feb 2021 23:10:08 +0800 Subject: [PATCH 17/28] For #2194, yield for timer, for rtc player --- trunk/src/app/srs_app_listener.cpp | 10 +++++++++- trunk/src/app/srs_app_listener.hpp | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/trunk/src/app/srs_app_listener.cpp b/trunk/src/app/srs_app_listener.cpp index 918ea91f7..a2aaa7407 100755 --- a/trunk/src/app/srs_app_listener.cpp +++ b/trunk/src/app/srs_app_listener.cpp @@ -292,6 +292,7 @@ srs_error_t SrsTcpListener::cycle() SrsUdpMuxSocket::SrsUdpMuxSocket(srs_netfd_t fd) { + nn_msgs_for_yield_ = 0; nb_buf = SRS_UDP_MAX_PACKET_SIZE; buf = new char[nb_buf]; nread = 0; @@ -359,7 +360,14 @@ srs_error_t SrsUdpMuxSocket::sendto(void* data, int size, srs_utime_t timeout) } return srs_error_new(ERROR_SOCKET_WRITE, "sendto"); - } + } + + // Yield to another coroutines. + // @see https://github.com/ossrs/srs/issues/2194#issuecomment-777542162 + if (++nn_msgs_for_yield_ > 20) { + nn_msgs_for_yield_ = 0; + srs_thread_yield(); + } return err; } diff --git a/trunk/src/app/srs_app_listener.hpp b/trunk/src/app/srs_app_listener.hpp index 53d0f92c0..a42fbefd5 100644 --- a/trunk/src/app/srs_app_listener.hpp +++ b/trunk/src/app/srs_app_listener.hpp @@ -138,6 +138,8 @@ public: class SrsUdpMuxSocket { private: + // For sender yield only. + uint32_t nn_msgs_for_yield_; std::map cache_; SrsBuffer* cache_buffer_; private: From c5d2027f9af77fc2d34a6b6ca941c0f0fbdd10c4 Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 12 Feb 2021 09:31:18 +0800 Subject: [PATCH 18/28] RTC: Support high performance timer about 25ms resolution. 4.0.72 --- README.md | 1 + trunk/src/core/srs_core_version4.hpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4aad351a9..186a90f85 100755 --- a/README.md +++ b/README.md @@ -156,6 +156,7 @@ For previous versions, please read: ## V4 changes +* v4.0, 2021-02-12, RTC: Support high performance timer about 25ms resolution. 4.0.72 * v4.0, 2021-02-10, RTC: Refine performance about 700+ streams. 4.0.71 * v4.0, 2021-02-08, RTC: Print stat for pli and timer every 5s. 4.0.70 * v4.0, 2021-02-07, RTC: Parse PT fast and refine udp handler. 4.0.69 diff --git a/trunk/src/core/srs_core_version4.hpp b/trunk/src/core/srs_core_version4.hpp index f5ff1fd88..e91716a63 100644 --- a/trunk/src/core/srs_core_version4.hpp +++ b/trunk/src/core/srs_core_version4.hpp @@ -24,6 +24,6 @@ #ifndef SRS_CORE_VERSION4_HPP #define SRS_CORE_VERSION4_HPP -#define SRS_VERSION4_REVISION 71 +#define SRS_VERSION4_REVISION 72 #endif From 044df17791f25d97552bb2dd15e159701d878476 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 15 Feb 2021 12:37:16 +0800 Subject: [PATCH 19/28] Fix utest fail --- trunk/src/utest/srs_utest_rtc.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/trunk/src/utest/srs_utest_rtc.cpp b/trunk/src/utest/srs_utest_rtc.cpp index 577e2bd98..7a35e0162 100644 --- a/trunk/src/utest/srs_utest_rtc.cpp +++ b/trunk/src/utest/srs_utest_rtc.cpp @@ -1080,10 +1080,10 @@ VOID TEST(KernelRTCTest, DTLSClientARQTest) EXPECT_TRUE(cio.done); EXPECT_TRUE(sio.done); - EXPECT_EQ(3, cio.nn_client_hello); - EXPECT_EQ(1, sio.nn_server_hello); - EXPECT_EQ(1, cio.nn_certificate); - EXPECT_EQ(1, sio.nn_new_session); + EXPECT_TRUE(3 <= cio.nn_client_hello); + EXPECT_TRUE(1 <= sio.nn_server_hello); + EXPECT_TRUE(1 <= cio.nn_certificate); + EXPECT_TRUE(1 <= sio.nn_new_session); EXPECT_EQ(0, sio.nn_change_cipher); } @@ -1114,8 +1114,8 @@ VOID TEST(KernelRTCTest, DTLSClientARQTest) EXPECT_EQ(1, cio.nn_client_hello); EXPECT_EQ(1, sio.nn_server_hello); - EXPECT_EQ(3, cio.nn_certificate); - EXPECT_EQ(1, sio.nn_new_session); + EXPECT_TRUE(3 <= cio.nn_certificate); + EXPECT_TRUE(1 <= sio.nn_new_session); EXPECT_EQ(0, sio.nn_change_cipher); } } @@ -1174,8 +1174,8 @@ VOID TEST(KernelRTCTest, DTLSServerARQTest) EXPECT_EQ(3, cio.nn_client_hello); EXPECT_EQ(3, sio.nn_server_hello); - EXPECT_EQ(1, cio.nn_certificate); - EXPECT_EQ(1, sio.nn_new_session); + EXPECT_TRUE(1 <= cio.nn_certificate); + EXPECT_TRUE(1 <= sio.nn_new_session); EXPECT_EQ(0, sio.nn_change_cipher); } From 7d75f0af0fe06c726107d110d2c89d2d1025a886 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 15 Feb 2021 12:43:41 +0800 Subject: [PATCH 20/28] Remove dead code --- trunk/src/app/srs_app_hybrid.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/trunk/src/app/srs_app_hybrid.cpp b/trunk/src/app/srs_app_hybrid.cpp index c11be9493..9f7a37343 100644 --- a/trunk/src/app/srs_app_hybrid.cpp +++ b/trunk/src/app/srs_app_hybrid.cpp @@ -282,9 +282,6 @@ SrsServerAdapter* SrsHybridServer::srs() return NULL; } -extern void _srs_coroutine_switch_in(); -extern void _srs_coroutine_switch_out(); - srs_error_t SrsHybridServer::setup_ticks() { srs_error_t err = srs_success; From 0fe031a1564f5d352acfbb26d7f63dbdf959ae93 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 15 Feb 2021 13:09:13 +0800 Subject: [PATCH 21/28] Support to disable stats by default --- trunk/3rdparty/st-srs/Makefile | 3 +++ trunk/3rdparty/st-srs/event.c | 10 ++++----- trunk/3rdparty/st-srs/io.c | 38 ++++++++++++++++---------------- trunk/3rdparty/st-srs/sched.c | 12 +++++----- trunk/auto/auto_headers.sh | 6 +++++ trunk/auto/depends.sh | 4 ++++ trunk/auto/options.sh | 8 +++++-- trunk/src/app/srs_app_hybrid.cpp | 16 ++++++++++++++ 8 files changed, 65 insertions(+), 32 deletions(-) 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 5d83ebfaa..fa5a72d62 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, From c6cb0fb21f114ec0334ce75e57c6e5ad4a186459 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 15 Feb 2021 19:24:23 +0800 Subject: [PATCH 22/28] Refine scripts --- trunk/auto/options.sh | 208 ++++++++++++++++++++++-------------------- 1 file changed, 107 insertions(+), 101 deletions(-) diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh index fa5a72d62..18d0e7919 100755 --- a/trunk/auto/options.sh +++ b/trunk/auto/options.sh @@ -165,9 +165,9 @@ Features: --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) - --log-trace Whether enable the log trace level. Default: $(value2switch $SRS_LOG_TRACE) + --log-verbose=on|off Whether enable the log verbose level. Default: $(value2switch $SRS_LOG_VERBOSE) + --log-info=on|off Whether enable the log info level. Default: $(value2switch $SRS_LOG_INFO) + --log-trace=on|off Whether enable the log trace level. Default: $(value2switch $SRS_LOG_TRACE) Performance: @see https://blog.csdn.net/win_lin/article/details/53503869 --valgrind=on|off Whether build valgrind for memory check. Default: $(value2switch $SRS_VALGRIND) @@ -183,7 +183,7 @@ Performance: @see https://blog.csdn.net/win_lin/article/details/5 --sendmmsg=on|off Whether enable UDP sendmmsg. Default: $(value2switch $SRS_SENDMMSG). @see http://man7.org/linux/man-pages/man2/sendmmsg.2.html Toolchain options: @see https://github.com/ossrs/srs/issues/1547#issuecomment-576078411 - --static Whether add '-static' to link options. Default: $(value2switch $SRS_STATIC) + --static=on|off Whether add '-static' to link options. Default: $(value2switch $SRS_STATIC) --cc= Use c compiler CC. Default: $SRS_TOOL_CC --cxx= Use c++ compiler CXX. Default: $SRS_TOOL_CXX --ar= Use archive tool AR. Default: $SRS_TOOL_CXX @@ -219,16 +219,8 @@ function parse_user_option() { --jobs) SRS_JOBS=${value} ;; --prefix) SRS_PREFIX=${value} ;; - --static) SRS_STATIC=YES ;; - --log-verbose) SRS_LOG_VERBOSE=YES ;; - --log-info) SRS_LOG_INFO=YES ;; - --log-trace) SRS_LOG_TRACE=YES ;; - --gcov) SRS_GCOV=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 ;; + --static) if [[ $value == off ]]; then SRS_STATIC=NO; else SRS_STATIC=YES; fi ;; --cc) SRS_TOOL_CC=${value} ;; --cxx) SRS_TOOL_CXX=${value} ;; --ar) SRS_TOOL_AR=${value} ;; @@ -240,20 +232,6 @@ function parse_user_option() { --x86-x64) SRS_X86_X64=YES ;; --x86-64) SRS_X86_X64=YES ;; --osx) SRS_OSX=YES ;; - --allow-osx) SRS_OSX=YES ;; - --pi) SRS_PI=YES ;; - --cubie) SRS_CUBIE=YES ;; - --dev) SRS_DEV=YES ;; - --fast-dev) SRS_FAST_DEV=YES ;; - --demo) SRS_DEMO=YES ;; - --fast) SRS_FAST=YES ;; - --disable-all) SRS_DISABLE_ALL=YES ;; - --pure-rtmp) SRS_PURE_RTMP=YES ;; - --full) SRS_ENABLE_ALL=YES ;; - - --memory-watch) SRS_MEM_WATCH=YES ;; - --export-librtmp-project) SRS_EXPORT_LIBRTMP_PROJECT=${value} ;; - --export-librtmp-single) SRS_EXPORT_LIBRTMP_SINGLE=${value} ;; --sendmmsg) if [[ $value == off ]]; then SRS_SENDMMSG=NO; else SRS_SENDMMSG=YES; fi ;; @@ -275,14 +253,6 @@ function parse_user_option() { --without-hds) SRS_HDS=NO ;; --hds) if [[ $value == off ]]; then SRS_HDS=NO; else SRS_HDS=YES; fi ;; - --with-nginx) SRS_NGINX=YES ;; - --without-nginx) SRS_NGINX=NO ;; - --nginx) if [[ $value == off ]]; then SRS_NGINX=NO; else SRS_NGINX=YES; fi ;; - - --with-ffmpeg) SRS_FFMPEG_TOOL=YES ;; - --without-ffmpeg) SRS_FFMPEG_TOOL=NO ;; - --ffmpeg-tool) if [[ $value == off ]]; then SRS_FFMPEG_TOOL=NO; else SRS_FFMPEG_TOOL=YES; fi ;; - --with-transcode) SRS_TRANSCODE=YES ;; --without-transcode) echo "ignore option \"$option\"" ;; --transcode) if [[ $value == off ]]; then SRS_TRANSCODE=NO; else SRS_TRANSCODE=YES; fi ;; @@ -299,10 +269,6 @@ function parse_user_option() { --without-stream-caster) echo "ignore option \"$option\"" ;; --stream-caster) if [[ $value == off ]]; then SRS_STREAM_CASTER=NO; else SRS_STREAM_CASTER=YES; fi ;; - --with-librtmp) SRS_LIBRTMP=YES ;; - --without-librtmp) SRS_LIBRTMP=NO ;; - --librtmp) if [[ $value == off ]]; then SRS_LIBRTMP=NO; else SRS_LIBRTMP=YES; fi ;; - --with-research) SRS_RESEARCH=YES ;; --without-research) SRS_RESEARCH=NO ;; --research) if [[ $value == off ]]; then SRS_RESEARCH=NO; else SRS_RESEARCH=YES; fi ;; @@ -311,6 +277,7 @@ function parse_user_option() { --without-utest) SRS_UTEST=NO ;; --utest) if [[ $value == off ]]; then SRS_UTEST=NO; else SRS_UTEST=YES; fi ;; --cherrypy) if [[ $value == off ]]; then SRS_CHERRYPY=NO; else SRS_CHERRYPY=YES; fi ;; + --gcov) if [[ $value == off ]]; then SRS_GCOV=NO; else SRS_GCOV=YES; fi ;; --with-srt) SRS_SRT=YES ;; --without-srt) SRS_SRT=NO ;; @@ -320,6 +287,7 @@ function parse_user_option() { --without-rtc) SRS_RTC=NO ;; --rtc) if [[ $value == off ]]; then SRS_RTC=NO; else SRS_RTC=YES; fi ;; --simulator) if [[ $value == off ]]; then SRS_SIMULATOR=NO; else SRS_SIMULATOR=YES; fi ;; + --ffmpeg-fit) if [[ $value == off ]]; then SRS_FFMPEG_FIT=NO; else SRS_FFMPEG_FIT=YES; fi ;; --with-gb28181) SRS_GB28181=YES ;; --without-gb28181) SRS_GB28181=NO ;; @@ -327,7 +295,6 @@ function parse_user_option() { --cxx11) if [[ $value == off ]]; then SRS_CXX11=NO; else SRS_CXX11=YES; fi ;; --cxx14) if [[ $value == off ]]; then SRS_CXX14=NO; else SRS_CXX14=YES; fi ;; - --ffmpeg-fit) if [[ $value == off ]]; then SRS_FFMPEG_FIT=NO; else SRS_FFMPEG_FIT=YES; fi ;; --with-clean) SRS_CLEAN=YES ;; --without-clean) SRS_CLEAN=NO ;; @@ -357,14 +324,6 @@ function parse_user_option() { --without-gprof) SRS_GPROF=NO ;; --gprof) if [[ $value == off ]]; then SRS_GPROF=NO; else SRS_GPROF=YES; fi ;; - --with-arm-ubuntu12) SRS_CROSS_BUILD=YES ;; - --without-arm-ubuntu12) SRS_CROSS_BUILD=NO ;; - --arm-ubuntu12) if [[ $value == off ]]; then SRS_CROSS_BUILD=NO; else SRS_CROSS_BUILD=YES; fi ;; - - --with-mips-ubuntu12) SRS_CROSS_BUILD=YES ;; - --without-mips-ubuntu12) SRS_CROSS_BUILD=NO ;; - --mips-ubuntu12) if [[ $value == off ]]; then SRS_CROSS_BUILD=NO; else SRS_CROSS_BUILD=YES; fi ;; - --use-sys-ssl) SRS_USE_SYS_SSL=YES ;; --without-ssl) echo "ignore option \"$option\"" ;; --sys-ssl) if [[ $value == off ]]; then SRS_USE_SYS_SSL=NO; else SRS_USE_SYS_SSL=YES; fi ;; @@ -379,25 +338,62 @@ function parse_user_option() { --without-valgrind) SRS_VALGRIND=NO ;; --valgrind) if [[ $value == off ]]; then SRS_VALGRIND=NO; else SRS_VALGRIND=YES; fi ;; - --with-http-callback) SRS_HTTP_CALLBACK=YES ;; + --with-http-callback) echo "ignore option \"$option\"" ;; --without-http-callback) echo "ignore option \"$option\"" ;; - --http-callback) if [[ $value == off ]]; then SRS_HTTP_CALLBACK=NO; else SRS_HTTP_CALLBACK=YES; fi ;; + --http-callback) echo "ignore option \"$option\"" ;; - --with-http-api) SRS_HTTP_API=YES ;; + --with-http-api) echo "ignore option \"$option\"" ;; --without-http-api) echo "ignore option \"$option\"" ;; - --http-api) if [[ $value == off ]]; then SRS_HTTP_API=NO; else SRS_HTTP_API=YES; fi ;; + --http-api) echo "ignore option \"$option\"" ;; - --with-http-server) SRS_HTTP_SERVER=YES ;; + --with-http-server) echo "ignore option \"$option\"" ;; --without-http-server) echo "ignore option \"$option\"" ;; - --http-server) if [[ $value == off ]]; then SRS_HTTP_SERVER=NO; else SRS_HTTP_SERVER=YES; fi ;; + --http-server) echo "ignore option \"$option\"" ;; - --with-hls) SRS_HLS=YES ;; + --with-hls) echo "ignore option \"$option\"" ;; --without-hls) echo "ignore option \"$option\"" ;; - --hls) if [[ $value == off ]]; then SRS_HLS=NO; else SRS_HLS=YES; fi ;; + --hls) echo "ignore option \"$option\"" ;; - --with-dvr) SRS_DVR=YES ;; + --with-dvr) echo "ignore option \"$option\"" ;; --without-dvr) echo "ignore option \"$option\"" ;; - --dvr) if [[ $value == off ]]; then SRS_DVR=NO; else SRS_DVR=YES; fi ;; + --dvr) echo "ignore option \"$option\"" ;; + + --log-verbose) if [[ $value == off ]]; then SRS_LOG_VERBOSE=NO; else SRS_LOG_VERBOSE=YES; fi ;; + --log-info) if [[ $value == off ]]; then SRS_LOG_INFO=NO; else SRS_LOG_INFO=YES; fi ;; + --log-trace) if [[ $value == off ]]; then SRS_LOG_TRACE=NO; else SRS_LOG_TRACE=YES; fi ;; + --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 ;; + + # Deprecated, might be removed in future. + --arm) SRS_CROSS_BUILD=YES ;; + --mips) SRS_CROSS_BUILD=YES ;; + --pi) SRS_PI=YES ;; + --cubie) SRS_CUBIE=YES ;; + --dev) SRS_DEV=YES ;; + --fast-dev) SRS_FAST_DEV=YES ;; + --demo) SRS_DEMO=YES ;; + --fast) SRS_FAST=YES ;; + --disable-all) SRS_DISABLE_ALL=YES ;; + --pure-rtmp) SRS_PURE_RTMP=YES ;; + --full) SRS_ENABLE_ALL=YES ;; + --memory-watch) SRS_MEM_WATCH=YES ;; + --export-librtmp-project) SRS_EXPORT_LIBRTMP_PROJECT=${value} ;; + --export-librtmp-single) SRS_EXPORT_LIBRTMP_SINGLE=${value} ;; + --with-nginx) SRS_NGINX=YES ;; + --without-nginx) SRS_NGINX=NO ;; + --nginx) if [[ $value == off ]]; then SRS_NGINX=NO; else SRS_NGINX=YES; fi ;; + --with-ffmpeg) SRS_FFMPEG_TOOL=YES ;; + --without-ffmpeg) SRS_FFMPEG_TOOL=NO ;; + --ffmpeg-tool) if [[ $value == off ]]; then SRS_FFMPEG_TOOL=NO; else SRS_FFMPEG_TOOL=YES; fi ;; + --with-librtmp) SRS_LIBRTMP=YES ;; + --without-librtmp) SRS_LIBRTMP=NO ;; + --librtmp) if [[ $value == off ]]; then SRS_LIBRTMP=NO; else SRS_LIBRTMP=YES; fi ;; + --with-arm-ubuntu12) SRS_CROSS_BUILD=YES ;; + --without-arm-ubuntu12) SRS_CROSS_BUILD=NO ;; + --arm-ubuntu12) if [[ $value == off ]]; then SRS_CROSS_BUILD=NO; else SRS_CROSS_BUILD=YES; fi ;; + --with-mips-ubuntu12) SRS_CROSS_BUILD=YES ;; + --without-mips-ubuntu12) SRS_CROSS_BUILD=NO ;; + --mips-ubuntu12) if [[ $value == off ]]; then SRS_CROSS_BUILD=NO; else SRS_CROSS_BUILD=YES; fi ;; *) echo "$0: error: invalid option \"$option\"" @@ -426,6 +422,16 @@ function value2switch() { fi } +function switch2value() { + if [[ $1 == on ]]; then + echo YES; + elif [[ $1 == off ]]; then + echo NO; + else + echo undefined; + fi +} + ##################################################################################### # parse preset options ##################################################################################### @@ -534,49 +540,49 @@ function regenerate_options() { SRS_AUTO_USER_CONFIGURE=`echo $opt` # regenerate the options for default values. SRS_AUTO_CONFIGURE="--prefix=${SRS_PREFIX}" - if [ $SRS_HLS = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --hls=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --hls=off"; fi - if [ $SRS_HDS = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --hds=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --hds=off"; fi - if [ $SRS_DVR = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --dvr=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --dvr=off"; fi - if [ $SRS_SSL = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ssl=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ssl=off"; fi - if [ $SRS_HTTPS = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --https=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --https=off"; fi - if [ $SRS_SSL_1_0 = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ssl-1-0=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ssl-1-0=off"; fi - if [ $SRS_SSL_LOCAL = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ssl-local=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ssl-local=off"; fi - if [ $SRS_USE_SYS_SSL = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --sys-ssl=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --sys-ssl=off"; fi - if [ $SRS_TRANSCODE = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --transcode=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --transcode=off"; fi - if [ $SRS_INGEST = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ingest=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ingest=off"; fi - if [ $SRS_STAT = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --stat=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --stat=off"; fi - if [ $SRS_HTTP_CALLBACK = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --http-callback=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --http-callback=off"; fi - if [ $SRS_HTTP_SERVER = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --http-server=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --http-server=off"; fi - if [ $SRS_STREAM_CASTER = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --stream-caster=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --stream-caster=off"; fi - if [ $SRS_HTTP_API = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --http-api=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --http-api=off"; fi - if [ $SRS_UTEST = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --utest=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --utest=off"; fi - if [ $SRS_CHERRYPY = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cherrypy=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cherrypy=off"; fi - if [ $SRS_SRT = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --srt=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --srt=off"; fi - if [ $SRS_RTC = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --rtc=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --rtc=off"; fi - if [ $SRS_SIMULATOR = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --simulator=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --simulator=off"; fi - if [ $SRS_GB28181 = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gb28181=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gb28181=off"; fi - if [ $SRS_CXX11 = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cxx11=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cxx11=off"; fi - if [ $SRS_CXX14 = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cxx14=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cxx14=off"; fi - if [ $SRS_FFMPEG_FIT = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ffmpeg-fit=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ffmpeg-fit=off"; fi - if [ $SRS_NASM = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --nasm=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --nasm=off"; fi - if [ $SRS_SRTP_ASM = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --srtp-nasm=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --srtp-nasm=off"; fi - if [ $SRS_SENDMMSG = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --sendmmsg=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --sendmmsg=off"; fi - if [ $SRS_CLEAN = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --clean=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --clean=off"; fi - if [ $SRS_GPERF = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gperf=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gperf=off"; fi - if [ $SRS_GPERF_MC = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gmc=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gmc=off"; fi - if [ $SRS_GPERF_MD = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gmd=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gmd=off"; fi - if [ $SRS_GPERF_MP = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gmp=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gmp=off"; fi - if [ $SRS_GPERF_CP = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gcp=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gcp=off"; fi - if [ $SRS_GPROF = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gprof=on"; else SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gprof=off"; fi - if [ $SRS_STATIC = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --static"; fi - if [ $SRS_SHARED_ST = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --use-shared-st"; fi - if [ $SRS_SHARED_SRT = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --use-shared-srt"; fi - if [ $SRS_LOG_VERBOSE = YES ]; then SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --log-verbose"; fi - 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=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 + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --hls=$(value2switch $SRS_HLS)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --hds=$(value2switch $SRS_HDS)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --dvr=$(value2switch $SRS_DVR)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ssl=$(value2switch $SRS_SSL)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --https=$(value2switch $SRS_HTTPS)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ssl-1-0=$(value2switch $SRS_SSL_1_0)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ssl-local=$(value2switch $SRS_SSL_LOCAL)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --sys-ssl=$(value2switch $SRS_USE_SYS_SSL)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --transcode=$(value2switch $SRS_TRANSCODE)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ingest=$(value2switch $SRS_INGEST)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --stat=$(value2switch $SRS_STAT)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --http-callback=$(value2switch $SRS_HTTP_CALLBACK)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --http-server=$(value2switch $SRS_HTTP_SERVER)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --stream-caster=$(value2switch $SRS_STREAM_CASTER)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --http-api=$(value2switch $SRS_HTTP_API)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --utest=$(value2switch $SRS_UTEST)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cherrypy=$(value2switch $SRS_CHERRYPY)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --srt=$(value2switch $SRS_SRT)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --rtc=$(value2switch $SRS_RTC)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --simulator=$(value2switch $SRS_SIMULATOR)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gb28181=$(value2switch $SRS_GB28181)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cxx11=$(value2switch $SRS_CXX11)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cxx14=$(value2switch $SRS_CXX14)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --ffmpeg-fit=$(value2switch $SRS_FFMPEG_FIT)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --nasm=$(value2switch $SRS_NASM)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --srtp-nasm=$(value2switch $SRS_SRTP_ASM)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --sendmmsg=$(value2switch $SRS_SENDMMSG)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --clean=$(value2switch $SRS_CLEAN)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gperf=$(value2switch $SRS_GPERF)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gmc=$(value2switch $SRS_GPERF_MC)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gmd=$(value2switch $SRS_GPERF_MD)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gmp=$(value2switch $SRS_GPERF_MP)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gcp=$(value2switch $SRS_GPERF_CP)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gprof=$(value2switch $SRS_GPROF)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --static=$(value2switch $SRS_STATIC)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --use-shared-st=$(value2switch $SRS_SHARED_ST)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --use-shared-srt=$(value2switch $SRS_SHARED_SRT)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --log-verbose=$(value2switch $SRS_LOG_VERBOSE)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --log-info=$(value2switch $SRS_LOG_INFO)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --log-trace=$(value2switch $SRS_LOG_TRACE)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --gcov=$(value2switch $SRS_GCOV)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --debug=$(value2switch $SRS_DEBUG)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --debug-stats=$(value2switch $SRS_DEBUG_STATS)" 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 From 1f621a6db3b2a7a0dd48547674fb680390db8e6d Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 15 Feb 2021 19:33:40 +0800 Subject: [PATCH 23/28] Remove dead code: memory watch --- trunk/auto/auto_headers.sh | 6 -- trunk/auto/options.sh | 4 - trunk/configure | 2 +- trunk/ide/srs_upp/srs_upp.upp | 2 - trunk/ide/srs_vs2010/srs.vcxproj | 2 - .../srs_xcode.xcodeproj/project.pbxproj | 5 -- trunk/src/app/srs_app_server.cpp | 13 --- trunk/src/core/srs_core_mem_watch.cpp | 86 ------------------- trunk/src/core/srs_core_mem_watch.hpp | 47 ---------- trunk/src/kernel/srs_kernel_flv.cpp | 11 --- trunk/src/main/srs_main_server.cpp | 5 -- 11 files changed, 1 insertion(+), 182 deletions(-) delete mode 100644 trunk/src/core/srs_core_mem_watch.cpp delete mode 100644 trunk/src/core/srs_core_mem_watch.hpp diff --git a/trunk/auto/auto_headers.sh b/trunk/auto/auto_headers.sh index 19498237c..1704b182e 100755 --- a/trunk/auto/auto_headers.sh +++ b/trunk/auto/auto_headers.sh @@ -111,12 +111,6 @@ else srs_undefine_macro "SRS_HTTPS" $SRS_AUTO_HEADERS_H fi -if [ $SRS_MEM_WATCH = YES ]; then - srs_define_macro "SRS_MEM_WATCH" $SRS_AUTO_HEADERS_H -else - srs_undefine_macro "SRS_MEM_WATCH" $SRS_AUTO_HEADERS_H -fi - if [ $SRS_UTEST = YES ]; then srs_define_macro "SRS_UTEST" $SRS_AUTO_HEADERS_H else diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh index 18d0e7919..eb4433ecb 100755 --- a/trunk/auto/options.sh +++ b/trunk/auto/options.sh @@ -76,9 +76,6 @@ SRS_LOG_TRACE=YES # donot compile ssl, use system ssl(-lssl) if required. # TODO: Use pkg-config to get the openssl path. SRS_USE_SYS_SSL=NO -# enable memory watch, detect memory leak, -# similar to gmc, should disable in release version for hurts performance. -SRS_MEM_WATCH=NO # export the srs-librtmp to specified project, NO to disable it. SRS_EXPORT_LIBRTMP_PROJECT=NO # export the srs-librtmp to a single .h and .c, NO to disable it. @@ -376,7 +373,6 @@ function parse_user_option() { --disable-all) SRS_DISABLE_ALL=YES ;; --pure-rtmp) SRS_PURE_RTMP=YES ;; --full) SRS_ENABLE_ALL=YES ;; - --memory-watch) SRS_MEM_WATCH=YES ;; --export-librtmp-project) SRS_EXPORT_LIBRTMP_PROJECT=${value} ;; --export-librtmp-single) SRS_EXPORT_LIBRTMP_SINGLE=${value} ;; --with-nginx) SRS_NGINX=YES ;; diff --git a/trunk/configure b/trunk/configure index 2b0f5be21..c49825233 100755 --- a/trunk/configure +++ b/trunk/configure @@ -204,7 +204,7 @@ MODULE_ID="CORE" MODULE_DEPENDS=() ModuleLibIncs=(${SRS_OBJS_DIR}) MODULE_FILES=("srs_core" "srs_core_version4" "srs_core_autofree" "srs_core_performance" - "srs_core_mem_watch" "srs_core_time") + "srs_core_time") CORE_INCS="src/core"; MODULE_DIR=${CORE_INCS} . auto/modules.sh CORE_OBJS="${MODULE_OBJS[@]}" # diff --git a/trunk/ide/srs_upp/srs_upp.upp b/trunk/ide/srs_upp/srs_upp.upp index 3c82bed66..36f931238 100755 --- a/trunk/ide/srs_upp/srs_upp.upp +++ b/trunk/ide/srs_upp/srs_upp.upp @@ -9,8 +9,6 @@ file ../../src/core/srs_core.cpp, ../../src/core/srs_core_autofree.hpp, ../../src/core/srs_core_autofree.cpp, - ../../src/core/srs_core_mem_watch.hpp, - ../../src/core/srs_core_mem_watch.cpp, ../../src/core/srs_core_performance.hpp, ../../src/core/srs_core_performance.cpp, kernel readonly separator, diff --git a/trunk/ide/srs_vs2010/srs.vcxproj b/trunk/ide/srs_vs2010/srs.vcxproj index 95673b490..5c153cca3 100755 --- a/trunk/ide/srs_vs2010/srs.vcxproj +++ b/trunk/ide/srs_vs2010/srs.vcxproj @@ -101,7 +101,6 @@ - @@ -167,7 +166,6 @@ - diff --git a/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj b/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj index 8f1ae9bd4..091a53f44 100644 --- a/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj +++ b/trunk/ide/srs_xcode/srs_xcode.xcodeproj/project.pbxproj @@ -81,7 +81,6 @@ 3C4AB9331B8C9148006627D3 /* srs_app_ng_exec.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C4AB9311B8C9148006627D3 /* srs_app_ng_exec.cpp */; }; 3C4D184C1E73F133008806F7 /* srs_app_fragment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C4D184A1E73F133008806F7 /* srs_app_fragment.cpp */; }; 3C4F97121B8B466D00FF0E46 /* srs_app_process.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C4F97101B8B466D00FF0E46 /* srs_app_process.cpp */; }; - 3C5265B41B241BF0009CA186 /* srs_core_mem_watch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C5265B21B241BF0009CA186 /* srs_core_mem_watch.cpp */; }; 3C663F0F1AB0155100286D8B /* srs_aac_raw_publish.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F021AB0155100286D8B /* srs_aac_raw_publish.c */; }; 3C663F101AB0155100286D8B /* srs_audio_raw_publish.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C663F031AB0155100286D8B /* srs_audio_raw_publish.c */; }; 3C6F2D751E8653BF003D0805 /* srs_main_mp4_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3C6F2D741E8653BF003D0805 /* srs_main_mp4_parser.cpp */; }; @@ -343,7 +342,6 @@ 3C4D184B1E73F133008806F7 /* srs_app_fragment.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_fragment.hpp; path = ../../../src/app/srs_app_fragment.hpp; sourceTree = ""; }; 3C4F97101B8B466D00FF0E46 /* srs_app_process.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_app_process.cpp; path = ../../../src/app/srs_app_process.cpp; sourceTree = ""; }; 3C4F97111B8B466D00FF0E46 /* srs_app_process.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = srs_app_process.hpp; path = ../../../src/app/srs_app_process.hpp; sourceTree = ""; }; - 3C5265B21B241BF0009CA186 /* srs_core_mem_watch.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = srs_core_mem_watch.cpp; path = ../../../src/core/srs_core_mem_watch.cpp; sourceTree = ""; }; 3C6673CF1DF7B93200A6DF57 /* readme.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = readme.txt; path = ../../../modules/readme.txt; sourceTree = ""; }; 3C6673D11DF7B95E00A6DF57 /* config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = config; path = "../../../modules/hls-ingester/config"; sourceTree = ""; }; 3C6F2D731E86536B003D0805 /* config */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = config; path = "../../../modules/mp4-parser/config"; sourceTree = ""; }; @@ -473,8 +471,6 @@ children = ( 3C1231F01AAE652C00CE8F6C /* srs_core_autofree.cpp */, 3C1231F11AAE652C00CE8F6C /* srs_core_autofree.hpp */, - 3C5265B21B241BF0009CA186 /* srs_core_mem_watch.cpp */, - 3C5265B31B241BF0009CA186 /* srs_core_mem_watch.hpp */, 3C1231F21AAE652C00CE8F6C /* srs_core_performance.cpp */, 3C1231F31AAE652C00CE8F6C /* srs_core_performance.hpp */, 3C1231F41AAE652D00CE8F6C /* srs_core.cpp */, @@ -984,7 +980,6 @@ 3C663F151AB0155100286D8B /* srs_h264_raw_publish.c in Sources */, 3C1231F61AAE652D00CE8F6C /* srs_core_autofree.cpp in Sources */, 8C0652B12035B5BA000B0661 /* srs_app_coworkers.cpp in Sources */, - 3C5265B41B241BF0009CA186 /* srs_core_mem_watch.cpp in Sources */, 3C1EE6D71AB1367D00576EE9 /* README.md in Sources */, 3C82802C1BAFF8CC004A1794 /* srs_kafka_stack.cpp in Sources */, 3C1232411AAE81A400CE8F6C /* srs_raw_avc.cpp in Sources */, diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 5bfe48111..39141bf55 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -50,7 +50,6 @@ using namespace std; #include #include #include -#include #include #include #include @@ -745,10 +744,6 @@ void SrsServer::dispose() _srs_sources->dispose(); // @remark don't dispose all connections, for too slow. - -#ifdef SRS_MEM_WATCH - srs_memory_report(); -#endif } void SrsServer::gracefully_dispose() @@ -790,10 +785,6 @@ void SrsServer::gracefully_dispose() _srs_sources->dispose(); srs_trace("source disposed"); -#ifdef SRS_MEM_WATCH - srs_memory_report(); -#endif - srs_usleep(_srs_config->get_grace_final_wait()); srs_trace("final wait for %dms", srsu2msi(_srs_config->get_grace_final_wait())); } @@ -1169,10 +1160,6 @@ void SrsServer::on_signal(int signo) #ifdef SRS_GPERF_MC srs_trace("gmc is on, main cycle will terminate normally, signo=%d", signo); signal_gmc_stop = true; -#else - #ifdef SRS_MEM_WATCH - srs_memory_report(); - #endif #endif } diff --git a/trunk/src/core/srs_core_mem_watch.cpp b/trunk/src/core/srs_core_mem_watch.cpp deleted file mode 100644 index bc39e8523..000000000 --- a/trunk/src/core/srs_core_mem_watch.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2013-2020 Winlin - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#include - -#ifdef SRS_MEM_WATCH - -#include -#include -using namespace std; - -struct SrsMemoryObject -{ - void* ptr; - std::string category; - int size; -}; - -std::map _srs_ptrs; - -void srs_memory_watch(void* ptr, string category, int size) -{ - SrsMemoryObject* obj = NULL; - - std::map::iterator it; - if ((it = _srs_ptrs.find(ptr)) != _srs_ptrs.end()) { - obj = it->second; - } else { - obj = new SrsMemoryObject(); - _srs_ptrs[ptr] = obj; - } - - obj->ptr = ptr; - obj->category = category; - obj->size = size; -} - -void srs_memory_unwatch(void* ptr) -{ - std::map::iterator it; - if ((it = _srs_ptrs.find(ptr)) != _srs_ptrs.end()) { - SrsMemoryObject* obj = it->second; - srs_freep(obj); - - _srs_ptrs.erase(it); - } -} - -void srs_memory_report() -{ - printf("srs memory watch leak report:\n"); - - int total = 0; - std::map::iterator it; - for (it = _srs_ptrs.begin(); it != _srs_ptrs.end(); ++it) { - SrsMemoryObject* obj = it->second; - printf(" %s: %#" PRIx64 ", %dB\n", obj->category.c_str(), (int64_t)obj->ptr, obj->size); - total += obj->size; - } - - printf("%d objects leak %dKB.\n", (int)_srs_ptrs.size(), total / 1024); - printf("@remark use script to cleanup for memory watch: ./etc/init.d/srs stop\n"); -} - -#endif - diff --git a/trunk/src/core/srs_core_mem_watch.hpp b/trunk/src/core/srs_core_mem_watch.hpp deleted file mode 100644 index bbd154a15..000000000 --- a/trunk/src/core/srs_core_mem_watch.hpp +++ /dev/null @@ -1,47 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2013-2020 Winlin - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef SRS_CORE_MEM_WATCH_HPP -#define SRS_CORE_MEM_WATCH_HPP - -#include - -#ifdef SRS_MEM_WATCH - -#warning "MemoryWatch is deprecated." - -#include - -// Watch the specified memory. -extern void srs_memory_watch(void* ptr, std::string category, int size); - -// Unwatch the specified memory. -extern void srs_memory_unwatch(void* ptr); - -// Report the memory watch. -extern void srs_memory_report(); - -#endif - -#endif - diff --git a/trunk/src/kernel/srs_kernel_flv.cpp b/trunk/src/kernel/srs_kernel_flv.cpp index edbcb829c..ff41f6f4c 100644 --- a/trunk/src/kernel/srs_kernel_flv.cpp +++ b/trunk/src/kernel/srs_kernel_flv.cpp @@ -38,7 +38,6 @@ using namespace std; #include #include #include -#include #include SrsMessageHeader::SrsMessageHeader() @@ -161,9 +160,6 @@ SrsCommonMessage::SrsCommonMessage() SrsCommonMessage::~SrsCommonMessage() { -#ifdef SRS_MEM_WATCH - srs_memory_unwatch(payload); -#endif srs_freepa(payload); } @@ -173,10 +169,6 @@ void SrsCommonMessage::create_payload(int size) payload = new char[size]; srs_verbose("create payload for RTMP message. size=%d", size); - -#ifdef SRS_MEM_WATCH - srs_memory_watch(payload, "RTMP.msg.payload", size); -#endif } srs_error_t SrsCommonMessage::create(SrsMessageHeader* pheader, char* body, int size) @@ -211,9 +203,6 @@ SrsSharedPtrMessage::SrsSharedPtrPayload::SrsSharedPtrPayload() SrsSharedPtrMessage::SrsSharedPtrPayload::~SrsSharedPtrPayload() { -#ifdef SRS_MEM_WATCH - srs_memory_unwatch(payload); -#endif srs_freepa(payload); } diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index 65fc1cb65..d1657d2bc 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -355,11 +355,6 @@ void show_macro_features() srs_trace("system default latency(ms): mw(0-%d) + mr(0-%d) + play-queue(0-%d)", srsu2msi(SRS_PERF_MW_SLEEP), possible_mr_latency, srsu2msi(SRS_PERF_PLAY_QUEUE)); -#ifdef SRS_MEM_WATCH -#warning "srs memory watcher will hurts performance. user should kill by SIGTERM or init.d script." - srs_warn("srs memory watcher will hurts performance. user should kill by SIGTERM or init.d script."); -#endif - #if VERSION_MAJOR > VERSION_STABLE #warning "Current branch is not stable." srs_warn("%s/%s is not stable", RTMP_SIG_SRS_KEY, RTMP_SIG_SRS_VERSION); From 61eeb781b720589a0be2dfd815bf0d65c5aedb92 Mon Sep 17 00:00:00 2001 From: winlin Date: Mon, 15 Feb 2021 19:47:02 +0800 Subject: [PATCH 24/28] Always link with pthread --- trunk/configure | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/trunk/configure b/trunk/configure index c49825233..4dd1d99ae 100755 --- a/trunk/configure +++ b/trunk/configure @@ -170,11 +170,7 @@ if [[ $SRS_SRT == YES ]]; then fi # the link options, always use static link -SrsLinkOptions="-ldl"; -if [[ $SRS_SRT == YES || $SRS_RTC == YES ]]; then - SrsLinkOptions="${SrsLinkOptions} -lpthread"; -fi - +SrsLinkOptions="-ldl -lpthread"; if [[ $SRS_SSL == YES && $SRS_USE_SYS_SSL == YES ]]; then SrsLinkOptions="${SrsLinkOptions} -lssl -lcrypto"; fi From 548fcd627b41e564f0a2fed8adb74624ecf5fafc Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 18 Feb 2021 11:39:25 +0800 Subject: [PATCH 25/28] Config: Update config files, daemon off, log to console --- trunk/conf/demo.19350.conf | 5 ++--- trunk/conf/demo.conf | 5 ++--- trunk/conf/dvr.mp4.conf | 2 ++ trunk/conf/edge.conf | 2 ++ trunk/conf/edge2.conf | 2 ++ trunk/conf/exec.conf | 2 ++ trunk/conf/ffmpeg.transcode.conf | 2 ++ trunk/conf/forward.master.conf | 2 ++ trunk/conf/forward.slave.conf | 2 ++ trunk/conf/hls.conf | 2 ++ trunk/conf/hls.realtime.conf | 2 ++ trunk/conf/http.api.raw.conf | 4 ++-- trunk/conf/http.flv.live.conf | 2 ++ trunk/conf/http.flv.live.edge1.conf | 2 ++ trunk/conf/http.flv.live.edge2.conf | 2 ++ trunk/conf/ingest.conf | 2 ++ trunk/conf/ingest.rtsp.conf | 2 ++ trunk/conf/origin.conf | 2 ++ trunk/conf/push.gb28181.conf | 2 ++ trunk/conf/realtime.conf | 2 ++ trunk/conf/rtc.conf | 3 ++- trunk/conf/rtmp.conf | 2 ++ trunk/conf/srs.conf | 4 ---- trunk/conf/srt.conf | 2 ++ 24 files changed, 46 insertions(+), 13 deletions(-) diff --git a/trunk/conf/demo.19350.conf b/trunk/conf/demo.19350.conf index c27e57500..b2c6bea46 100644 --- a/trunk/conf/demo.19350.conf +++ b/trunk/conf/demo.19350.conf @@ -4,9 +4,8 @@ listen 19350; max_connections 1000; -daemon on; -srs_log_tank file; -srs_log_file ./objs/srs.demo.19350.log; +daemon off; +srs_log_tank console; pid ./objs/srs.demo.19350.pid; vhost __defaultVhost__ { diff --git a/trunk/conf/demo.conf b/trunk/conf/demo.conf index 4b1ef9879..1bdd46b86 100644 --- a/trunk/conf/demo.conf +++ b/trunk/conf/demo.conf @@ -4,9 +4,8 @@ listen 1935; max_connections 1000; -daemon on; -srs_log_tank file; -srs_log_file ./objs/srs.demo.log; +daemon off; +srs_log_tank console; pid ./objs/srs.demo.pid; chunk_size 60000; diff --git a/trunk/conf/dvr.mp4.conf b/trunk/conf/dvr.mp4.conf index dccb8c3d6..a4f888c3a 100644 --- a/trunk/conf/dvr.mp4.conf +++ b/trunk/conf/dvr.mp4.conf @@ -4,6 +4,8 @@ listen 1935; max_connections 1000; +daemon off; +srs_log_tank console; vhost __defaultVhost__ { dvr { enabled on; diff --git a/trunk/conf/edge.conf b/trunk/conf/edge.conf index d4233b31f..36acb431f 100644 --- a/trunk/conf/edge.conf +++ b/trunk/conf/edge.conf @@ -5,6 +5,8 @@ listen 1935; max_connections 1000; pid objs/edge.pid; +daemon off; +srs_log_tank console; vhost __defaultVhost__ { cluster { mode remote; diff --git a/trunk/conf/edge2.conf b/trunk/conf/edge2.conf index 52d469a44..193238d88 100644 --- a/trunk/conf/edge2.conf +++ b/trunk/conf/edge2.conf @@ -5,6 +5,8 @@ listen 1935; max_connections 1000; pid objs/edge2.pid; +daemon off; +srs_log_tank console; vhost __defaultVhost__ { cluster { mode remote; diff --git a/trunk/conf/exec.conf b/trunk/conf/exec.conf index 6390217d6..2f4481092 100644 --- a/trunk/conf/exec.conf +++ b/trunk/conf/exec.conf @@ -4,6 +4,8 @@ listen 1935; max_connections 1000; +daemon off; +srs_log_tank console; vhost __defaultVhost__ { exec { enabled on; diff --git a/trunk/conf/ffmpeg.transcode.conf b/trunk/conf/ffmpeg.transcode.conf index 1bb505556..d785a44ff 100644 --- a/trunk/conf/ffmpeg.transcode.conf +++ b/trunk/conf/ffmpeg.transcode.conf @@ -4,6 +4,8 @@ listen 1935; max_connections 1000; +daemon off; +srs_log_tank console; vhost __defaultVhost__ { transcode { enabled on; diff --git a/trunk/conf/forward.master.conf b/trunk/conf/forward.master.conf index 2366f3195..630a4c84e 100644 --- a/trunk/conf/forward.master.conf +++ b/trunk/conf/forward.master.conf @@ -5,6 +5,8 @@ listen 1935; max_connections 1000; pid ./objs/srs.master.pid; +daemon off; +srs_log_tank console; vhost __defaultVhost__ { forward { enabled on; diff --git a/trunk/conf/forward.slave.conf b/trunk/conf/forward.slave.conf index f4cc1a37f..98286e33e 100644 --- a/trunk/conf/forward.slave.conf +++ b/trunk/conf/forward.slave.conf @@ -5,5 +5,7 @@ listen 19350; max_connections 1000; pid ./objs/srs.slave.pid; +daemon off; +srs_log_tank console; vhost __defaultVhost__ { } diff --git a/trunk/conf/hls.conf b/trunk/conf/hls.conf index a0979eb19..735c1dd0d 100644 --- a/trunk/conf/hls.conf +++ b/trunk/conf/hls.conf @@ -4,6 +4,8 @@ listen 1935; max_connections 1000; +daemon off; +srs_log_tank console; http_server { enabled on; listen 8080; diff --git a/trunk/conf/hls.realtime.conf b/trunk/conf/hls.realtime.conf index 36052418c..36453413f 100644 --- a/trunk/conf/hls.realtime.conf +++ b/trunk/conf/hls.realtime.conf @@ -4,6 +4,8 @@ listen 1935; max_connections 1000; +daemon off; +srs_log_tank console; http_server { enabled on; listen 8080; diff --git a/trunk/conf/http.api.raw.conf b/trunk/conf/http.api.raw.conf index 00b2f80a6..df0180fbc 100644 --- a/trunk/conf/http.api.raw.conf +++ b/trunk/conf/http.api.raw.conf @@ -3,8 +3,8 @@ listen 1935; max_connections 1000; -srs_log_tank file; -srs_log_file ./objs/srs.log; +daemon off; +srs_log_tank console; http_api { enabled on; listen 1985; diff --git a/trunk/conf/http.flv.live.conf b/trunk/conf/http.flv.live.conf index 09ba1dffc..78c28546d 100644 --- a/trunk/conf/http.flv.live.conf +++ b/trunk/conf/http.flv.live.conf @@ -4,6 +4,8 @@ listen 1935; max_connections 1000; +daemon off; +srs_log_tank console; http_server { enabled on; listen 8080; diff --git a/trunk/conf/http.flv.live.edge1.conf b/trunk/conf/http.flv.live.edge1.conf index ac2f6b344..23af7d1ca 100644 --- a/trunk/conf/http.flv.live.edge1.conf +++ b/trunk/conf/http.flv.live.edge1.conf @@ -5,6 +5,8 @@ listen 19351; max_connections 1000; pid objs/srs.flv.19351.pid; +daemon off; +srs_log_tank console; http_server { enabled on; listen 8081; diff --git a/trunk/conf/http.flv.live.edge2.conf b/trunk/conf/http.flv.live.edge2.conf index c1ab67551..fcf226066 100644 --- a/trunk/conf/http.flv.live.edge2.conf +++ b/trunk/conf/http.flv.live.edge2.conf @@ -5,6 +5,8 @@ listen 19352; max_connections 1000; pid objs/srs.flv.19352.pid; +daemon off; +srs_log_tank console; http_server { enabled on; listen 8082; diff --git a/trunk/conf/ingest.conf b/trunk/conf/ingest.conf index 7b3d1c2ed..d77a2f954 100644 --- a/trunk/conf/ingest.conf +++ b/trunk/conf/ingest.conf @@ -4,6 +4,8 @@ listen 1935; max_connections 1000; +daemon off; +srs_log_tank console; vhost __defaultVhost__ { ingest livestream { enabled on; diff --git a/trunk/conf/ingest.rtsp.conf b/trunk/conf/ingest.rtsp.conf index c89d7b5e1..bffb2a726 100644 --- a/trunk/conf/ingest.rtsp.conf +++ b/trunk/conf/ingest.rtsp.conf @@ -4,6 +4,8 @@ listen 1935; max_connections 1000; +daemon off; +srs_log_tank console; vhost __defaultVhost__ { ingest { enabled on; diff --git a/trunk/conf/origin.conf b/trunk/conf/origin.conf index 5f9eaeefc..9b7b779a1 100644 --- a/trunk/conf/origin.conf +++ b/trunk/conf/origin.conf @@ -5,5 +5,7 @@ listen 19350; max_connections 1000; pid ./objs/origin.pid; +daemon off; +srs_log_tank console; vhost __defaultVhost__ { } diff --git a/trunk/conf/push.gb28181.conf b/trunk/conf/push.gb28181.conf index 64578d801..7f2076243 100644 --- a/trunk/conf/push.gb28181.conf +++ b/trunk/conf/push.gb28181.conf @@ -2,6 +2,8 @@ listen 1935; max_connections 1000; +daemon off; +srs_log_tank console; http_api { enabled on; diff --git a/trunk/conf/realtime.conf b/trunk/conf/realtime.conf index 26b9b989f..482add3ea 100644 --- a/trunk/conf/realtime.conf +++ b/trunk/conf/realtime.conf @@ -4,6 +4,8 @@ listen 1935; max_connections 1000; +daemon off; +srs_log_tank console; vhost __defaultVhost__ { tcp_nodelay on min_latency on; diff --git a/trunk/conf/rtc.conf b/trunk/conf/rtc.conf index 13148cee0..02b97079b 100644 --- a/trunk/conf/rtc.conf +++ b/trunk/conf/rtc.conf @@ -1,7 +1,8 @@ listen 1935; max_connections 1000; -srs_log_file ./objs/srs.log; +daemon off; +srs_log_tank console; http_server { enabled on; diff --git a/trunk/conf/rtmp.conf b/trunk/conf/rtmp.conf index 94c740c50..e05f15408 100644 --- a/trunk/conf/rtmp.conf +++ b/trunk/conf/rtmp.conf @@ -4,5 +4,7 @@ listen 1935; max_connections 1000; +daemon off; +srs_log_tank console; vhost __defaultVhost__ { } diff --git a/trunk/conf/srs.conf b/trunk/conf/srs.conf index 736547445..eb7725331 100644 --- a/trunk/conf/srs.conf +++ b/trunk/conf/srs.conf @@ -15,10 +15,6 @@ http_server { listen 8080; dir ./objs/nginx/html; } -stats { - network 0; - disk sda sdb xvda xvdb; -} vhost __defaultVhost__ { hls { enabled on; diff --git a/trunk/conf/srt.conf b/trunk/conf/srt.conf index d85752289..f60ce5ded 100644 --- a/trunk/conf/srt.conf +++ b/trunk/conf/srt.conf @@ -2,6 +2,8 @@ listen 1935; max_connections 1000; +daemon off; +srs_log_tank console; http_api { enabled on; From fdaee20b8155f2825df01dde8626d375cee05831 Mon Sep 17 00:00:00 2001 From: "xialixin@kanzhun.com" Date: Thu, 18 Feb 2021 21:51:49 +0800 Subject: [PATCH 26/28] For #2200, Enable RTC and FLV for GB28181 --- trunk/auto/depends.sh | 9 + trunk/conf/push.gb28181.conf | 33 +- trunk/configure | 21 +- trunk/research/players/srs_gb28181.html | 868 +++++++----------- trunk/src/app/srs_app_gb28181.cpp | 89 +- trunk/src/app/srs_app_gb28181.hpp | 25 +- trunk/src/app/srs_app_gb28181_sip.cpp | 2 +- trunk/src/app/srs_app_gb28181_sip.hpp | 2 +- ...itbuffer.cpp => srs_app_rtc_jitbuffer.cpp} | 860 +++++++++++++---- ...itbuffer.hpp => srs_app_rtc_jitbuffer.hpp} | 223 +++-- .../srs_sip_stack.cpp => app/srs_app_sip.cpp} | 2 +- .../srs_sip_stack.hpp => app/srs_app_sip.hpp} | 0 12 files changed, 1289 insertions(+), 845 deletions(-) rename trunk/src/app/{srs_app_gb28181_jitbuffer.cpp => srs_app_rtc_jitbuffer.cpp} (62%) rename trunk/src/app/{srs_app_gb28181_jitbuffer.hpp => srs_app_rtc_jitbuffer.hpp} (69%) rename trunk/src/{protocol/srs_sip_stack.cpp => app/srs_app_sip.cpp} (99%) rename trunk/src/{protocol/srs_sip_stack.hpp => app/srs_app_sip.hpp} (100%) diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index 11b5785d0..cda4091ea 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -269,6 +269,15 @@ function OSX_prepare() echo "Please install pkg-config"; exit -1; fi + if [[ $SRS_GB28181 == YES ]]; then + if [[ ! -f /usr/local/opt/libiconv/lib/libiconv.a ]]; then + echo "install libiconv" + echo "brew install libiconv" + brew install libiconv; ret=$?; if [[ 0 -ne $ret ]]; then return $ret; fi + echo "install libiconv success" + fi + fi + echo "OSX install tools success" return 0 } diff --git a/trunk/conf/push.gb28181.conf b/trunk/conf/push.gb28181.conf index 7f2076243..c64a6dde0 100644 --- a/trunk/conf/push.gb28181.conf +++ b/trunk/conf/push.gb28181.conf @@ -8,7 +8,12 @@ srs_log_tank console; http_api { enabled on; listen 1985; -} +} + +http_server { + enabled on; + listen 8080; +} stats { network 0; @@ -29,7 +34,7 @@ stream_caster { listen 9000; # 多路复用端口类型,on为tcp,off为udp # 默认:off - tcp_enable on; + tcp_enable off; # rtp接收监听端口范围,最小值 rtp_port_min 58200; @@ -111,5 +116,27 @@ stream_caster { query_catalog_interval 60; } } -vhost __defaultVhost__ { + +rtc_server { + enabled on; + # Listen at udp://8000 + listen 8000; + # + # The $CANDIDATE means fetch from env, if not configed, use * as default. + # + # The * means retrieving server IP automatically, from all network interfaces, + # @see https://github.com/ossrs/srs/issues/307#issuecomment-599028124 + candidate $CANDIDATE; +} + +vhost __defaultVhost__ { + rtc { + enabled on; + bframe discard; + } + + http_remux { + enabled on; + mount [vhost]/[app]/[stream].flv; + } } diff --git a/trunk/configure b/trunk/configure index 4dd1d99ae..2a715da88 100755 --- a/trunk/configure +++ b/trunk/configure @@ -169,6 +169,11 @@ if [[ $SRS_SRT == YES ]]; then if [[ $SRS_SHARED_SRT == YES ]]; then LibSRTfile="-lsrt"; fi fi +# For iconv on macOS only, CentOS seems ok. +if [[ $SRS_GB28181 == YES && $SRS_OSX == YES ]]; then + LibIconvRoot="/usr/local/opt/libiconv/include"; LibIconvfile="/usr/local/opt/libiconv/lib/libiconv.a" +fi + # the link options, always use static link SrsLinkOptions="-ldl -lpthread"; if [[ $SRS_SSL == YES && $SRS_USE_SYS_SSL == YES ]]; then @@ -231,9 +236,6 @@ if [[ $SRS_RTC == YES ]]; then MODULE_FILES+=("srs_rtc_stun_stack") ModuleLibIncs+=(${LibSrtpRoot}) fi -if [[ $SRS_GB28181 == YES ]]; then - MODULE_FILES+=("srs_sip_stack") -fi if [[ $SRS_FFMPEG_FIT == YES ]]; then ModuleLibIncs+=("${LibFfmpegRoot[*]}") fi @@ -283,8 +285,16 @@ if [[ $SRS_FFMPEG_FIT == YES ]]; then MODULE_FILES+=("srs_app_rtc_codec") fi if [[ $SRS_GB28181 == YES ]]; then - MODULE_FILES+=("srs_app_gb28181" "srs_app_gb28181_sip" "srs_app_gb28181_jitbuffer") + MODULE_FILES+=("srs_app_gb28181" "srs_app_gb28181_sip") fi +if [[ $SRS_GB28181 == YES || $SRS_RTC == YES ]]; then + MODULE_FILES+=("srs_app_rtc_jitbuffer") +fi +if [[ $SRS_GB28181 == YES ]]; then + MODULE_FILES+=("srs_app_sip") + ModuleLibIncs+=(${LibIconvRoot}) +fi + DEFINES="" # add each modules for app for SRS_MODULE in ${SRS_MODULES[*]}; do @@ -358,6 +368,9 @@ fi if [[ $SRS_SRT == YES ]]; then ModuleLibFiles+=("${LibSRTfile[*]}") fi +if [[ $SRS_GB28181 == YES ]]; then + ModuleLibFiles+=("${LibIconvfile[*]}") +fi # all depends objects MODULE_OBJS="${CORE_OBJS[@]} ${KERNEL_OBJS[@]} ${PROTOCOL_OBJS[@]} ${APP_OBJS[@]} ${SERVER_OBJS[@]}" ModuleLibIncs=(${SRS_OBJS_DIR} ${LibSTRoot} ${LibGperfRoot} ${LibSSLRoot}) diff --git a/trunk/research/players/srs_gb28181.html b/trunk/research/players/srs_gb28181.html index 660b04fbc..b36ca886f 100644 --- a/trunk/research/players/srs_gb28181.html +++ b/trunk/research/players/srs_gb28181.html @@ -122,7 +122,7 @@ 当前通道:
- +
@@ -141,187 +141,17 @@
- -