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 / packet processing | Date | Commit | OS | 
|---|---|---|---|---|
| a | Open5GS UPF v2.7.2 user space  | 
2025.01.12 | 13585a34e3d5505dd86d2cdf78c91829f3936851 | 
Ubuntu 24.04 | 
| b | free5GC UPF (go-upf) v1.2.4 kernel module  | 
2025.01.02 | 88fbd8bb7b86761cbbcf1367acf2df7d81392ce3 | 
Ubuntu 24.04 | 
| c | UPG-VPP v1.13.0 VPP/DPDK  | 
2024.03.25 | dfdf64000566d35955d7c180720ff66086bd3572 | 
Ubuntu 22.04 | 
| d | eUPF v0.6.4 eBPF/XDP  | 
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 | |||||
| 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 | UpLink TEID | DownLink TEID | 
|---|---|---|
| 10.45.0.2/24 | 0x00000001 | 0x00000002 | 
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
 - 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.pyfor UpLink
There is no change. - 
/opt/trex/stl/udp_1pkt_simple.pyfor 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.7open5gs/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.7go-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 ConfigurationSee here for the original files.
- 
upg-vpp/startup.conf
There is no change. - 
upg-vpp/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
 - 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  | 
Kpps  | 
CPU%[1]  | 
DownLink Gbps  | 
Kpps  | 
CPU%[1]  | 
|---|---|---|---|---|---|---|---|
| a-1 | Open5GS UPF v2.7.2 (TUN) 2025.01.12  | 
Tx:1.79 Rx:1.08  | 
Tx:150.07 Rx:93.65  | 
1.68 | Tx:1.74 Rx:1.33  | 
Tx:150.36 Rx:111.87  | 
1.89 | 
| a-2 | Open5GS UPF v2.7.2 (TAP) 2025.01.12  | 
Tx:1.79 Rx:1.16  | 
Tx:150.14 Rx:100.07  | 
1.56 | Tx:1.74 Rx:1.17  | 
Tx:150.11 Rx:98.55  | 
1.51 | 
| b | free5GC UPF v1.2.4 2025.01.02  | 
Tx:5.96 Rx:4.8  | 
Tx:500.31 Rx:414.59  | 
5.39 | Tx:4.05 Rx:3.03  | 
Tx:350.09 Rx:254.98  | 
4.23 | 
| c | UPG-VPP v1.13.0 2024.03.25  | 
Tx:9.42 Rx:6.87  | 
Tx:790.31 Rx:593.79  | 
12.54 | Tx:10.31 Rx:6.94  | 
Tx:891.25 Rx:585.1  | 
12.13 | 
| d | eUPF v0.6.4 (native mode) 2024.12.23  | 
Tx:11.67 Rx:9.42  | 
Tx:978.83 Rx:814.75  | 
48.75 | Tx:11.24 Rx:9.77  | 
Tx:971.56 Rx:819.85  | 
44.25 | 
- CPU load - per core of TRex VM (VM-TG). In this case only one core is used.
 
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.24 Gbps
version      : STL @ v3.06                                total_tx_L1  : 11.39 Gbps
cpu_util.    : 44.25% @ 1 cores (1 per dual port)         total_rx     : 9.77 Gbps
rx_cpu_util. : 2.31% / 819.85 Kpps                        total_pps    : 971.56 Kpps
async_util.  : 0% / 8.27 bps                              drop_rate    : 1.47 Gbps
total_cps.   : 0 cps                                      queue_full   : 5,394,209 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% |            44.25% |                   
--         |                   |                   |                   
Tx bps L2  |             0 bps |        11.24 Gbps |        11.24 Gbps 
Tx bps L1  |             0 bps |        11.39 Gbps |        11.39 Gbps 
Tx pps     |             0 pps |       971.56 Kpps |       971.56 Kpps 
Line Util. |               0 % |             5.7 % |                   
---        |                   |                   |                   
Rx bps     |         9.77 Gbps |             0 bps |         9.77 Gbps 
Rx pps     |       819.85 Kpps |             0 pps |       819.85 Kpps 
----       |                   |                   |                   
opackets   |                 0 |          13702224 |          13702224 
ipackets   |          11439568 |                 0 |          11439568 
obytes     |                 0 |       19813415904 |       19813415904 
ibytes     |       17044956320 |                 0 |       17044956320 
tx-pkts    |            0 pkts |        13.7 Mpkts |        13.7 Mpkts 
rx-pkts    |       11.44 Mpkts |            0 pkts |       11.44 Mpkts 
tx-bytes   |               0 B |          19.81 GB |          19.81 GB 
rx-bytes   |          17.04 GB |               0 B |          17.04 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. In general, the measurement environment, conditions and tools have a significant 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 | TCP[1] throughput  | 
UDP[2] throughput  | 
UDP[2] packet loss  | 
RTT[3] (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.25] Measured the DownLink performance of eUPF again.
 - [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.
 
