OpenWrt 23.05.2 を移植した Fortigate 50E の NAT 性能

Summary

Fortigate 50E を入手して毎日負荷試験をする毎日を送ってる今日このごろです。
OpentWrt 23.05.2 で安定して使える帯域はどの程度なのか?を事前調査しておくべく試験をした。

今回のおもちゃの Fortigate 50E はメーカー公称で IPS 性能 350Mbps であるため NAT 性能もこのあたりで頭打ちになった。
それはいいとして IN/OUT の通知が TCP ではかなりばらつくことがあってとりあえずハードウェア割り込みの負荷軽減と最適化を目的にテストしてみた。結論としては弊宅の計測では限界性能の 350Mbps をきっちり流す可能性があるなら Software flow offloadingirqbalance を有効にし Packet Steering は無効にするのが一番はフォーマンスが安定するようだ

検証項目

irqbalance

Linux Kernel では ハードウェア割り込み(soft) を CPU0 のみで処理するのがデフォルト設定でマルチコア CPU の場合は負荷に偏りができる。これを解消するために irqbalance を使う方法があり CentOS / RHEL などなどは組み込みで自動起動しているが OpenWrt 23.05.2 現在では組み込みではないため下記の手順で導入する

手元では下記のようにした

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
opkg update
opkg install irqbalance

uci set irqbalance.irqbalance.enabled='1'
uci commit

> uci show irqbalance
irqbalance.irqbalance=irqbalance
irqbalance.irqbalance.enabled='1'

> service irqbalance enable
> service irqbalance start
> service | grep -e irqbalance
/etc/init.d/irqbalance             enabled         running

# 再起動しておく
reboot

# 再起動が完了したら servcie が起動しているか確認しておく
> service irqbalance status
running

Packet Steering

パケット処理を特定の CPU に向ける仕組み。こうすることでレイテンシーが低減する。またハードウェアに依存しない、ソフトウェア実装のため NIC に制限なく利用できる。

だが、 Fortigate 50E に搭載されている mvebu ではハードウェアスケージュールの都合で有効にする必要があるそうです。 2017年のコメントですが、現在の( 23.05.2)でも patch が残っていますのでテストします。
openwrt/target/linux/mvebu/patches-5.15/700-mvneta-tx-queue-workaround.patch at v23.05.2 · openwrt/openwrt

The kernel does not enable packet steering by default, so also disable in OpenWRT by default. (Though mvebu with its hardware scheduling issues [5] might want to enable packet steering by default.)

意訳: カーネルはデフォルトではパケット ステアリングを有効にしていないため、 OpenWRT ではデフォルトで無効になります。 (ただし、mvebu にはその ハードウェアのスケジューリングの問題 [5] により、パケットを有効にする必要がある場合があります デフォルトではステアリングが設定されています)。

git.openwrt.org Git - openwrt/openwrt.git/commit

Network > Firewall > Routing/NAT Offloading

  • Software flow offloading: は netfilter によるオフロードの仕組みソフトウェア実装のためどの target でも利用できる利用する場合 CPU 負荷を下げることができるため設定する
    設定は下記で可能

    1
    2
    
    uci set firewall.@defaults[0].flow_offloading='1'
    uci commit
  • Hardware flow offloading: は HW が NAT のオフロードに対応していることが条件対応機種は MediaTek MT7621 のみ

Tests

テスト条件

  • IPerf3: 3.9

  • Version: OpenWrt 23.05.2 r23630-842932a63d

  • 経路: 負荷試験NUC -> enp2s0 -> lan1 -> br-lan -> br-wan -> wan1 -> eno1 -> 負荷試験NUC

  • OpenWrt cofnig

    1
    2
    3
    
    opkg update
    opkg install htop sysstat
    opkg install irqbalance
    Packages
    1
    
    base-files busybox ca-bundle dnsmasq dropbear firewall4 fstools kmod-gpio-button-hotplug kmod-hwmon-nct7802 kmod-nft-offload libc libgcc libustream-mbedtls logd luci mtd netifd nftables odhcp6c odhcpd-ipv6only opkg ppp ppp-mod-pppoe procd procd-seccomp procd-ujail uboot-envtools uci uclient-fetch urandom-seed urngd htop sysstat
    uci-defaults
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    
    #!/usr/bin/env sh
    # DO NOT prefix 'uci'
    
    uci -q batch <<-EOF >/dev/null
      set network.wan=interface
      set network.wan.device='br-wan'
      set network.wan.proto='static'
      set network.wan.ipaddr='192.0.2.2'
      set network.wan.netmask='255.255.255.0'
      set network.wan.gateway='192.0.2.1'
      set system.@system[0].timezone='JST-9'
      commit
    EOF
    
    exit 0

本製品 Fortigate 50/52E の IPS 性能は 350Mbps 公称であるため下記のコマンドで iperf3 でテストする

1
iperf3 --parallel 5 --bidir -c 192.0.2.1 -t 60 -M 1460 -T 'TCP TH 350M' -i 5 -b 70M

同時に Console でアクセスし mpstat -P ALL 90 を実行し soft (ハードウェア割り込み) を記録した

  • default: Factory Image
  • Software flow offloading: flow
  • irqbalance: irq
  • Packet Steering: RS
defaultflowirqRSflow + irqirq + RSflow + RSflow + irq +
RS
Upload (Mbps)1.814.15 (+2.34)4.87 (+3.06)2.01 (+0.2)6.08 (+4.27)5.31 (+3.5)2.21 (+0.4)4.41 (+2.6)
Download (Mbps)350.00350.00350.00350.00350.00350.00350.00350.00
CPU all (soft)8.176.078.749.426.039.586.967.06
CPU 0 (soft)16.3312.1317.4910.4312.0515.4611.9210.24
CPU 1 (soft)8.413.712.003.88
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
root@OpenWrt:/# cat /etc/board.json
{
        "model": {
                "id": "fortinet,fg-50e",
                "name": "Fortinet FortiGate 50E"
        },
        "network": {
                "lan": {
                        "ports": [
                                "lan1",
                                "lan2",
                                "lan3",
                                "lan4",
                                "lan5"
                        ],
                        "protocol": "static"
                },
                "wan": {
                        "ports": [
                                "eth1",
                                "eth2"
                        ],
                        "protocol": "dhcp"
                }
        }
}

root@OpenWrt:/# cat /etc/openwrt_release
DISTRIB_ID='OpenWrt'
DISTRIB_RELEASE='23.05.2'
DISTRIB_REVISION='r23630-842932a63d'
DISTRIB_TARGET='mvebu/cortexa9'
DISTRIB_ARCH='arm_cortex-a9_vfpv3-d16'
DISTRIB_DESCRIPTION='OpenWrt 23.05.2 r23630-842932a63d'
DISTRIB_TAINTS=''

NAT throughput

コマンド例

1
iperf3 --json --get-server-output --parallel 5 --bidir -c 192.0.2.1 -t 120 -M 1460 -T '2024-03-12 18:48 TCP TH0350M' -b 70M --logfile TH0350M_TCP.json

これを見る限り、 Received/Send の境目は 75Mbps 付近弊宅で実用に耐えるのは Received 200Mbps / Send 50Mbps あたりとなりそう

参考情報

Built with Hugo
テーマ StackJimmy によって設計されています。