Dans un contexte de FAI associatif comme grifon on cherche à vraiment limiter les coûts. Cela nous amène à des architectures où des machines peuvent faire à la fois routeur et serveur. C’est le cas de la machine que nous avons à TH2 : grifon la partage avec stolon afin …
Essai d’un routeur ARM
Dans la mesure où ARM prend de plus en plus d’ampleur, ça faisait quelques
temps que je voulais voir ce que ça donnait de router avec, notamment par
rapport à la gestion des IRQ et de la fréquence.
En effet, pour router il n’y a pas besoin d’avoir un CPU avec beaucoup de
fioritures, mais plutôt un CPU très rapidement cadencé. Un paquet ne
demande pas beaucoup de calcul, par contre ça en demande souvent. Il est
également connu qu’il vaut mieux avoir un nombre carré de cœurs, pour que
les drivers puissent plus facilement s’y retrouver pour leurs queues de
traitement.
À cause d’un affreux
influenceur IRC je me suis retrouvé en possession d’un Minisforum MS-R1. Il a tout ce que je demande à un
routeur : deux ports réseau. Par contre en terme de CPU cadencé et carré
c’est une autre histoire. Il y a un CPU de 4 cœurs à 1.8GHz et un autre de
8 cœurs à 2.6GHz, pour un seul nœud NUMA. Je ne sais pas comment ça
fonctionne, et je ne sais pas trop à quel CPU les drivers réseau sont
branchés.
Mais après tout, c’est pour router chez moi, où je fais à peine 250Mbps le
vent dans le dos, donc pourquoi pas.
core01-rennes ~ # lscpu
Architecture: aarch64
CPU op-mode(s): 64-bit
Byte Order: Little Endian
CPU(s): 12
On-line CPU(s) list: 0-11
Vendor ID: ARM
BIOS Vendor ID: Cix Technology Group Co., Ltd.
Model name: Cortex-A520
BIOS Model name: CIX P1 CP8180 CPU @ 2.6GHz
BIOS CPU family: 258
Model: 1
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Stepping: r0p1
Frequency boost: disabled
CPU(s) scaling MHz: 44%
CPU max MHz: 1800.0000
CPU min MHz: 800.0000
BogoMIPS: 2000.33
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha
3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull sve
bitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti mte ecv afp mte3 wfxt
Model name: Cortex-A720
BIOS Model name: CIX P1 CP8180 CPU @ 2.6GHz
BIOS CPU family: 258
Model: 1
Thread(s) per core: 1
Core(s) per socket: 8
Socket(s): 1
Stepping: r0p1
CPU(s) scaling MHz: 42%
CPU max MHz: 2600.0000
CPU min MHz: 800.0000
BogoMIPS: 2000.33
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha
3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull sve
bitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti mte ecv afp mte3 wfxt
Caches (sum of all):
L1d: 640 KiB (12 instances)
L1i: 640 KiB (12 instances)
L2: 4 MiB (12 instances)
L3: 12 MiB (1 instance)
NUMA:
NUMA node(s): 1
NUMA node0 CPU(s): 0-11
Vulnerabilities:
Gather data sampling: Not affected
Ghostwrite: Not affected
Indirect target selection: Not affected
Itlb multihit: Not affected
L1tf: Not affected
Mds: Not affected
Meltdown: Not affected
Mmio stale data: Not affected
Old microcode: Not affected
Reg file data sampling: Not affected
Retbleed: Not affected
Spec rstack overflow: Not affected
Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Spectre v1: Mitigation; __user pointer sanitization
Spectre v2: Mitigation; CSV2, BHB
Srbds: Not affected
Tsa: Not affected
Tsx async abort: Not affected
Vmscape: Not affected
J’ai voulu bêtement tenter l’installation en PXE comme d’habitude, mais
l’UEFI ne sait pas faire ça dans les menus, et j’ai pas trouvé la commande
pour le faire depuis le shell UEFI (j’ai pas beaucoup cherché non plus).
J’ai donc profité d’avoir récupéré des clés USB FRNIX au récent aPEERo de
Rennes pour la dd et booter dessus, ça ne m’était pas
arrivé depuis bien longtemps.
La machine a bien booté correctement sur le live gentoo, mais je n’avais
pas de réseau. En effet les NICs realtek 10G étaient trop récentes pour le
kernel LTS du moment (6.12). J’ai profité d’avoir un port PCI pour mettre
une carte broadcom qui traînait chez moi et affaire réglée.
J’ai donc ensuite suivie la procédure classique d’installation de gentoo,
mais en UEFI (une première pour moi, j’ai toujours activé la rétrocompat
BIOS par flemme de changer mes habitudes).
Une fois l’installation faite je suis passé sur un kernel 6.18 (en
estimant que ça sera celle là qui deviendra la prochaine LTS, on verra
bien) afin de profiter des drivers ajoutés en 6.16. J’ai donc maintenant 4 cartes réseau
et une carte Wi-Fi sur mon routeur, avec des noms toujours aussi
prévisibles, merci la convention de nommage systemd.
core01-rennes ~ # lspci -k
00:00.0 PCI bridge: Cadence Design Systems, Inc. Device 0100
Kernel driver in use: pcieport
Kernel modules: cdns3_pci_wrap, cdnsp_udc_pci
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. Device 8127 (rev 05)
Subsystem: Realtek Semiconductor Co., Ltd. Device 0123
Kernel driver in use: r8169
Kernel modules: r8169
30:00.0 PCI bridge: Cadence Design Systems, Inc. Device 0100
Kernel driver in use: pcieport
Kernel modules: cdns3_pci_wrap, cdnsp_udc_pci
31:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. Device 8127 (rev 05)
Subsystem: Realtek Semiconductor Co., Ltd. Device 0123
Kernel driver in use: r8169
Kernel modules: r8169
60:00.0 PCI bridge: Cadence Design Systems, Inc. Device 0100
Kernel driver in use: pcieport
Kernel modules: cdns3_pci_wrap, cdnsp_udc_pci
61:00.0 Network controller: MEDIATEK Corp. MT7922 802.11ax PCI Express Wireless Network Adapter
Subsystem: MEDIATEK Corp. Device c616
Kernel driver in use: mt7921e
Kernel modules: mt7921e
90:00.0 PCI bridge: Cadence Design Systems, Inc. Device 0100
Kernel driver in use: pcieport
Kernel modules: cdns3_pci_wrap, cdnsp_udc_pci
91:00.0 Non-Volatile memory controller: Kingston Technology Company, Inc. OM8TAP4 PCIe 4 NVMe SSD (QLC) (DRAM-less)
Subsystem: Kingston Technology Company, Inc. OM8TAP4 PCIe 4 NVMe SSD (QLC) (DRAM-less)
Kernel driver in use: nvme
Kernel modules: nvme
c0:00.0 PCI bridge: Cadence Design Systems, Inc. Device 0100
Kernel driver in use: pcieport
Kernel modules: cdns3_pci_wrap, cdnsp_udc_pci
c1:00.0 Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM5720 Gigabit Ethernet PCIe
Subsystem: Broadcom Inc. and subsidiaries Device 2003
Kernel driver in use: tg3
Kernel modules: tg3
c1:00.1 Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM5720 Gigabit Ethernet PCIe
Subsystem: Broadcom Inc. and subsidiaries Device 2003
Kernel driver in use: tg3
Kernel modules: tg3
core01-rennes ~ # ip l
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp49s0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 38:05:25:33:e2:30 brd ff:ff:ff:ff:ff:ff
3: enp193s0f0: mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:0a:f7:63:93:ca brd ff:ff:ff:ff:ff:ff
4: enp1s0: mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 38:05:25:33:e2:2f brd ff:ff:ff:ff:ff:ff
5: enp193s0f1: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 00:0a:f7:63:93:cb brd ff:ff:ff:ff:ff:ff
6: wlp97s0: mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether b0:6b:11:11:48:e8 brd ff:ff:ff:ff:ff:ff
J’ai ensuite mis une IP sur chaque interface realtek, un PC au bout et j’ai activé le routage. Le but est de savoir si la machine tient le routage au giga (même si c’est un débit que j’atteins uniquement en pic, ça serait dommage de ne pas l’avoir).
core01-rennes ~ # ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host proto kernel_lo
valid_lft forever preferred_lft forever
2: enp49s0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 38:05:25:33:e2:30 brd ff:ff:ff:ff:ff:ff
inet 10.0.22.1/24 scope global enp49s0
valid_lft forever preferred_lft forever
inet6 fe80::3a05:25ff:fe33:e230/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
3: enp193s0f0: mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0a:f7:63:93:ca brd ff:ff:ff:ff:ff:ff
inet 192.168.5.6/24 brd 192.168.5.255 scope global enp193s0f0
valid_lft forever preferred_lft forever
inet6 2a0e:f42:0:3::6/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::20a:f7ff:fe63:93ca/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
4: enp1s0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 38:05:25:33:e2:2f brd ff:ff:ff:ff:ff:ff
inet 10.0.35.1/24 scope global enp1s0
valid_lft forever preferred_lft forever
inet6 fe80::3a05:25ff:fe33:e22f/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
5: enp193s0f1: mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 00:0a:f7:63:93:cb brd ff:ff:ff:ff:ff:ff
6: wlp97s0: mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether b0:6b:11:11:48:e8 brd ff:ff:ff:ff:ff:ff
core01-rennes ~ # ip r
default via 192.168.5.254 dev enp193s0f0 metric 3
10.0.22.0/24 dev enp49s0 proto kernel scope link src 10.0.22.1
10.0.35.0/24 dev enp1s0 proto kernel scope link src 10.0.35.1
192.168.5.0/24 dev enp193s0f0 proto kernel scope link src 192.168.5.6
Et les deux PCs de tests sont configurés de la même façon, en échangeant juste les IPs.
roucool ~ # ip r
default via 10.0.22.1 dev enp0s25
10.0.22.0/24 dev enp0s25 proto kernel scope link src 10.0.22.2
127.0.0.0/8 via 127.0.0.1 dev lo
roucool ~ # ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s25: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:1f:16:1e:f2:bd brd ff:ff:ff:ff:ff:ff
inet 10.0.22.2/24 scope global enp0s25
valid_lft forever preferred_lft forever
inet6 fe80::21f:16ff:fe1e:f2bd/64 scope link
valid_lft forever preferred_lft forever
roucool ~ # mtr -bzwe 10.0.35.2
Start: 2026-02-03T21:35:40+0100
HOST: roucool.swordarmor.fr Loss% Snt Last Avg Best Wrst StDev
1. AS??? 10.0.22.1 0.0% 10 0.1 0.2 0.1 0.3 0.1
2. AS??? 10.0.35.2 0.0% 10 0.3 0.3 0.3 0.4 0.0
En lançant un iperf3 j’ai bien du giga :
roucool ~ # iperf3 -c 10.0.35.2
Connecting to host 10.0.35.2, port 5201
[ 5] local 10.0.22.2 port 46398 connected to 10.0.35.2 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 113 MBytes 947 Mbits/sec 0 462 KBytes
[ 5] 1.00-2.00 sec 112 MBytes 937 Mbits/sec 0 486 KBytes
[ 5] 2.00-3.00 sec 112 MBytes 942 Mbits/sec 2 402 KBytes
[ 5] 3.00-4.00 sec 112 MBytes 935 Mbits/sec 1 345 KBytes
[ 5] 4.00-5.00 sec 111 MBytes 934 Mbits/sec 2 390 KBytes
[ 5] 5.00-6.00 sec 111 MBytes 932 Mbits/sec 0 447 KBytes
[ 5] 6.00-7.00 sec 112 MBytes 940 Mbits/sec 3 389 KBytes
[ 5] 7.00-8.00 sec 111 MBytes 933 Mbits/sec 0 448 KBytes
[ 5] 8.00-9.00 sec 112 MBytes 937 Mbits/sec 0 455 KBytes
[ 5] 9.00-10.00 sec 112 MBytes 940 Mbits/sec 0 457 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 1.09 GBytes 938 Mbits/sec 8 sender
[ 5] 0.00-10.01 sec 1.09 GBytes 936 Mbits/sec receiver
iperf Done.
Donc la machine semble suffisamment taillée pour faire office de CPE. En
lançant un htop pendant le test, j’ai remarqué que l’IRQ
était à 80% sur un seul cœur (en même temps j’ai fait le test avec un seul
flux), mais la question est de savoir s’il y a assez de marge en ayant un
PPP en plus dans l’équation. Je n’ai pas encore testé ce cas de figure car
je n’ai pas encore remplacé mon ancien routeur, mais ça devrait se faire
assez rapidement.