srsRAN gNB(-DU) Load Testing
Introduction
In this tutorial, we will guide you through the process of load testing the srsRAN Project gNB(-DU) application without the need for specific hardware, via parameters available within the configuration file.
The ru_dummy
option in the gNB configuration allows users to emulate the RU and focus exclusively on testing the DU, by excluding the OFH layers. The RU Emulator (ru_emu
) can be used to simulate traffic
sent and received by an O-RU in a split 7.2 configuration, while also allowing you to monitor key performance indicators (KPIs).
For scenarios without a core network, the no_core
flag in the gNB configuration allows the gNB(-DU) to operate without a physical core network.
The testmode
feature in the gNB application was developed to evaluate the performance of the srsRAN gNB(-DU) on specific hardware. This
function emulates single or multiple UEs, simulating traffic across layers such as MAC, PHY, and OFH. By replicating traffic from the CU and RU to the DU,
testmode
provides an effective way to assess and optimize system performance. Integrated directly into the gNB application, testmode
requires no additional
builds beyond the gNB.
Detailed explanations of these scenarios are provided in the following sections. For detailed information on specific configuration parameters and usage of these modes, refer to the srsRAN Project Configuration Reference.
Using ru_dummy
In case you want to do a load test without a physical or emulated RU you can use the ru_dummy
config option in the gNB config. This will exclude the OFH layer from the test because no data
is sent over the network. To use the ru_dummy
parameter add the following section to your gNB config file:
ru_dummy: dl_processing_delay: 1 time_scaling: 1
Using ru_emu
The RU Emulator is an extra tool that needs to be built separately from the gNB application. To build the RU Emulator use the following commands from inside the srsRAN Project repository:
mkdir build && cd build cmake .. cd apps/examples/ofh make -j $(nproc)
In case you want to run the RU Emulator using DPDK use the following cmake command instead:
cmake -ENABLE_DPDK=ON ..
Note
Building with DPDK is not a requirement for using ru_emu
Create a new configuration file called emu.yaml
with the following content:
log: filename: /tmp/ru_emu.log level: warning ru_emu: cells: - bandwidth: 100 # Bandwidth of the cell network_interface: ens2f1 # Use BDF instead of interface name for DPDK ru_mac_addr: 00:33:22:33:00:11 # MAC address of the RU du_mac_addr: 00:33:22:33:00:66 # MAC address of the DU enable_promiscuous: false # Promiscuous mode flag vlan_tag: 33 # VLAN tag dl_port_id: [0, 1, 2, 3] # Port IDs for downlink ul_port_id: [0, 1, 2, 3] # Port IDs for uplink prach_port_id: [4, 5] # Port IDs for PRACH compr_method_ul: "bfp" # Compression method for uplink compr_bitwidth_ul: 9 # Compression bitwidth for uplink t2a_max_cp_dl: 470 # T2a maximum value for downlink Control-Plane t2a_min_cp_dl: 350 # T2a minimum value for downlink Control-Plane t2a_max_cp_ul: 200 # T2a maximum value for uplink Control-Plane t2a_min_cp_ul: 90 # T2a minimum value for uplink Control-Plane t2a_max_up: 345 # T2a maximum value for User-Plane t2a_min_up: 70 # T2a minimum value for User-Plane # dpdk: # eal_args: "--lcores (0-1)@(0-15)"
Adjust the above parameters to match your configuration. If you want to use DPDK, provide the Bus Device Function (BDF) of the NIC in the network_interface
field. The BDF can be found
using the dpdk-devbind.py -s
command. Also, uncomment the dpdk
section and provide the correct eal_args
arguments.
Use the following command to start the RU Emulator:
sudo ./ru_emulator -c emu.yaml
You should see the following output:
Running. Waiting for incoming packets... | TIME | ID | RX_TOTAL | RX_ON_TIME | RX_EARLY | RX_LATE | RX_SEQ_ERR | RX_ON_TIME_C | RX_EARLY_C | RX_LATE_C | RX_SEQ_ERR_C | RX_ON_TIME_C_U | RX_EARLY_C_U | RX_LATE_C_U | RX_SEQ_ERR_C_U | RX_SEQ_ERR_PRACH | RX_CORRUPT | RX_ERR_DROP | TX_TOTAL | | 15:26:48 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:26:49 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:26:50 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:26:51 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:26:52 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:26:53 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:26:54 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:26:55 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:26:56 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:26:57 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:26:58 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:26:59 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:27:00 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 | | 15:27:01 | 0 | 0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0/0/0/0 | 0 | 0 | 0 | 0 | 0/0 | 0 | 0 | 0 |
The above KPIs are indicating the KPIs of the RU Emulator. The RU Emulator is now running and waiting for incoming packets. Once an RU is connected you should see the *_ON_TIME_*
counters
increase. The RU is operating properly if you do not see any late, early or err packets.
Using no_core
In case you want to emulate the core network in cases where no 5G core is available, you can use the no_core
flag in the gNB config. To use the no_core
flag add the following section to your gNB config:
cu_cp: amf: no_core: false
Using testmode
Once an RU and a core network are in place you can start using testmode
. A sample configuration file can also be found in srsRAN_Project/configs within
the srsRAN Project source files:
test_mode: test_ue: rnti: 0x44 ri: 1 # Set to 2 or 4 for 2 layer or 4 layer MIMO operation cqi: 15 nof_ues: 1 pusch_active: true pdsch_active: true
This config will emulate a single UE with RNTI
= 0x44, CQI
is set to 15 and RI
to 1.
Configuration files can be concatenated when running the gNB(-DU), which means users can easily test various configurations without having to modify their base configuration. For this example, the configuration above
will be concatenated with the example configuration gnb_ru_ran550_tdd_n78_100mhz_4x2.yml
which can be found in srsRAN_Project/configs
. This will allow the RU to be tested without a physical UE being connected.
This ability extends to other frontends such as USRPs, and also ZMQ.
To run the described scenario, the following command can be used:
sudo ./apps/gnb/gnb -c gnb_ru_ran550_tdd_n78_100mhz_4x2.yml -c testmode.yml
You should then see the following output:
--== srsRAN gNB (commit f41c1db4c3) ==-- Warning: With the given prach_frequency_start=0, the PRACH opportunities overlap with the PUCCH resources/guardband in prbs=[0, 8). Some interference between PUCCH and PRACH interference should be expected Cell pci=1, bw=100 MHz, 4T2R, dl_arfcn=637212 (n78), dl_freq=3558.18 MHz, dl_ssb_arfcn=634464, ul_freq=3558.18 MHz Initializing the Open Fronthaul Interface for sector#0: ul_compr=[BFP,9], dl_compr=[BFP,9], prach_compr=[BFP,9], prach_cp_enabled=false, downlink_broadcast=false ==== gNB started === Type <h> to view help |--------------------DL---------------------|-------------------------UL------------------------------ pci rnti | cqi ri mcs brate ok nok (%) dl_bs | pusch rsrp mcs brate ok nok (%) bsr ta phr 1 0x44 | 15 1.0 28 1.0G 1539 0 0% 10M | 99.9 -99.9 28 75M 400 0 0% 81.5M 0 n/a 1 0x44 | 15 1.0 28 1.0G 1546 0 0% 10M | 99.9 -99.9 28 75M 400 0 0% 81.5M 0 n/a 1 0x44 | 15 1.0 28 1.0G 1541 0 0% 10M | 99.9 -99.9 28 75M 400 0 0% 81.5M 0 n/a 1 0x44 | 15 1.0 28 1.0G 1547 0 0% 10M | 99.9 -99.9 28 75M 399 0 0% 81.5M 0 n/a 1 0x44 | 15 1.0 28 1.0G 1543 0 0% 10M | 99.9 -99.9 28 76M 401 0 0% 81.5M 0 n/a 1 0x44 | 15 1.0 28 1.0G 1542 0 0% 10M | 99.9 -99.9 28 75M 400 0 0% 81.5M 0 n/a 1 0x44 | 15 1.0 28 1.0G 1549 0 0% 10M | 99.9 -99.9 28 75M 400 0 0% 81.5M 0 n/a 1 0x44 | 15 1.0 28 1.0G 1542 0 0% 10M | 99.9 -99.9 28 75M 400 0 0% 81.5M 0 n/a 1 0x44 | 15 1.0 28 1.0G 1546 0 0% 10M | 99.9 -99.9 28 75M 399 0 0% 81.5M 0 n/a 1 0x44 | 15 1.0 28 1.0G 1546 0 0% 10M | 99.9 -99.9 28 75M 400 0 0% 81.5M 0 n/a 1 0x44 | 15 1.0 28 1.0G 1548 0 0% 10M | 99.9 -99.9 28 76M 401 0 0% 81.5M 0 n/a
For more information about the test mode please refer to the srsRAN Project Configuration Reference.