From e4eb501c57f5340e6367fdf39d4f73fe46ef20bf Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 17 Apr 2020 16:36:56 +0800 Subject: [PATCH] Fix the perf stat bytes bug --- trunk/scripts/perf_gso.py | 4 +++- trunk/src/app/srs_app_rtc_conn.cpp | 25 ++++++++++++++++--------- trunk/src/app/srs_app_rtc_conn.hpp | 4 +++- trunk/src/app/srs_app_statistic.cpp | 17 ++++++++++------- trunk/src/app/srs_app_statistic.hpp | 2 +- 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/trunk/scripts/perf_gso.py b/trunk/scripts/perf_gso.py index 4d817f8bc..3e20e5a05 100755 --- a/trunk/scripts/perf_gso.py +++ b/trunk/scripts/perf_gso.py @@ -43,7 +43,9 @@ obj = json.loads(s) print "" p = obj['data']['dropped'] -print('RTC Frame Dropped: %s%s'%(10000.0 * p['rtc_dropeed'] / p['rtc_frames'], '%%')) +print('RTC Frame Dropped: %.4f%s'%(10000.0 * p['rtc_dropeed'] / p['rtc_frames'], '%%')) +p = obj['data']['bytes'] +print('Padding Overload: %.4f%s %.2fMB'%(10000.0 * p['rtc_padding'] / p['rtc_bytes'], '%%', p['rtc_padding']/1024/1024)) # 2, 3, 5, 9, 16, 32, 64, 128, 256 keys = ['lt_2', 'lt_3', 'lt_5', 'lt_9', 'lt_16', 'lt_32', 'lt_64', 'lt_128', 'lt_256', 'gt_256'] diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 41033f0d0..0b5ce34ae 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -472,6 +472,7 @@ SrsRtcPackets::SrsRtcPackets() nn_rtp_pkts = 0; nn_audios = nn_extras = 0; nn_videos = nn_samples = 0; + nn_bytes = nn_rtp_bytes = 0; nn_padding_bytes = nn_paddings = 0; nn_dropped = 0; @@ -505,6 +506,7 @@ void SrsRtcPackets::reset(bool gso, bool merge_nalus) nn_rtp_pkts = 0; nn_audios = nn_extras = 0; nn_videos = nn_samples = 0; + nn_bytes = nn_rtp_bytes = 0; nn_padding_bytes = nn_paddings = 0; nn_dropped = 0; @@ -745,22 +747,23 @@ srs_error_t SrsRtcSenderThread::cycle() // Stat the RTP packets going into kernel. stat->perf_on_gso_packets(pkts.nn_rtp_pkts); // Stat the bytes and paddings. - stat->perf_on_rtc_bytes(pkts.nn_bytes, pkts.nn_padding_bytes); + stat->perf_on_rtc_bytes(pkts.nn_bytes, pkts.nn_rtp_bytes, pkts.nn_padding_bytes); // Stat the messages and dropped count. stat->perf_on_dropped(msg_count, nn_rtc_packets, pkts.nn_dropped); - } + #if defined(SRS_DEBUG) - srs_trace("RTC PLAY perf, msgs %d/%d, rtp %d, gso %d, %d audios, %d extras, %d videos, %d samples, %d/%d bytes", - msg_count, nn_rtc_packets, pkts.size(), pkts.nn_rtp_pkts, pkts.nn_audios, pkts.nn_extras, pkts.nn_videos, - pkts.nn_samples, pkts.nn_bytes, pkts.nn_padding_bytes); + srs_trace("RTC PLAY perf, msgs %d/%d, rtp %d, gso %d, %d audios, %d extras, %d videos, %d samples, %d/%d/%d bytes", + msg_count, nn_rtc_packets, pkts.size(), pkts.nn_rtp_pkts, pkts.nn_audios, pkts.nn_extras, pkts.nn_videos, + pkts.nn_samples, pkts.nn_bytes, pkts.nn_rtp_bytes, pkts.nn_padding_bytes); #endif + } pprint->elapse(); if (pprint->can_print()) { // TODO: FIXME: Print stat like frame/s, packet/s, loss_packets. - srs_trace("-> RTC PLAY %d/%d msgs, %d/%d packets, %d audios, %d extras, %d videos, %d samples, %d/%d bytes, %d pad, %d/%d cache", + srs_trace("-> RTC PLAY %d/%d msgs, %d/%d packets, %d audios, %d extras, %d videos, %d samples, %d/%d/%d bytes, %d pad, %d/%d cache", msg_count, pkts.nn_dropped, pkts.size(), pkts.nn_rtp_pkts, pkts.nn_audios, pkts.nn_extras, pkts.nn_videos, pkts.nn_samples, pkts.nn_bytes, - pkts.nn_padding_bytes, pkts.nn_paddings, pkts.size(), pkts.capacity()); + pkts.nn_rtp_bytes, pkts.nn_padding_bytes, pkts.nn_paddings, pkts.size(), pkts.capacity()); } } } @@ -926,6 +929,8 @@ srs_error_t SrsRtcSenderThread::send_packets(SrsRtcPackets& packets) iov->iov_len = (size_t)nn_encrypt; } + packets.nn_rtp_bytes += (int)iov->iov_len; + // Set the address and control information. sockaddr_in* addr = (sockaddr_in*)sendonly_ukt->peer_addr(); socklen_t addrlen = (socklen_t)sendonly_ukt->peer_addrlen(); @@ -1070,6 +1075,8 @@ srs_error_t SrsRtcSenderThread::send_packets_gso(SrsRtcPackets& packets) iov->iov_len = (size_t)nn_encrypt; } + packets.nn_rtp_bytes += (int)iov->iov_len; + // If GSO, they must has same size, except the final one. if (using_gso && !gso_final && gso_encrypt && gso_encrypt != (int)iov->iov_len) { return srs_error_new(ERROR_RTC_RTP_MUXER, "GSO size=%d/%d, encrypt=%d/%d", gso_size, nn_packet, gso_encrypt, iov->iov_len); @@ -1138,9 +1145,9 @@ srs_error_t SrsRtcSenderThread::send_packets_gso(SrsRtcPackets& packets) } #if defined(SRS_DEBUG) - srs_trace("#%d, RTC PLAY summary, rtp %d/%d, videos %d/%d, audios %d/%d, pad %d/%d", packets.debug_id, packets.size(), + srs_trace("#%d, RTC PLAY summary, rtp %d/%d, videos %d/%d, audios %d/%d, pad %d/%d/%d", packets.debug_id, packets.size(), packets.nn_rtp_pkts, packets.nn_videos, packets.nn_samples, packets.nn_audios, packets.nn_extras, packets.nn_paddings, - packets.nn_padding_bytes); + packets.nn_padding_bytes, packets.nn_rtp_bytes); #endif return err; diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index 51b4c00b6..40c341fdf 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -130,8 +130,10 @@ public: uint32_t debug_id; #endif public: - // The total bytes of RTP packets. + // The total bytes of AVFrame packets. int nn_bytes; + // The total bytes of RTP packets. + int nn_rtp_bytes; // The total padded bytes. int nn_padding_bytes; public: diff --git a/trunk/src/app/srs_app_statistic.cpp b/trunk/src/app/srs_app_statistic.cpp index 6116c9f50..890e43746 100644 --- a/trunk/src/app/srs_app_statistic.cpp +++ b/trunk/src/app/srs_app_statistic.cpp @@ -655,20 +655,23 @@ srs_error_t SrsStatistic::dumps_perf_sendmmsg(SrsJsonObject* obj) return dumps_perf(perf_sendmmsg, obj); } -void SrsStatistic::perf_on_rtc_bytes(int nn_bytes, int nn_padding) +void SrsStatistic::perf_on_rtc_bytes(int nn_bytes, int nn_rtp_bytes, int nn_padding) { - // a: RTC bytes. - // b: RTC paddings. + // a: AVFrame bytes. + // b: RTC bytes. + // c: RTC paddings. perf_bytes->a += nn_bytes; - perf_bytes->b += nn_padding; + perf_bytes->b += nn_rtp_bytes; + perf_bytes->c += nn_padding; - perf_bytes->nn += nn_bytes + nn_padding; + perf_bytes->nn += nn_rtp_bytes; } srs_error_t SrsStatistic::dumps_perf_bytes(SrsJsonObject* obj) { - obj->set("rtc_bytes", SrsJsonAny::integer(perf_bytes->a)); - obj->set("rtc_padding", SrsJsonAny::integer(perf_bytes->b)); + obj->set("avframe_bytes", SrsJsonAny::integer(perf_bytes->a)); + obj->set("rtc_bytes", SrsJsonAny::integer(perf_bytes->b)); + obj->set("rtc_padding", SrsJsonAny::integer(perf_bytes->c)); obj->set("nn", SrsJsonAny::integer(perf_bytes->nn)); diff --git a/trunk/src/app/srs_app_statistic.hpp b/trunk/src/app/srs_app_statistic.hpp index 919322098..81ed9e27d 100644 --- a/trunk/src/app/srs_app_statistic.hpp +++ b/trunk/src/app/srs_app_statistic.hpp @@ -263,7 +263,7 @@ public: virtual srs_error_t dumps_perf_sendmmsg(SrsJsonObject* obj); public: // Stat for bytes, nn_bytes is the size of bytes, nb_padding is padding bytes. - virtual void perf_on_rtc_bytes(int nn_bytes, int nn_padding); + virtual void perf_on_rtc_bytes(int nn_bytes, int nn_rtp_bytes, int nn_padding); virtual srs_error_t dumps_perf_bytes(SrsJsonObject* obj); public: // Stat for rtc messages, nn_rtc is rtc messages, nn_dropped is dropped messages.