fix #257, server latency is 0.1s+, the bottleneck is encoder. 2.0.71
正在显示
3 个修改的文件
包含
30 行增加
和
19 行删除
@@ -786,6 +786,10 @@ The latency between encoder and player with realtime config( | @@ -786,6 +786,10 @@ The latency between encoder and player with realtime config( | ||
786 | </tr> | 786 | </tr> |
787 | </table> | 787 | </table> |
788 | 788 | ||
789 | +We use FMLE as encoder to benchmark. The latency of server is 0.1s+, | ||
790 | +and the bottleneck is on the encoder. For more information, read | ||
791 | +[bug #257](https://github.com/winlinvip/simple-rtmp-server/issues/257#issuecomment-66864413). | ||
792 | + | ||
789 | ## Architecture | 793 | ## Architecture |
790 | 794 | ||
791 | SRS always use the most simple architecture to support complex transaction. | 795 | SRS always use the most simple architecture to support complex transaction. |
@@ -589,11 +589,12 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsQueueRecvThread* trd) | @@ -589,11 +589,12 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsQueueRecvThread* trd) | ||
589 | bool user_specified_duration_to_stop = (req->duration > 0); | 589 | bool user_specified_duration_to_stop = (req->duration > 0); |
590 | int64_t starttime = -1; | 590 | int64_t starttime = -1; |
591 | 591 | ||
592 | + // setup the realtime. | ||
593 | + realtime = _srs_config->get_realtime_enabled(req->vhost); | ||
592 | // setup the mw config. | 594 | // setup the mw config. |
593 | // when mw_sleep changed, resize the socket send buffer. | 595 | // when mw_sleep changed, resize the socket send buffer. |
594 | mw_enabled = true; | 596 | mw_enabled = true; |
595 | change_mw_sleep(_srs_config->get_mw_sleep_ms(req->vhost)); | 597 | change_mw_sleep(_srs_config->get_mw_sleep_ms(req->vhost)); |
596 | - realtime = _srs_config->get_realtime_enabled(req->vhost); | ||
597 | 598 | ||
598 | while (true) { | 599 | while (true) { |
599 | // to use isolate thread to recv, can improve about 33% performance. | 600 | // to use isolate thread to recv, can improve about 33% performance. |
@@ -641,23 +642,6 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsQueueRecvThread* trd) | @@ -641,23 +642,6 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsQueueRecvThread* trd) | ||
641 | srs_error("get messages from consumer failed. ret=%d", ret); | 642 | srs_error("get messages from consumer failed. ret=%d", ret); |
642 | return ret; | 643 | return ret; |
643 | } | 644 | } |
644 | - | ||
645 | -#ifdef SRS_PERF_QUEUE_COND_WAIT | ||
646 | - // we use wait timeout to get messages, | ||
647 | - // for min latency event no message incoming, | ||
648 | - // so the count maybe zero. | ||
649 | - srs_info("mw wait %dms and got %d msgs %d(%"PRId64"-%"PRId64")ms", | ||
650 | - mw_sleep, count, | ||
651 | - (count > 0? msgs.msgs[count - 1]->timestamp - msgs.msgs[0]->timestamp : 0), | ||
652 | - (count > 0? msgs.msgs[0]->timestamp : 0), | ||
653 | - (count > 0? msgs.msgs[count - 1]->timestamp : 0)); | ||
654 | -#else | ||
655 | - if (count <= 0) { | ||
656 | - srs_info("mw sleep %dms for no msg", mw_sleep); | ||
657 | - st_usleep(mw_sleep * 1000); | ||
658 | - } | ||
659 | -#endif | ||
660 | - srs_info("got %d msgs, min=%d, mw=%d", count, SRS_PERF_MW_MIN_MSGS, mw_sleep); | ||
661 | 645 | ||
662 | // reportable | 646 | // reportable |
663 | if (pithy_print.can_print()) { | 647 | if (pithy_print.can_print()) { |
@@ -671,6 +655,29 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsQueueRecvThread* trd) | @@ -671,6 +655,29 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsQueueRecvThread* trd) | ||
671 | ); | 655 | ); |
672 | } | 656 | } |
673 | 657 | ||
658 | + // we use wait timeout to get messages, | ||
659 | + // for min latency event no message incoming, | ||
660 | + // so the count maybe zero. | ||
661 | + if (count > 0) { | ||
662 | + srs_verbose("mw wait %dms and got %d msgs %d(%"PRId64"-%"PRId64")ms", | ||
663 | + mw_sleep, count, | ||
664 | + (count > 0? msgs.msgs[count - 1]->timestamp - msgs.msgs[0]->timestamp : 0), | ||
665 | + (count > 0? msgs.msgs[0]->timestamp : 0), | ||
666 | + (count > 0? msgs.msgs[count - 1]->timestamp : 0)); | ||
667 | + } | ||
668 | + | ||
669 | + if (count <= 0) { | ||
670 | +#ifndef SRS_PERF_QUEUE_COND_WAIT | ||
671 | + srs_info("mw sleep %dms for no msg", mw_sleep); | ||
672 | + st_usleep(mw_sleep * 1000); | ||
673 | +#else | ||
674 | + srs_verbose("mw wait %dms and got nothing.", mw_sleep); | ||
675 | +#endif | ||
676 | + // ignore when nothing got. | ||
677 | + continue; | ||
678 | + } | ||
679 | + srs_info("got %d msgs, min=%d, mw=%d", count, SRS_PERF_MW_MIN_MSGS, mw_sleep); | ||
680 | + | ||
674 | // only when user specifies the duration, | 681 | // only when user specifies the duration, |
675 | // we start to collect the durations for each message. | 682 | // we start to collect the durations for each message. |
676 | if (user_specified_duration_to_stop) { | 683 | if (user_specified_duration_to_stop) { |
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
31 | // current release version | 31 | // current release version |
32 | #define VERSION_MAJOR 2 | 32 | #define VERSION_MAJOR 2 |
33 | #define VERSION_MINOR 0 | 33 | #define VERSION_MINOR 0 |
34 | -#define VERSION_REVISION 70 | 34 | +#define VERSION_REVISION 71 |
35 | // server info. | 35 | // server info. |
36 | #define RTMP_SIG_SRS_KEY "SRS" | 36 | #define RTMP_SIG_SRS_KEY "SRS" |
37 | #define RTMP_SIG_SRS_ROLE "origin/edge server" | 37 | #define RTMP_SIG_SRS_ROLE "origin/edge server" |
-
请 注册 或 登录 后发表评论