Starting to add metrics to lib/upper/pdcp.cc

This commit is contained in:
Pedro Alvarez 2021-02-15 13:20:44 +00:00
parent dd6a292d79
commit eb2f5b978f
4 changed files with 52 additions and 1 deletions

View File

@ -62,6 +62,10 @@ public:
// eNB-only methods
std::map<uint32_t, srslte::unique_byte_buffer_t> get_buffered_pdus(uint32_t lcid);
// Metrics
void get_metrics(pdcp_metrics_t& m, const uint32_t nof_tti);
void reset_metrics();
private:
srsue::rlc_interface_pdcp* rlc = nullptr;
srsue::rrc_interface_pdcp* rrc = nullptr;
@ -69,7 +73,8 @@ private:
srslte::task_sched_handle task_sched;
srslog::basic_logger& logger;
std::map<uint16_t, std::unique_ptr<pdcp_entity_base> > pdcp_array, pdcp_array_mrb;
using pdcp_map_t = std::map<uint16_t, std::unique_ptr<pdcp_entity_base> >;
pdcp_map_t pdcp_array, pdcp_array_mrb;
// cache valid lcids to be checked from separate thread
std::mutex cache_mutex;
@ -77,6 +82,9 @@ private:
bool valid_lcid(uint32_t lcid);
bool valid_mch_lcid(uint32_t lcid);
// Timer needed for metrics calculation
std::chrono::high_resolution_clock::time_point metrics_tp;
};
} // namespace srslte

View File

@ -23,6 +23,7 @@
#include "srslte/common/timers.h"
#include "srslte/interfaces/pdcp_interface_types.h"
#include "srslte/upper/byte_buffer_queue.h"
#include "srslte/upper/pdcp_metrics.h"
namespace srslte {

View File

@ -19,6 +19,12 @@
namespace srslte {
typedef struct {
// PDU metrics
uint32_t num_tx_pdus;
uint32_t num_rx_pdus;
uint64_t num_tx_pdu_bytes;
uint64_t num_rx_pdu_bytes;
// ACK specific metrics (requires RLC AM)
uint64_t num_tx_acked_bytes; //< Cumulative number of bytes that the PDCP knows to be acknowledged
uint64_t tx_notification_latency_ms; //< Average time in ms from PDU delivery to RLC to ACK notification from RLC

View File

@ -319,4 +319,40 @@ bool pdcp::valid_mch_lcid(uint32_t lcid)
return pdcp_array_mrb.find(lcid) != pdcp_array_mrb.end();
}
void pdcp::get_metrics(pdcp_metrics_t& m, const uint32_t nof_tti)
{
std::chrono::duration<double> secs = std::chrono::high_resolution_clock::now() - metrics_tp;
for (pdcp_map_t::iterator it = pdcp_array.begin(); it != pdcp_array.end(); ++it) {
pdcp_bearer_metrics_t metrics = it->second->get_metrics();
// Rx/Tx rate based on real time
double rx_rate_mbps_real_time = (metrics.num_rx_pdu_bytes * 8 / (double)1e6) / secs.count();
double tx_rate_mbps_real_time = (metrics.num_tx_pdu_bytes * 8 / (double)1e6) / secs.count();
// Rx/Tx rate based on number of TTIs
double rx_rate_mbps = (nof_tti > 0) ? ((metrics.num_rx_pdu_bytes * 8 / (double)1e6) / (nof_tti / 1000.0)) : 0.0;
double tx_rate_mbps = (nof_tti > 0) ? ((metrics.num_tx_pdu_bytes * 8 / (double)1e6) / (nof_tti / 1000.0)) : 0.0;
logger.info("lcid=%d, rx_rate_mbps=%4.2f (real=%4.2f), tx_rate_mbps=%4.2f (real=%4.2f)",
it->first,
rx_rate_mbps,
rx_rate_mbps_real_time,
tx_rate_mbps,
tx_rate_mbps_real_time);
m.bearer[it->first] = metrics;
}
reset_metrics();
}
void pdcp::reset_metrics()
{
for (pdcp_map_t::iterator it = pdcp_array.begin(); it != pdcp_array.end(); ++it) {
it->second->reset_metrics();
}
metrics_tp = std::chrono::high_resolution_clock::now();
}
} // namespace srslte