From c6f5d30d1d50ecf146ba6ccb6a54ff2241d23805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Ma=C5=82ecki?= Date: Mon, 11 May 2020 19:05:24 +0200 Subject: [PATCH 1/2] Added unique send/receive stats --- srtcore/core.cpp | 42 ++++++++++++++++++++++++++++++++++++------ srtcore/core.h | 8 ++++++++ srtcore/srt.h | 14 ++++++++++++++ 3 files changed, 58 insertions(+), 6 deletions(-) diff --git a/srtcore/core.cpp b/srtcore/core.cpp index 75d365434..d30ca40dd 100644 --- a/srtcore/core.cpp +++ b/srtcore/core.cpp @@ -1344,11 +1344,13 @@ void CUDT::clearData() CGuard stat_lock(m_StatsLock); m_stats.tsStartTime = steady_clock::now(); - m_stats.sentTotal = m_stats.recvTotal = m_stats.sndLossTotal = m_stats.rcvLossTotal = m_stats.retransTotal = - m_stats.sentACKTotal = m_stats.recvACKTotal = m_stats.sentNAKTotal = m_stats.recvNAKTotal = 0; + m_stats.sentTotal = m_stats.sentUniqTotal = m_stats.recvTotal = m_stats.recvUniqTotal + = m_stats.sndLossTotal = m_stats.rcvLossTotal = m_stats.retransTotal + = m_stats.sentACKTotal = m_stats.recvACKTotal = m_stats.sentNAKTotal = m_stats.recvNAKTotal = 0; m_stats.tsLastSampleTime = steady_clock::now(); - m_stats.traceSent = m_stats.traceRecv = m_stats.traceSndLoss = m_stats.traceRcvLoss = m_stats.traceRetrans = - m_stats.sentACK = m_stats.recvACK = m_stats.sentNAK = m_stats.recvNAK = 0; + m_stats.traceSent = m_stats.traceSentUniq = m_stats.traceRecv = m_stats.traceRecvUniq + = m_stats.traceSndLoss = m_stats.traceRcvLoss = m_stats.traceRetrans + = m_stats.sentACK = m_stats.recvACK = m_stats.sentNAK = m_stats.recvNAK = 0; m_stats.traceRcvRetrans = 0; m_stats.traceReorderDistance = 0; m_stats.traceBelatedTime = 0.0; @@ -1363,10 +1365,14 @@ void CUDT::clearData() m_stats.traceRcvUndecrypt = 0; m_stats.bytesSentTotal = 0; + m_stats.bytesSentUniqTotal = 0; m_stats.bytesRecvTotal = 0; + m_stats.bytesRecvUniqTotal = 0; m_stats.bytesRetransTotal = 0; m_stats.traceBytesSent = 0; + m_stats.traceBytesSentUniq = 0; m_stats.traceBytesRecv = 0; + m_stats.traceBytesRecvUniq = 0; m_stats.sndFilterExtra = 0; m_stats.rcvFilterExtra = 0; m_stats.rcvFilterSupply = 0; @@ -7253,7 +7259,9 @@ void CUDT::bstats(CBytePerfMon *perf, bool clear, bool instantaneous) perf->msTimeStamp = count_milliseconds(currtime - m_stats.tsStartTime); perf->pktSent = m_stats.traceSent; + perf->pktSentUnique = m_stats.traceSentUniq; perf->pktRecv = m_stats.traceRecv; + perf->pktRecvUnique = m_stats.traceRecvUniq; perf->pktSndLoss = m_stats.traceSndLoss; perf->pktRcvLoss = m_stats.traceRcvLoss; perf->pktRetrans = m_stats.traceRetrans; @@ -7276,7 +7284,9 @@ void CUDT::bstats(CBytePerfMon *perf, bool clear, bool instantaneous) /* perf byte counters include all headers (SRT+UDP+IP) */ const int pktHdrSize = CPacket::HDR_SIZE + CPacket::UDP_HDR_SIZE; perf->byteSent = m_stats.traceBytesSent + (m_stats.traceSent * pktHdrSize); + perf->byteSentUnique = m_stats.traceBytesSentUniq + (m_stats.traceSentUniq * pktHdrSize); perf->byteRecv = m_stats.traceBytesRecv + (m_stats.traceRecv * pktHdrSize); + perf->byteRecvUnique = m_stats.traceBytesRecvUniq + (m_stats.traceRecvUniq * pktHdrSize); perf->byteRetrans = m_stats.traceBytesRetrans + (m_stats.traceRetrans * pktHdrSize); #ifdef SRT_ENABLE_LOSTBYTESCOUNT perf->byteRcvLoss = m_stats.traceRcvBytesLoss + (m_stats.traceRcvLoss * pktHdrSize); @@ -7291,7 +7301,9 @@ void CUDT::bstats(CBytePerfMon *perf, bool clear, bool instantaneous) perf->byteRcvUndecrypt = m_stats.traceRcvBytesUndecrypt; perf->pktSentTotal = m_stats.sentTotal; + perf->pktSentUniqueTotal = m_stats.sentUniqTotal; perf->pktRecvTotal = m_stats.recvTotal; + perf->pktRecvUniqueTotal = m_stats.recvUniqTotal; perf->pktSndLossTotal = m_stats.sndLossTotal; perf->pktRcvLossTotal = m_stats.rcvLossTotal; perf->pktRetransTotal = m_stats.retransTotal; @@ -7302,7 +7314,9 @@ void CUDT::bstats(CBytePerfMon *perf, bool clear, bool instantaneous) perf->usSndDurationTotal = m_stats.m_sndDurationTotal; perf->byteSentTotal = m_stats.bytesSentTotal + (m_stats.sentTotal * pktHdrSize); + perf->byteSentUniqueTotal = m_stats.bytesSentUniqTotal + (m_stats.sentUniqTotal * pktHdrSize); perf->byteRecvTotal = m_stats.bytesRecvTotal + (m_stats.recvTotal * pktHdrSize); + perf->byteRecvUniqueTotal = m_stats.bytesRecvUniqTotal + (m_stats.recvUniqTotal * pktHdrSize); perf->byteRetransTotal = m_stats.bytesRetransTotal + (m_stats.retransTotal * pktHdrSize); perf->pktSndFilterExtraTotal = m_stats.sndFilterExtraTotal; perf->pktRcvFilterExtraTotal = m_stats.rcvFilterExtraTotal; @@ -7431,9 +7445,12 @@ void CUDT::bstats(CBytePerfMon *perf, bool clear, bool instantaneous) m_stats.traceRcvBytesUndecrypt = 0; // new> m_stats.traceBytesSent = m_stats.traceBytesRecv = m_stats.traceBytesRetrans = 0; + m_stats.traceBytesSentUniq = m_stats.traceBytesRecvUniq = 0; //< - m_stats.traceSent = m_stats.traceRecv = m_stats.traceSndLoss = m_stats.traceRcvLoss = m_stats.traceRetrans = - m_stats.sentACK = m_stats.recvACK = m_stats.sentNAK = m_stats.recvNAK = 0; + m_stats.traceSent = m_stats.traceRecv + = m_stats.traceSentUniq = m_stats.traceRecvUniq + = m_stats.traceSndLoss = m_stats.traceRcvLoss = m_stats.traceRetrans + = m_stats.sentACK = m_stats.recvACK = m_stats.sentNAK = m_stats.recvNAK = 0; m_stats.sndDuration = 0; m_stats.traceRcvRetrans = 0; m_stats.traceRcvBelated = 0; @@ -9122,6 +9139,13 @@ std::pair CUDT::packData(CPacket& w_packet) m_stats.bytesSentTotal += payload; ++m_stats.traceSent; ++m_stats.sentTotal; + if (new_packet_packed) + { + ++m_stats.traceSentUniq; + ++m_stats.sentUniqTotal; + m_stats.traceBytesSentUniq += payload; + m_stats.bytesSentUniqTotal += payload; + } leaveCS(m_StatsLock); if (probe) @@ -9542,6 +9566,12 @@ int CUDT::processData(CUnit* in_unit) // So this packet is "redundant". IF_HEAVY_LOGGING(exc_type = "UNACKED"); adding_successful = false; + enterCS(m_StatsLock); + ++m_stats.traceRecvUniq; + ++m_stats.recvUniqTotal; + m_stats.traceBytesRecvUniq += u->m_Packet.getLength(); + m_stats.bytesRecvUniqTotal += u->m_Packet.getLength(); + leaveCS(m_StatsLock); } else { diff --git a/srtcore/core.h b/srtcore/core.h index 030d6297a..229770e6d 100644 --- a/srtcore/core.h +++ b/srtcore/core.h @@ -1541,7 +1541,9 @@ class CUDT { time_point tsStartTime; // timestamp when the UDT entity is started int64_t sentTotal; // total number of sent data packets, including retransmissions + int64_t sentUniqTotal; // total number of sent data packets, excluding rexmit and filter control int64_t recvTotal; // total number of received packets + int64_t recvUniqTotal; // total number of received and delivered packets int sndLossTotal; // total number of lost packets (sender side) int rcvLossTotal; // total number of lost packets (receiver side) int retransTotal; // total number of retransmitted packets @@ -1552,7 +1554,9 @@ class CUDT int sndDropTotal; int rcvDropTotal; uint64_t bytesSentTotal; // total number of bytes sent, including retransmissions + uint64_t bytesSentUniqTotal; // total number of bytes sent, including retransmissions uint64_t bytesRecvTotal; // total number of received bytes + uint64_t bytesRecvUniqTotal; // total number of received bytes uint64_t rcvBytesLossTotal; // total number of loss bytes (estimate) uint64_t bytesRetransTotal; // total number of retransmitted bytes uint64_t sndBytesDropTotal; @@ -1569,7 +1573,9 @@ class CUDT time_point tsLastSampleTime; // last performance sample time int64_t traceSent; // number of packets sent in the last trace interval + int64_t traceSentUniq; // number of original packets sent in the last trace interval int64_t traceRecv; // number of packets received in the last trace interval + int64_t traceRecvUniq; // number of packets received AND DELIVERED in the last trace interval int traceSndLoss; // number of lost packets in the last trace interval (sender side) int traceRcvLoss; // number of lost packets in the last trace interval (receiver side) int traceRetrans; // number of retransmitted packets in the last trace interval @@ -1584,7 +1590,9 @@ class CUDT double traceBelatedTime; int64_t traceRcvBelated; uint64_t traceBytesSent; // number of bytes sent in the last trace interval + uint64_t traceBytesSentUniq; // number of bytes sent in the last trace interval uint64_t traceBytesRecv; // number of bytes sent in the last trace interval + uint64_t traceBytesRecvUniq; // number of bytes sent in the last trace interval uint64_t traceRcvBytesLoss; // number of bytes bytes lost in the last trace interval (estimate) uint64_t traceBytesRetrans; // number of bytes retransmitted in the last trace interval uint64_t traceSndBytesDrop; diff --git a/srtcore/srt.h b/srtcore/srt.h index 24e8d893e..60b7498a4 100644 --- a/srtcore/srt.h +++ b/srtcore/srt.h @@ -414,6 +414,20 @@ struct CBytePerfMon int pktRcvFilterLoss; // number of packet loss not coverable by filter int pktReorderTolerance; // packet reorder tolerance value //< + + // New stats in 1.5.0 + + // Total + int64_t pktSentUniqueTotal; // total number of sent data packets, including retransmissions + int64_t pktRecvUniqueTotal; // total number of received packets + uint64_t byteSentUniqueTotal; // total number of sent data bytes, including retransmissions + uint64_t byteRecvUniqueTotal; // total number of received bytes + + // Local + int64_t pktSentUnique; // number of sent data packets, including retransmissions + int64_t pktRecvUnique; // number of received packets + uint64_t byteSentUnique; // number of sent data bytes, including retransmissions + uint64_t byteRecvUnique; // number of received bytes }; //////////////////////////////////////////////////////////////////////////////// From ad63c63361304b2c65aa794529c818b9e1c6be58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Ma=C5=82ecki?= Date: Tue, 12 May 2020 09:22:59 +0200 Subject: [PATCH 2/2] Fixed bug: count recv uniq only when succeeded with buffer and dex --- srtcore/core.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/srtcore/core.cpp b/srtcore/core.cpp index d30ca40dd..2ad201478 100644 --- a/srtcore/core.cpp +++ b/srtcore/core.cpp @@ -9566,12 +9566,6 @@ int CUDT::processData(CUnit* in_unit) // So this packet is "redundant". IF_HEAVY_LOGGING(exc_type = "UNACKED"); adding_successful = false; - enterCS(m_StatsLock); - ++m_stats.traceRecvUniq; - ++m_stats.recvUniqTotal; - m_stats.traceBytesRecvUniq += u->m_Packet.getLength(); - m_stats.bytesRecvUniqTotal += u->m_Packet.getLength(); - leaveCS(m_StatsLock); } else { @@ -9601,6 +9595,16 @@ int CUDT::processData(CUnit* in_unit) } } } + + if (adding_successful) + { + CGuard statslock(m_StatsLock); + ++m_stats.traceRecvUniq; + ++m_stats.recvUniqTotal; + m_stats.traceBytesRecvUniq += u->m_Packet.getLength(); + m_stats.bytesRecvUniqTotal += u->m_Packet.getLength(); + } + #if ENABLE_HEAVY_LOGGING std::ostringstream timebufspec; if (m_bTsbPd)