Я использую PC Двигатели ВСУ устройство, работающее под управлением FreeBSD в качестве маршрутизатора NAT. Настройка очень обычная: одно WAN-соединение и одно LAN-соединение.
Теоретически WAN-соединение составляет 800/40 Мбит / с, а LAN - 1/1 Гбит / с. На практике маршрутизатор подключается через гигабитный Ethernet как к модему (WAN), так и к коммутатору Netgear (LAN).
Если я подключу быстрый ПК прямо к WAN-соединению (модему), я могу достичь фактической скорости загрузки около 700 Мбит / с. Но если маршрутизатор находится в промежуточном режиме, производительность сильно падает, и скорость загрузки никогда не превышает 350 Мбит / с.
Это можно легко объяснить недостаточной мощностью маршрутизатора.
Дело в том, что я попытался увидеть, что происходит, и при попытке максимально использовать соединение (фактическая измеренная пропускная способность составляет 350 Мбит / с) процессоры маршрутизатора простаивают около 30% времени.
Я понимаю, что это означает, что процессор не является узким местом. Но что тогда? Есть ли способ более точно определить, что на самом деле делает маршрутизатор и почему он работает только на половину мощности?
Чтобы прояснить мой вопрос, вот некоторые дополнительные детали.
Во-первых, визуальное представление проблемы:
Тогда и для справки вывод top -S -C -H -P -s1 -ocpu
Когда на маршрутизаторе очень мало трафика:
last pid: 14077; load averages: 0.00, 0.00, 0.00 up 0+18:13:58 12:02:53
118 processes: 3 running, 98 sleeping, 17 waiting
CPU 0: 0.0% user, 0.0% nice, 0.8% system, 0.0% interrupt, 99.2% idle
CPU 1: 0.0% user, 0.0% nice, 0.8% system, 0.0% interrupt, 99.2% idle
Mem: 16M Active, 89M Inact, 130M Wired, 497M Buf, 3678M Free
Swap: 8192M Total, 8192M Free
PID USERNAME PRI NICE SIZE RES STATE C TIME CPU COMMAND
11 root 155 ki31 0K 32K CPU1 1 18.0H 100.00% idle{idle: cpu1}
11 root 155 ki31 0K 32K RUN 0 18.0H 100.00% idle{idle: cpu0}
14077 root 20 0 21996K 3120K CPU0 0 0:00 0.10% top
12 root -92 - 0K 272K WAIT 1 5:22 0.00% intr{irq259: re0
12 root -92 - 0K 272K WAIT 0 4:21 0.00% intr{irq260: re1
9 root -16 ki-1 0K 16K pollid 0 1:51 0.00% idlepoll
12 root -60 - 0K 272K WAIT 0 1:40 0.00% intr{swi4: clock
0 root -16 0 0K 160K swapin 1 0:37 0.00% kernel{swapper}
5 root -16 - 0K 16K pftm 0 0:31 0.00% pf purge
24147 root 20 0 12464K 2176K select 0 0:25 0.00% apinger
11846 root 52 20 17144K 2692K wait 1 0:12 0.00% sh
52774 root 20 0 28172K 18060K select 1 0:10 0.00% ntpd{ntpd}
15 root -16 - 0K 16K - 0 0:09 0.00% rand_harvestq
87531 dhcpd 20 0 24820K 13576K select 1 0:08 0.00% dhcpd
44974 unbound 20 0 47020K 19840K kqread 0 0:08 0.00% unbound{unbound}
20 root 16 - 0K 16K syncer 0 0:05 0.00% syncer
И когда я пытаюсь максимально использовать WAN-соединение (и в этом случае получил только 318 Мбит / с):
last pid: 41402; load averages: 0.02, 0.01, 0.00 up 0+18:15:40 12:04:35
118 processes: 4 running, 98 sleeping, 16 waiting
CPU 0: 0.0% user, 0.0% nice, 0.7% system, 34.3% interrupt, 64.9% idle
CPU 1: 0.0% user, 0.0% nice, 0.0% system, 68.7% interrupt, 31.3% idle
Mem: 16M Active, 89M Inact, 130M Wired, 497M Buf, 3678M Free
Swap: 8192M Total, 8192M Free
PID USERNAME PRI NICE SIZE RES STATE C TIME CPU COMMAND
11 root 155 ki31 0K 32K CPU0 0 18.0H 82.86% idle{idle: cpu0}
11 root 155 ki31 0K 32K RUN 1 18.1H 69.87% idle{idle: cpu1}
12 root -92 - 0K 272K WAIT 1 5:27 32.86% intr{irq259: re0
12 root -92 - 0K 272K CPU0 0 4:23 17.19% intr{irq260: re1
14077 root 20 0 21996K 3232K CPU0 0 0:01 0.10% top
9 root -16 ki-1 0K 16K pollid 0 1:51 0.00% idlepoll
12 root -60 - 0K 272K WAIT 0 1:40 0.00% intr{swi4: clock
0 root -16 0 0K 160K swapin 0 0:37 0.00% kernel{swapper}
5 root -16 - 0K 16K pftm 1 0:31 0.00% pf purge
24147 root 20 0 12464K 2176K select 0 0:25 0.00% apinger
11846 root 52 20 17144K 2692K wait 0 0:12 0.00% sh
52774 root 20 0 28172K 18060K select 1 0:10 0.00% ntpd{ntpd}
15 root -16 - 0K 16K - 0 0:09 0.00% rand_harvestq
87531 dhcpd 20 0 24820K 13576K select 1 0:08 0.00% dhcpd
44974 unbound 20 0 47020K 19840K kqread 1 0:08 0.00% unbound{unbound}
20 root 16 - 0K 16K syncer 0 0:05 0.00% syncer
Я разработал плату на физическом чипе Realtek RTL8211E и могу вас заверить, что она способна работать на гигабитной скорости :) (на самом деле 10/100/1000). Единственная проблема с этим физическим чипом была бы в том, если бы он не был подключен к ЦП через гигабитный интерфейс (например, RGMII). Мне не удалось найти в Интернете схему печатной платы вашего роутера, чтобы проверить ее.
Однако, как я уже писал ранее, это скорее похоже на несоответствие дуплекса.
Это довольно старая тема, но я думал, что все равно внесу свой вклад. Узкое место в вашем случае это процессор. У этого ЦП 4 ядра, вы, вероятно, максимально используете одно из ядер, и openBSD предположительно использует один поток для маршрутизации.
Я провел тестирование пропускной способности системы APU в нескольких операционных системах. Результаты разные для BSD и Linux.
Операционные системы на основе BSD (OpenBSD, pfSense и т. Д.) Обеспечивают максимальную скорость передачи 622 Мбит / с на APU, в то время как системы на базе Linux (IPFire, DD-wrt и т. Д.) Легко справляются с 1 Гбит.
Вот более подробная информация о проведенном тесте: https://teklager.se/en/knowledge-base/apu2c0-ipfire-throughput-test-much-faster-pfsense/
И вот тест пропускной способности для BSD: https://teklager.se/en/knowledge-base/apu2c0-pfsense-network-throughput-test/
Если вы не привержены OpenBSD, попробуйте IPFire. Это даст вам полную гигабитную пропускную способность.
Как насчет "средней нагрузки" топа после некоторого времени проведения спидтеста? Достигает ли когда-нибудь 1?
Если это не процессор, может что-то не так с некоторыми нижними уровнями? Я предлагаю проверить, показывает ли ethtool или mii-tool 1000FD в обоих случаях (с маршрутизатором посередине и без него). Может быть, ваша плата маршрутизатора принудительно устанавливает какие-то настройки соединения и, возможно, у вас проблема несоответствия дуплексного режима?
Не могли бы вы запустить «iperf -s» на своем маршрутизаторе, чтобы проверить, как происходит соединение между вашим клиентом и маршрутизатором?
С уважением
Процессор вообще не простаивает, одно ядро 68,7%, другое 34,3% занято обработкой прерываний не простаивает. Простаивает пользовательское пространство, а не ядро.
Не знаком с openbsd, можете ли вы установить привязку процессора так, чтобы одно ядро обрабатывало irq259, а другое - irq260. Затем посмотрите, насколько занято каждое ядро.
Это может быть что-то, связанное с сетевыми картами и путем между ними и ядром / процессором (включая обработку прерываний). Вам следует взглянуть на проверку различных настроек «разгрузки» (извините, я недостаточно знаком с FreeBSD, чтобы предложить правильный инструмент). Также поищите любые другие настройки драйвера сетевой карты, которые можно изменить, и поэкспериментируйте с ними.
Учитывая, что ЦП используется не на 100%, возникает вопрос, что еще в системе ограничивает производительность.
Я держу пари, что у чипов Ethernet просто нет заряда. Согласно ссылке в вопросе, ваша плата использует чип Realtek RTL8111E. Я не знаю ничего конкретного об этом чипе, но я знаю, что не все карты / чипы Ethernet созданы равными. Краткий поиск в Google предполагает, что Realtek не особо уважаемый бренд.
В ходе собственного тестирования несколько лет назад я обнаружил, что «серверные» карты Intel PCIE могут легко работать на линейной скорости даже при отключенных всех функциях разгрузки, но «клиентские» карты Intel PCIE не могут. Карта сервера стоила 120 долларов, карта клиента 30 долларов. Иди разберись.
Одна вещь, которая может улучшить пропускную способность, но может повлиять на задержку, - это посмотреть, включено ли объединение прерываний (термин Linux - не уверен, как настраивать на freeBSD).