mirror of https://github.com/PentHertz/srsLTE.git
Starting to add metrics to lib/upper/pdcp.cc
This commit is contained in:
parent
dd6a292d79
commit
eb2f5b978f
|
@ -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
|
||||
|
|
|
@ -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 {
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue