winlin

fix #257, server latency is 0.1s+, the bottleneck is encoder. 2.0.71

@@ -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.
@@ -642,34 +643,40 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsQueueRecvThread* trd) @@ -642,34 +643,40 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsQueueRecvThread* trd)
642 return ret; 643 return ret;
643 } 644 }
644 645
645 -#ifdef SRS_PERF_QUEUE_COND_WAIT 646 + // reportable
  647 + if (pithy_print.can_print()) {
  648 + kbps->sample();
  649 + srs_trace("-> "SRS_CONSTS_LOG_PLAY
  650 + " time=%"PRId64", msgs=%d, okbps=%d,%d,%d, ikbps=%d,%d,%d, mw=%d",
  651 + pithy_print.age(), count,
  652 + kbps->get_send_kbps(), kbps->get_send_kbps_30s(), kbps->get_send_kbps_5m(),
  653 + kbps->get_recv_kbps(), kbps->get_recv_kbps_30s(), kbps->get_recv_kbps_5m(),
  654 + mw_sleep
  655 + );
  656 + }
  657 +
646 // we use wait timeout to get messages, 658 // we use wait timeout to get messages,
647 // for min latency event no message incoming, 659 // for min latency event no message incoming,
648 // so the count maybe zero. 660 // so the count maybe zero.
649 - srs_info("mw wait %dms and got %d msgs %d(%"PRId64"-%"PRId64")ms", 661 + if (count > 0) {
  662 + srs_verbose("mw wait %dms and got %d msgs %d(%"PRId64"-%"PRId64")ms",
650 mw_sleep, count, 663 mw_sleep, count,
651 (count > 0? msgs.msgs[count - 1]->timestamp - msgs.msgs[0]->timestamp : 0), 664 (count > 0? msgs.msgs[count - 1]->timestamp - msgs.msgs[0]->timestamp : 0),
652 (count > 0? msgs.msgs[0]->timestamp : 0), 665 (count > 0? msgs.msgs[0]->timestamp : 0),
653 (count > 0? msgs.msgs[count - 1]->timestamp : 0)); 666 (count > 0? msgs.msgs[count - 1]->timestamp : 0));
654 -#else 667 + }
  668 +
655 if (count <= 0) { 669 if (count <= 0) {
  670 +#ifndef SRS_PERF_QUEUE_COND_WAIT
656 srs_info("mw sleep %dms for no msg", mw_sleep); 671 srs_info("mw sleep %dms for no msg", mw_sleep);
657 st_usleep(mw_sleep * 1000); 672 st_usleep(mw_sleep * 1000);
658 - } 673 +#else
  674 + srs_verbose("mw wait %dms and got nothing.", mw_sleep);
659 #endif 675 #endif
660 - srs_info("got %d msgs, min=%d, mw=%d", count, SRS_PERF_MW_MIN_MSGS, mw_sleep);  
661 -  
662 - // reportable  
663 - if (pithy_print.can_print()) {  
664 - kbps->sample();  
665 - srs_trace("-> "SRS_CONSTS_LOG_PLAY  
666 - " time=%"PRId64", msgs=%d, okbps=%d,%d,%d, ikbps=%d,%d,%d, mw=%d",  
667 - pithy_print.age(), count,  
668 - kbps->get_send_kbps(), kbps->get_send_kbps_30s(), kbps->get_send_kbps_5m(),  
669 - kbps->get_recv_kbps(), kbps->get_recv_kbps_30s(), kbps->get_recv_kbps_5m(),  
670 - mw_sleep  
671 - ); 676 + // ignore when nothing got.
  677 + continue;
672 } 678 }
  679 + srs_info("got %d msgs, min=%d, mw=%d", count, SRS_PERF_MW_MIN_MSGS, mw_sleep);
673 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.
@@ -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"