This describes simple performance measurements of several open source UPFs by using the traffic generator TRex as the performance measurement tool and Simple PFCP Client as the PFCP simulator. This was measured on the VMs on Proxmox VE. For other measurement results, please see Performance Measurement.
Note. Performance measurement results are highly dependent on the measurement conditions. These results are only examples of results under certain measurement conditions. And this is a very simple measurement, and according to this comment, it doesn't seem to make much sense to measure between VMs. I hope it will serve as a reference for a simple configuration when measuring on real devices.
- Simple Overview of UPF Performance Measurements
- Changes in configuration files of Simple PFCP Client, TRex and UPFs
- Network settings of TRex and UPFs
- Build Simple PFCP Client, TRex and UPFs
- Run Simple PFCP Client, TRex and UPFs
- Measure UPF Performance
- Results
- Changelog (summary)
I will easily measure the performance of several open source UPFs by using TRex as the traffic generator and Simple PFCP Client as the PFCP simulator. Note that this configuration is implemented with Proxmox VE VMs.
The following minimum configuration was set as a condition.
- One PFCP client, TRex and DUT (UPF)
The built simulation environment is as follows.
Simple PFCP Client, TRex used are as follows.
- Simple PFCP Client (2025.01.16) - https://github.com/s5uishida/simple_pfcp_client
- TRex v3.06 (2024.09.17) - https://github.com/cisco-system-traffic-generator/trex-core
- Scapy v2.6.1 (2024.11.05) - https://github.com/secdev/scapy
The UPFs used are as follows.
- Open5GS v2.7.2 (2025.01.12) - https://github.com/open5gs/open5gs
- free5GC UPF (go-upf) v1.2.4 (2025.01.02) - https://github.com/free5gc/go-upf
gtp5g v0.9.8 (2025.01.14) - https://github.com/free5gc/gtp5g - UPG-VPP v1.13.0 (2024.03.25) - https://github.com/travelping/upg-vpp
- eUPF v0.6.4 (2024.12.23) - https://github.com/edgecomllc/eupf
Each VMs are as follows.
VM | SW & Role | IP address | OS | CPU | Mem | HDD |
---|---|---|---|---|---|---|
VM1 | Simple PFCP Client | 192.168.0.111/24 | Ubuntu 24.04 | 1 | 1GB | 10GB |
VM-TG | TRex Traffic Generator |
192.168.0.131/24 | Ubuntu 22.04 | 3 | 8GB | 20GB |
VM-DUT | each UPF DUT (Device Under Test) |
192.168.0.151/24 | Ubuntu 24.04 or 22.04 |
2 | 8GB | 20GB |
Each VM-DUT(UPFs) are as follows.
# | SW | Date | Commit | OS |
---|---|---|---|---|
a | Open5GS UPF v2.7.2 | 2025.01.12 | 13585a34e3d5505dd86d2cdf78c91829f3936851 |
Ubuntu 24.04 |
b | free5GC UPF (go-upf) v1.2.4 |
2025.01.02 | 88fbd8bb7b86761cbbcf1367acf2df7d81392ce3 |
Ubuntu 24.04 |
c | UPG-VPP v1.13.0 | 2024.03.25 | dfdf64000566d35955d7c180720ff66086bd3572 |
Ubuntu 22.04 |
d | eUPF v0.6.4 | 2024.12.23 | 307b80aec8c7bc8fa376e03927c2f5c55a1fd687 |
Ubuntu 24.04 |
The network interfaces of each VM except VM-DUT are as follows.
VM | Device | Model | Linux Bridge | IP address | Interface |
---|---|---|---|---|---|
VM1 | ens18 | VirtIO | vmbr1 | 10.0.0.111/24 | (NAPT NW) |
ens19 | VirtIO | mgbr0 | 192.168.0.111/24 | (Mgmt NW) | |
ens20 | VirtIO | vmbr4 | 192.168.14.111/24 | N4 | |
VM-TG | ens18 | VirtIO | vmbr1 | 10.0.0.131/24 | (NAPT NW) |
ens19 | VirtIO | mgbr0 | 192.168.0.131/24 | (Mgmt NW) | |
ens20 | VirtIO | vmbr3 | 192.168.13.131/24 | N3 (Under DPDK by uio_pci_generic) | |
ens21 | VirtIO | vmbr6 | 192.168.16.152/24 | N6 (Under DPDK by uio_pci_generic) |
The network interfaces of each VM-DUT(UPFs) are as follows.
# | SW | Device | Model | Linux Bridge | IP address | Interface |
---|---|---|---|---|---|---|
a | Open5GS UPF | |||||
ens19 | VirtIO | mgbr0 | 192.168.0.151/24 | (Mgmt NW) | ||
ens20 | VirtIO | vmbr3 | 192.168.13.151/24 | N3 | ||
ens21 | VirtIO | vmbr4 | 192.168.14.151/24 | N4 | ||
ens22 | VirtIO | vmbr6 | 192.168.16.151/24 | N6 | ||
b | free5GC UPF (go-upf) |
|||||
ens19 | VirtIO | mgbr0 | 192.168.0.151/24 | (Mgmt NW) | ||
ens20 | VirtIO | vmbr3 | 192.168.13.151/24 | N3 | ||
ens21 | VirtIO | vmbr4 | 192.168.14.151/24 | N4 | ||
ens22 | VirtIO | vmbr6 | 192.168.16.151/24 | N6 | ||
c | UPG-VPP | ens18 | VirtIO | vmbr1 | 10.0.0.151/24 | (NAPT NW) |
ens19 | VirtIO | mgbr0 | 192.168.0.151/24 | (Mgmt NW) | ||
ens20 | VirtIO | vmbr3 | 192.168.13.151/24 | N3 (Under DPDK by vfio-pci) | ||
ens21 | VirtIO | vmbr4 | 192.168.14.151/24 | N4 (Under DPDK by vfio-pci) | ||
ens22 | VirtIO | vmbr6 | 192.168.16.151/24 | N6 (Under DPDK by vfio-pci) | ||
d | eUPF | |||||
ens19 | VirtIO | mgbr0 | 192.168.0.151/24 | (Mgmt NW) | ||
ens20 | VirtIO | vmbr3 | 192.168.13.151/24 | N3 (XDP) | ||
ens21 | VirtIO | vmbr4 | 192.168.14.151/24 | N4 | ||
ens22 | VirtIO | vmbr6 | 192.168.16.151/24 | N6 (XDP) |
Linux Bridges of Proxmox VE are as follows.
Linux Bridge | Network CIDR | Interface |
---|---|---|
vmbr1 | 10.0.0.0/24 | NAPT NW |
mgbr0 | 192.168.0.0/24 | Mgmt NW |
vmbr3 | 192.168.13.0/24 | N3 |
vmbr4 | 192.168.14.0/24 | N4 |
vmbr6 | 192.168.16.0/24 | N6 |
UE IP address and TEID are as follows.
UE IP address | TEID |
---|---|
10.45.0.2/24 | 0x00000001 |
Please refer to the following for building Simple PFCP Client, TRex and UPFs respectively.
- Simple PFCP Client (2025.01.16) - https://github.com/s5uishida/simple_pfcp_client
- TRex v3.06 (2024.09.17) - https://github.com/s5uishida/install_trex
- Open5GS v2.7.2 (2025.01.12) - https://open5gs.org/open5gs/docs/guide/02-building-open5gs-from-sources/
- free5GC UPF (go-upf) v1.2.4 (2025.01.02) - https://free5gc.org/guide/
- UPG-VPP v1.13.0 (2024.03.25) - https://github.com/s5uishida/install_vpp_upf_dpdk#annex_1
- eUPF v0.6.4 (2024.12.23) - https://github.com/s5uishida/install_eupf
See here for the original file.
/root/pfcp_request.py
There is no change.
See here for the original file.
/etc/trex_cfg.yaml
There is no change.
See here for the original load profiles.
-
/opt/trex/stl/gtp_1pkt_simple.py
for UpLink
There is no change. -
/opt/trex/stl/udp_1pkt_simple.py
for DownLink
There is no change.
open5gs/install/etc/open5gs/upf.yaml
--- upf.yaml.orig 2024-05-02 19:52:00.000000000 +0900
+++ upf.yaml 2024-05-19 12:38:00.000000000 +0900
@@ -11,18 +11,18 @@
upf:
pfcp:
server:
- - address: 127.0.0.7
+ - address: 192.168.14.151
client:
# smf: # UPF PFCP Client try to associate SMF PFCP Server
# - address: 127.0.0.4
gtpu:
server:
- - address: 127.0.0.7
+ - address: 192.168.13.151
session:
- subnet: 10.45.0.0/16
gateway: 10.45.0.1
- - subnet: 2001:db8:cafe::/48
- gateway: 2001:db8:cafe::1
+ dnn: internet
+ dev: ogstun
metrics:
server:
- address: 127.0.0.7
open5gs/install/etc/open5gs/upf.yaml
--- upf.yaml.orig 2024-05-02 19:52:00.000000000 +0900
+++ upf.yaml 2024-09-23 14:00:20.724467385 +0900
@@ -11,18 +11,18 @@
upf:
pfcp:
server:
- - address: 127.0.0.7
+ - address: 192.168.14.151
client:
# smf: # UPF PFCP Client try to associate SMF PFCP Server
# - address: 127.0.0.4
gtpu:
server:
- - address: 127.0.0.7
+ - address: 192.168.13.151
session:
- subnet: 10.45.0.0/16
gateway: 10.45.0.1
- - subnet: 2001:db8:cafe::/48
- gateway: 2001:db8:cafe::1
+ dnn: internet
+ dev: ogstap
metrics:
server:
- address: 127.0.0.7
go-upf/upfcfg.yaml
--- upfcfg.yaml.orig 2024-10-14 04:53:12.341028732 +0900
+++ upfcfg.yaml 2024-10-14 06:11:36.636303534 +0900
@@ -4,8 +4,8 @@
# PFCP Configuration
# The listen IP and nodeID of the N4 interface on this UPF (Can't set to 0.0.0.0)
pfcp:
- addr: 127.0.0.8 # IP addr for listening
- nodeID: 127.0.0.8 # External IP or FQDN can be reached
+ addr: 192.168.14.151 # IP addr for listening
+ nodeID: 192.168.14.151 # External IP or FQDN can be reached
retransTimeout: 1s # retransmission timeout
maxRetrans: 3 # the max number of retransmission
@@ -18,7 +18,7 @@
# If you bind to a specific IP, ensure SMF uses the same IP in its N3 configuration.
# If you bind to all (0.0.0.0), SMF can use any of the available UPF IPs, but do not use 0.0.0.0 in SMF.
ifList:
- - addr: 127.0.0.8
+ - addr: 192.168.13.151
type: N3
# name: upf.5gc.nctu.me
# ifname: gtpif
@@ -28,9 +28,7 @@
# List of Data Network Names (DNN) supported by this UPF.
dnnList:
- dnn: internet # Data Network Name
- cidr: 10.60.0.0/16 # Classless Inter-Domain Routing for assigned IPv4 pool of UE
- - dnn: internet # Data Network Name
- cidr: 10.61.0.0/16 # Classless Inter-Domain Routing for assigned IPv4 pool of UE
+ cidr: 10.45.0.0/16 # Classless Inter-Domain Routing for assigned IPv4 pool of UE
# natifname: eth0
# Logging Configuration
See here for the original files.
-
openair-upf/startup.conf
There is no change. -
openair-upf/init.conf
There is no change.
See here for the original file.
eupf/config.yml
There is no change.
Set the OS kernel parameter according to this.
First, uncomment the next line in the /etc/sysctl.conf
file and reflect it in the OS.
net.ipv4.ip_forward=1
# sysctl -p
Next, down the interface ens18
of the VM-DUT to delete default GW.
# ip link set dev ens18 down
Then, configure the TUNnel interface.
# ip tuntap add name ogstun mode tun
# ip addr add 10.45.0.1/16 dev ogstun
# ip link set ogstun up
First, uncomment the next line in the /etc/sysctl.conf
file and reflect it in the OS.
net.ipv4.ip_forward=1
# sysctl -p
Next, down the interface ens18
of the VM-DUT to delete default GW.
# ip link set dev ens18 down
Then, configure the TAP interface.
# ip tuntap add name ogstap mode tap
# ip addr add 10.45.0.1/16 dev ogstap
# ip link set ogstap up
First, uncomment the next line in the /etc/sysctl.conf
file and reflect it in the OS.
net.ipv4.ip_forward=1
# sysctl -p
Next, down the interface ens18
of the VM-DUT to delete default GW.
# ip link set dev ens18 down
See this.
First, uncomment the next line in the /etc/sysctl.conf
file and reflect it in the OS.
net.ipv4.ip_forward=1
# sysctl -p
Next, down the interface ens18
of the VM-DUT to delete default GW.
# ip link set dev ens18 down
Please refer to the following for building Simple PFCP Client, TRex and UPFs respectively.
- Simple PFCP Client (2025.01.16) - https://github.com/s5uishida/simple_pfcp_client
- TRex v3.06 (2024.09.17) - https://github.com/s5uishida/install_trex
- Open5GS v2.7.2 (2025.01.12) - https://open5gs.org/open5gs/docs/guide/02-building-open5gs-from-sources/
- free5GC UPF (go-upf) v1.2.4 (2025.01.02) - https://github.com/s5uishida/install_goupf
- UPG-VPP v1.13.0 (2024.03.25) - https://github.com/s5uishida/install_vpp_upf_dpdk#annex_1
- eUPF v0.6.4 (2024.12.23) - https://github.com/s5uishida/install_eupf
First run each UPF, then Simple PFCP Client and TRex last. Each UPF uses the same IP address, so start only the UPF you want to measure.
Please use the configuration files changed for TUN interface.
# cd open5gs
# ./install/bin/open5gs-upfd
Please use the configuration files changed for TAP interface.
# cd open5gs
# ./install/bin/open5gs-upfd
# cd go-upf
# ./upf -c upfcfg.yaml
See this.
See this.
See this.
Please refer to this to run TRex.
Please see below for methods for measuring UpLink and DownLink performances.
In this measurement, the UDP payload size is set to 1400 bytes.
# | UPF | Date | UpLink Gbps |
UpLink Kpps |
DownLink Gbps |
DownLink Kpps |
---|---|---|---|---|---|---|
a-1 | Open5GS UPF v2.7.2 (TUN) | 2025.01.12 | 1.08 | 93.65 | 1.33 | 111.87 |
a-2 | Open5GS UPF v2.7.2 (TAP) | 2025.01.12 | 1.16 | 100.07 | 1.17 | 98.55 |
b | free5GC UPF v1.2.4 | 2025.01.02 | 4.8 | 414.59 | 3.03 | 254.98 |
c | UPG-VPP v1.13.0 | 2024.03.25 | 6.87 | 593.79 | 6.94 | 585.1 |
d | eUPF v0.6.4 (native mode) | 2024.12.23 | 9.42 | 814.75 | 9.59 | 804.51 |
a-1. logs for Open5GS UPF v2.7.2 (TUN)
UpLink measurement
start -f stl/gtp_1pkt_simple.py -p 0 -m 150kpps -d 60
Global Statistics
connection : localhost, Port 4501 total_tx_L2 : 1.79 Gbps
version : STL @ v3.06 total_tx_L1 : 1.81 Gbps
cpu_util. : 1.68% @ 1 cores (1 per dual port) total_rx : 1.08 Gbps
rx_cpu_util. : 0.18% / 93.65 Kpps total_pps : 150.07 Kpps
async_util. : 0% / 4.79 bps drop_rate : 705.53 Mbps
total_cps. : 0 cps queue_full : 12,034 pkts
Port Statistics
port | 0 | 1 | total
-----------+-------------------+-------------------+------------------
owner | root | root |
link | UP | UP |
state | TRANSMITTING | IDLE |
speed | 200 Gb/s | 200 Gb/s |
CPU util. | 1.68% | 0.0% |
-- | | |
Tx bps L2 | 1.79 Gbps | 0.09 bps | 1.79 Gbps
Tx bps L1 | 1.81 Gbps | 0.13 bps | 1.81 Gbps
Tx pps | 150.07 Kpps | 0 pps | 150.07 Kpps
Line Util. | 0.91 % | 0 % |
--- | | |
Rx bps | 0 bps | 1.08 Gbps | 1.08 Gbps
Rx pps | 0 pps | 93.65 Kpps | 93.65 Kpps
---- | | |
opackets | 2687829 | 1 | 2687830
ipackets | 0 | 1739130 | 1739130
obytes | 4004865210 | 46 | 4004865256
ibytes | 0 | 2514780580 | 2514780580
tx-pkts | 2.69 Mpkts | 1 pkts | 2.69 Mpkts
rx-pkts | 0 pkts | 1.74 Mpkts | 1.74 Mpkts
tx-bytes | 4 GB | 46 B | 4 GB
rx-bytes | 0 B | 2.51 GB | 2.51 GB
----- | | |
oerrors | 0 | 0 | 0
ierrors | 0 | 0 | 0
status: |
Press 'ESC' for navigation panel...
status:
tui>
DownLink measurement
start -f stl/udp_1pkt_simple.py -p 1 -m 150kpps -d 60
Global Statistics
connection : localhost, Port 4501 total_tx_L2 : 1.74 Gbps
version : STL @ v3.06 total_tx_L1 : 1.76 Gbps
cpu_util. : 1.89% @ 1 cores (1 per dual port) total_rx : 1.33 Gbps
rx_cpu_util. : 0.21% / 111.87 Kpps total_pps : 150.36 Kpps
async_util. : 0% / 9.02 bps drop_rate : 413.05 Mbps
total_cps. : 0 cps queue_full : 3,817 pkts
Port Statistics
port | 0 | 1 | total
-----------+-------------------+-------------------+------------------
owner | root | root |
link | UP | UP |
state | IDLE | TRANSMITTING |
speed | 200 Gb/s | 200 Gb/s |
CPU util. | 0.0% | 1.89% |
-- | | |
Tx bps L2 | 1.41 bps | 1.74 Gbps | 1.74 Gbps
Tx bps L1 | 2.02 bps | 1.76 Gbps | 1.76 Gbps
Tx pps | 0 pps | 150.36 Kpps | 150.36 Kpps
Line Util. | 0 % | 0.88 % |
--- | | |
Rx bps | 1.33 Gbps | 0 bps | 1.33 Gbps
Rx pps | 111.87 Kpps | 0 pps | 111.87 Kpps
---- | | |
opackets | 1 | 2007396 | 2007397
ipackets | 1304349 | 0 | 1304349
obytes | 46 | 2902694616 | 2902694662
ibytes | 1933043782 | 0 | 1933043782
tx-pkts | 1 pkts | 2.01 Mpkts | 2.01 Mpkts
rx-pkts | 1.3 Mpkts | 0 pkts | 1.3 Mpkts
tx-bytes | 46 B | 2.9 GB | 2.9 GB
rx-bytes | 1.93 GB | 0 B | 1.93 GB
----- | | |
oerrors | 0 | 0 | 0
ierrors | 0 | 0 | 0
status: |
Press 'ESC' for navigation panel...
status:
tui>
a-2. logs for Open5GS UPF v2.7.2 (TAP)
UpLink measurement
start -f stl/gtp_1pkt_simple.py -p 0 -m 150kpps -d 60
Global Statistics
connection : localhost, Port 4501 total_tx_L2 : 1.79 Gbps
version : STL @ v3.06 total_tx_L1 : 1.81 Gbps
cpu_util. : 1.56% @ 1 cores (1 per dual port) total_rx : 1.16 Gbps
rx_cpu_util. : 0.1% / 100.07 Kpps total_pps : 150.14 Kpps
async_util. : 0% / 7.67 bps drop_rate : 632.05 Mbps
total_cps. : 0 cps queue_full : 5,803 pkts
Port Statistics
port | 0 | 1 | total
-----------+-------------------+-------------------+------------------
owner | root | root |
link | UP | UP |
state | TRANSMITTING | IDLE |
speed | 200 Gb/s | 200 Gb/s |
CPU util. | 1.56% | 0.0% |
-- | | |
Tx bps L2 | 1.79 Gbps | 2.85 bps | 1.79 Gbps
Tx bps L1 | 1.81 Gbps | 4.08 bps | 1.81 Gbps
Tx pps | 150.14 Kpps | 0.01 pps | 150.14 Kpps
Line Util. | 0.91 % | 0 % |
--- | | |
Rx bps | 0 bps | 1.16 Gbps | 1.16 Gbps
Rx pps | 0 pps | 100.07 Kpps | 100.07 Kpps
---- | | |
opackets | 1867650 | 1 | 1867651
ipackets | 0 | 1268363 | 1268363
obytes | 2782798500 | 46 | 2782798546
ibytes | 0 | 1834051498 | 1834051498
tx-pkts | 1.87 Mpkts | 1 pkts | 1.87 Mpkts
rx-pkts | 0 pkts | 1.27 Mpkts | 1.27 Mpkts
tx-bytes | 2.78 GB | 46 B | 2.78 GB
rx-bytes | 0 B | 1.83 GB | 1.83 GB
----- | | |
oerrors | 0 | 0 | 0
ierrors | 0 | 0 | 0
status: -
Press 'ESC' for navigation panel...
status:
tui>
DownLink measurement
start -f stl/udp_1pkt_simple.py -p 1 -m 150kpps -d 60
Global Statistics
connection : localhost, Port 4501 total_tx_L2 : 1.74 Gbps
version : STL @ v3.06 total_tx_L1 : 1.76 Gbps
cpu_util. : 1.51% @ 1 cores (1 per dual port) total_rx : 1.17 Gbps
rx_cpu_util. : 0.08% / 98.55 Kpps total_pps : 150.11 Kpps
async_util. : 0% / 7.77 bps drop_rate : 568.03 Mbps
total_cps. : 0 cps queue_full : 4,638 pkts
Port Statistics
port | 0 | 1 | total
-----------+-------------------+-------------------+------------------
owner | root | root |
link | UP | UP |
state | IDLE | TRANSMITTING |
speed | 200 Gb/s | 200 Gb/s |
CPU util. | 0.0% | 1.51% |
-- | | |
Tx bps L2 | 11.27 bps | 1.74 Gbps | 1.74 Gbps
Tx bps L1 | 16.18 bps | 1.76 Gbps | 1.76 Gbps
Tx pps | 0.03 pps | 150.11 Kpps | 150.11 Kpps
Line Util. | 0 % | 0.88 % |
--- | | |
Rx bps | 1.17 Gbps | 0 bps | 1.17 Gbps
Rx pps | 98.55 Kpps | 0 pps | 98.55 Kpps
---- | | |
opackets | 1 | 1574528 | 1574529
ipackets | 1009552 | 0 | 1009552
obytes | 46 | 2276767488 | 2276767534
ibytes | 1496154628 | 0 | 1496154628
tx-pkts | 1 pkts | 1.57 Mpkts | 1.57 Mpkts
rx-pkts | 1.01 Mpkts | 0 pkts | 1.01 Mpkts
tx-bytes | 46 B | 2.28 GB | 2.28 GB
rx-bytes | 1.5 GB | 0 B | 1.5 GB
----- | | |
oerrors | 0 | 0 | 0
ierrors | 0 | 0 | 0
status: -
Press 'ESC' for navigation panel...
status:
tui>
b. logs for free5GC UPF v1.2.4
UpLink measurement
start -f stl/gtp_1pkt_simple.py -p 0 -m 500kpps -d 60
Global Statistics
connection : localhost, Port 4501 total_tx_L2 : 5.96 Gbps
version : STL @ v3.06 total_tx_L1 : 6.04 Gbps
cpu_util. : 5.39% @ 1 cores (1 per dual port) total_rx : 4.8 Gbps
rx_cpu_util. : 0.23% / 414.59 Kpps total_pps : 500.31 Kpps
async_util. : 0% / 8.98 bps drop_rate : 1.17 Gbps
total_cps. : 0 cps queue_full : 27,815 pkts
Port Statistics
port | 0 | 1 | total
-----------+-------------------+-------------------+------------------
owner | root | root |
link | UP | UP |
state | TRANSMITTING | IDLE |
speed | 200 Gb/s | 200 Gb/s |
CPU util. | 5.39% | 0.0% |
-- | | |
Tx bps L2 | 5.96 Gbps | 2.82 bps | 5.96 Gbps
Tx bps L1 | 6.04 Gbps | 4.04 bps | 6.04 Gbps
Tx pps | 500.31 Kpps | 0.01 pps | 500.31 Kpps
Line Util. | 3.02 % | 0 % |
--- | | |
Rx bps | 0 bps | 4.8 Gbps | 4.8 Gbps
Rx pps | 0 pps | 414.59 Kpps | 414.59 Kpps
---- | | |
opackets | 6304949 | 1 | 6304950
ipackets | 0 | 5255842 | 5255842
obytes | 9394374010 | 46 | 9394374056
ibytes | 0 | 7599946132 | 7599946132
tx-pkts | 6.3 Mpkts | 1 pkts | 6.3 Mpkts
rx-pkts | 0 pkts | 5.26 Mpkts | 5.26 Mpkts
tx-bytes | 9.39 GB | 46 B | 9.39 GB
rx-bytes | 0 B | 7.6 GB | 7.6 GB
----- | | |
oerrors | 0 | 0 | 0
ierrors | 0 | 0 | 0
status: -
Press 'ESC' for navigation panel...
status:
tui>
DownLink measurement
start -f stl/udp_1pkt_simple.py -p 1 -m 350kpps -d 60
Global Statistics
connection : localhost, Port 4501 total_tx_L2 : 4.05 Gbps
version : STL @ v3.06 total_tx_L1 : 4.11 Gbps
cpu_util. : 4.23% @ 1 cores (1 per dual port) total_rx : 3.03 Gbps
rx_cpu_util. : 0.33% / 254.98 Kpps total_pps : 350.09 Kpps
async_util. : 0% / 7.52 bps drop_rate : 1.02 Gbps
total_cps. : 0 cps queue_full : 55,554 pkts
Port Statistics
port | 0 | 1 | total
-----------+-------------------+-------------------+------------------
owner | root | root |
link | UP | UP |
state | IDLE | TRANSMITTING |
speed | 200 Gb/s | 200 Gb/s |
CPU util. | 0.0% | 4.23% |
-- | | |
Tx bps L2 | 45.1 bps | 4.05 Gbps | 4.05 Gbps
Tx bps L1 | 64.71 bps | 4.11 Gbps | 4.11 Gbps
Tx pps | 0.12 pps | 350.09 Kpps | 350.09 Kpps
Line Util. | 0 % | 2.05 % |
--- | | |
Rx bps | 3.03 Gbps | 0 bps | 3.03 Gbps
Rx pps | 254.98 Kpps | 0 pps | 254.98 Kpps
---- | | |
opackets | 1 | 5821201 | 5821202
ipackets | 4250168 | 0 | 4250168
obytes | 46 | 8417456646 | 8417456692
ibytes | 6315748208 | 0 | 6315748208
tx-pkts | 1 pkts | 5.82 Mpkts | 5.82 Mpkts
rx-pkts | 4.25 Mpkts | 0 pkts | 4.25 Mpkts
tx-bytes | 46 B | 8.42 GB | 8.42 GB
rx-bytes | 6.32 GB | 0 B | 6.32 GB
----- | | |
oerrors | 0 | 0 | 0
ierrors | 0 | 0 | 0
status: -
Press 'ESC' for navigation panel...
status:
tui>
c. logs for UPG-VPP v1.13.0
UpLink measurement
start -f stl/gtp_1pkt_simple.py -p 0 -m 800kpps -d 60
Global Statistics
connection : localhost, Port 4501 total_tx_L2 : 9.42 Gbps
version : STL @ v3.06 total_tx_L1 : 9.55 Gbps
cpu_util. : 12.54% @ 1 cores (1 per dual port) total_rx : 6.87 Gbps
rx_cpu_util. : 0.72% / 593.79 Kpps total_pps : 790.31 Kpps
async_util. : 0% / 9.16 bps drop_rate : 2.55 Gbps
total_cps. : 0 cps queue_full : 1,064,989 pkts
Port Statistics
port | 0 | 1 | total
-----------+-------------------+-------------------+------------------
owner | root | root |
link | UP | UP |
state | TRANSMITTING | IDLE |
speed | 200 Gb/s | 200 Gb/s |
CPU util. | 12.54% | 0.0% |
-- | | |
Tx bps L2 | 9.42 Gbps | 0 bps | 9.42 Gbps
Tx bps L1 | 9.55 Gbps | 0 bps | 9.55 Gbps
Tx pps | 790.31 Kpps | 0 pps | 790.31 Kpps
Line Util. | 4.77 % | 0 % |
--- | | |
Rx bps | 0 bps | 6.87 Gbps | 6.87 Gbps
Rx pps | 0 pps | 593.79 Kpps | 593.79 Kpps
---- | | |
opackets | 21316353 | 0 | 21316353
ipackets | 0 | 18084576 | 18084576
obytes | 31761365970 | 0 | 31761365970
ibytes | 0 | 26150296896 | 26150296896
tx-pkts | 21.32 Mpkts | 0 pkts | 21.32 Mpkts
rx-pkts | 0 pkts | 18.08 Mpkts | 18.08 Mpkts
tx-bytes | 31.76 GB | 0 B | 31.76 GB
rx-bytes | 0 B | 26.15 GB | 26.15 GB
----- | | |
oerrors | 0 | 0 | 0
ierrors | 0 | 0 | 0
status: \
Press 'ESC' for navigation panel...
status:
tui>
DownLink measurement
start -f stl/udp_1pkt_simple.py -p 1 -m 900kpps -d 60
Global Statistics
connection : localhost, Port 4501 total_tx_L2 : 10.31 Gbps
version : STL @ v3.06 total_tx_L1 : 10.45 Gbps
cpu_util. : 12.13% @ 1 cores (1 per dual port) total_rx : 6.94 Gbps
rx_cpu_util. : 0.67% / 585.1 Kpps total_pps : 891.25 Kpps
async_util. : 0% / 7.3 bps drop_rate : 3.37 Gbps
total_cps. : 0 cps queue_full : 746,833 pkts
Port Statistics
port | 0 | 1 | total
-----------+-------------------+-------------------+------------------
owner | root | root |
link | UP | UP |
state | IDLE | TRANSMITTING |
speed | 200 Gb/s | 200 Gb/s |
CPU util. | 0.0% | 12.13% |
-- | | |
Tx bps L2 | 0 bps | 10.31 Gbps | 10.31 Gbps
Tx bps L1 | 0 bps | 10.45 Gbps | 10.45 Gbps
Tx pps | 0 pps | 891.25 Kpps | 891.25 Kpps
Line Util. | 0 % | 5.23 % |
--- | | |
Rx bps | 6.94 Gbps | 0 bps | 6.94 Gbps
Rx pps | 585.1 Kpps | 0 pps | 585.1 Kpps
---- | | |
opackets | 0 | 15047421 | 15047421
ipackets | 10585316 | 0 | 10585316
obytes | 0 | 21758570766 | 21758570766
ibytes | 15700294072 | 0 | 15700294072
tx-pkts | 0 pkts | 15.05 Mpkts | 15.05 Mpkts
rx-pkts | 10.59 Mpkts | 0 pkts | 10.59 Mpkts
tx-bytes | 0 B | 21.76 GB | 21.76 GB
rx-bytes | 15.7 GB | 0 B | 15.7 GB
----- | | |
oerrors | 0 | 0 | 0
ierrors | 0 | 0 | 0
status: \
Press 'ESC' for navigation panel...
status:
tui>
d. logs for eUPF v0.6.4
UpLink measurement
start -f stl/gtp_1pkt_simple.py -p 0 -m 1000kpps -d 60
Global Statistics
connection : localhost, Port 4501 total_tx_L2 : 11.67 Gbps
version : STL @ v3.06 total_tx_L1 : 11.82 Gbps
cpu_util. : 48.75% @ 1 cores (1 per dual port) total_rx : 9.42 Gbps
rx_cpu_util. : 2.56% / 814.75 Kpps total_pps : 978.83 Kpps
async_util. : 0% / 7.05 bps drop_rate : 2.24 Gbps
total_cps. : 0 cps queue_full : 6,151,050 pkts
Port Statistics
port | 0 | 1 | total
-----------+-------------------+-------------------+------------------
owner | root | root |
link | UP | UP |
state | TRANSMITTING | IDLE |
speed | 200 Gb/s | 200 Gb/s |
CPU util. | 48.75% | 0.0% |
-- | | |
Tx bps L2 | 11.67 Gbps | 0 bps | 11.67 Gbps
Tx bps L1 | 11.82 Gbps | 0 bps | 11.82 Gbps
Tx pps | 978.83 Kpps | 0 pps | 978.83 Kpps
Line Util. | 5.91 % | 0 % |
--- | | |
Rx bps | 0 bps | 9.42 Gbps | 9.42 Gbps
Rx pps | 0 pps | 814.75 Kpps | 814.75 Kpps
---- | | |
opackets | 15615464 | 0 | 15615464
ipackets | 0 | 12287777 | 12287777
obytes | 23267041360 | 0 | 23267041360
ibytes | 0 | 17768125542 | 17768125542
tx-pkts | 15.62 Mpkts | 0 pkts | 15.62 Mpkts
rx-pkts | 0 pkts | 12.29 Mpkts | 12.29 Mpkts
tx-bytes | 23.27 GB | 0 B | 23.27 GB
rx-bytes | 0 B | 17.77 GB | 17.77 GB
----- | | |
oerrors | 0 | 0 | 0
ierrors | 0 | 0 | 0
status: /
Press 'ESC' for navigation panel...
status:
tui>
DownLink measurement
start -f stl/udp_1pkt_simple.py -p 1 -m 1000kpps -d 60
Global Statistics
connection : localhost, Port 4501 total_tx_L2 : 11.28 Gbps
version : STL @ v3.06 total_tx_L1 : 11.44 Gbps
cpu_util. : 15.33% @ 1 cores (1 per dual port) total_rx : 9.59 Gbps
rx_cpu_util. : 2.55% / 804.51 Kpps total_pps : 975.2 Kpps
async_util. : 0% / 6.56 bps drop_rate : 1.69 Gbps
total_cps. : 0 cps queue_full : 1,138,697 pkts
Port Statistics
port | 0 | 1 | total
-----------+-------------------+-------------------+------------------
owner | root | root |
link | UP | UP |
state | IDLE | TRANSMITTING |
speed | 200 Gb/s | 200 Gb/s |
CPU util. | 0.0% | 15.33% |
-- | | |
Tx bps L2 | 0 bps | 11.28 Gbps | 11.28 Gbps
Tx bps L1 | 0 bps | 11.44 Gbps | 11.44 Gbps
Tx pps | 0 pps | 975.2 Kpps | 975.2 Kpps
Line Util. | 0 % | 5.72 % |
--- | | |
Rx bps | 9.59 Gbps | 0 bps | 9.59 Gbps
Rx pps | 804.51 Kpps | 0 pps | 804.51 Kpps
---- | | |
opackets | 0 | 11234257 | 11234257
ipackets | 9226675 | 0 | 9226675
obytes | 0 | 16244735622 | 16244735622
ibytes | 13747745750 | 0 | 13747745750
tx-pkts | 0 pkts | 11.23 Mpkts | 11.23 Mpkts
rx-pkts | 9.23 Mpkts | 0 pkts | 9.23 Mpkts
tx-bytes | 0 B | 16.24 GB | 16.24 GB
rx-bytes | 13.75 GB | 0 B | 13.75 GB
----- | | |
oerrors | 0 | 0 | 0
ierrors | 0 | 0 | 0
status: |
Press 'ESC' for navigation panel...
status:
tui>
These measurement results show that eUPF has relatively outstanding performance even on Proxmox VE VM. Also, Open5GS shows significantly higher performance when measured with srsRAN. This suggests that the measurement environment, condition and tools have a large impact on the measurement results.
If measuring using virtual machines, it would be better to measure on VMs on a hypervisor such as Proxmox VE. Also, it is good to select VirtIO as the network interface to ensure that the network does not become a bottleneck in the measurement.
It is very simple mesurement and may not be very meaningful when measuring between virtual machines, but it may be a little helpful when comparing the relative performance of UPF. I would appreciate it if you could use this as a reference as a configuration example when measuring with real devices.
I simply measured the raw communication performance between VM-TG and VM-DUT. This is a measurement of the N6 interface and therefore does not include communication over GTP-U.
A--B | 1) TCP throughput |
2) UDP throughput |
2) UDP packet loss |
3) RTT (msec) |
---|---|---|---|---|
VM-TG --(N6)-- VM-DUT | S:26.8 Gbps R:26.8 Gbps |
S:2.04 Gbps R:2.03 Gbps |
0.4 % | 0.262 |
1. iperf3 -c 192.168.16.151
# iperf3 -c 192.168.16.151
Connecting to host 192.168.16.151, port 5201
[ 5] local 192.168.16.152 port 58568 connected to 192.168.16.151 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 3.00 GBytes 25.7 Gbits/sec 0 1.87 MBytes
[ 5] 1.00-2.00 sec 3.08 GBytes 26.4 Gbits/sec 0 2.30 MBytes
[ 5] 2.00-3.00 sec 3.10 GBytes 26.7 Gbits/sec 0 2.30 MBytes
[ 5] 3.00-4.00 sec 3.11 GBytes 26.7 Gbits/sec 0 2.43 MBytes
[ 5] 4.00-5.00 sec 3.18 GBytes 27.3 Gbits/sec 0 2.84 MBytes
[ 5] 5.00-6.00 sec 3.21 GBytes 27.5 Gbits/sec 0 2.84 MBytes
[ 5] 6.00-7.00 sec 3.20 GBytes 27.5 Gbits/sec 0 2.84 MBytes
[ 5] 7.00-8.00 sec 3.14 GBytes 27.0 Gbits/sec 0 3.62 MBytes
[ 5] 8.00-9.00 sec 3.14 GBytes 27.0 Gbits/sec 0 3.62 MBytes
[ 5] 9.00-10.00 sec 3.07 GBytes 26.3 Gbits/sec 0 3.62 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 31.2 GBytes 26.8 Gbits/sec 0 sender
[ 5] 0.00-9.99 sec 31.2 GBytes 26.8 Gbits/sec receiver
iperf Done.
2. iperf3 -c 192.168.16.151 -u -b 5G
# iperf3 -c 192.168.16.151 -u -b 5G
Connecting to host 192.168.16.151, port 5201
[ 5] local 192.168.16.152 port 52639 connected to 192.168.16.151 port 5201
[ ID] Interval Transfer Bitrate Total Datagrams
[ 5] 0.00-1.00 sec 242 MBytes 2.03 Gbits/sec 175079
[ 5] 1.00-2.00 sec 240 MBytes 2.01 Gbits/sec 173824
[ 5] 2.00-3.00 sec 230 MBytes 1.93 Gbits/sec 166912
[ 5] 3.00-4.00 sec 246 MBytes 2.07 Gbits/sec 178413
[ 5] 4.00-5.00 sec 241 MBytes 2.02 Gbits/sec 174618
[ 5] 5.00-6.00 sec 246 MBytes 2.06 Gbits/sec 177980
[ 5] 6.00-7.00 sec 247 MBytes 2.07 Gbits/sec 178878
[ 5] 7.00-8.00 sec 246 MBytes 2.07 Gbits/sec 178375
[ 5] 8.00-9.00 sec 247 MBytes 2.07 Gbits/sec 178931
[ 5] 9.00-10.00 sec 248 MBytes 2.08 Gbits/sec 179748
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Jitter Lost/Total Datagrams
[ 5] 0.00-10.00 sec 2.38 GBytes 2.04 Gbits/sec 0.000 ms 0/1762758 (0%) sender
[ 5] 0.00-10.00 sec 2.37 GBytes 2.03 Gbits/sec 0.005 ms 7076/1762758 (0.4%) receiver
iperf Done.
3. ping 192.168.16.151 -c 10
# ping 192.168.16.151 -c 10
PING 192.168.16.151 (192.168.16.151) 56(84) bytes of data.
64 bytes from 192.168.16.151: icmp_seq=1 ttl=64 time=0.285 ms
64 bytes from 192.168.16.151: icmp_seq=2 ttl=64 time=0.292 ms
64 bytes from 192.168.16.151: icmp_seq=3 ttl=64 time=0.282 ms
64 bytes from 192.168.16.151: icmp_seq=4 ttl=64 time=0.221 ms
64 bytes from 192.168.16.151: icmp_seq=5 ttl=64 time=0.319 ms
64 bytes from 192.168.16.151: icmp_seq=6 ttl=64 time=0.219 ms
64 bytes from 192.168.16.151: icmp_seq=7 ttl=64 time=0.260 ms
64 bytes from 192.168.16.151: icmp_seq=8 ttl=64 time=0.232 ms
64 bytes from 192.168.16.151: icmp_seq=9 ttl=64 time=0.261 ms
64 bytes from 192.168.16.151: icmp_seq=10 ttl=64 time=0.258 ms
--- 192.168.16.151 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9215ms
rtt min/avg/max/mdev = 0.219/0.262/0.319/0.030 ms
I would like to thank all the excellent developers and contributors who developed these great systems and tools.
- [2025.01.20] Changed eUPF measurement to those measured using the binary that does not output kernel logs for debugging.
- [2025.01.17] Initial release.