Вопрос: Как точно настроить производительность TCP на Linux с помощью волоконно-оптического соединения 10 Гбит


У нас есть 2 сервера Red Hat, предназначенные для тестирования скорости клиентов. Они оба используют 10Gb волоконные соединения и сидят на 10Gb-ссылках. Все сетевые устройства между этими серверами полностью поддерживают 10 Гбит / с. Используя Iperf или Iperf3, лучшее, что я могу получить, составляет около 6,67 Гбит / с. При этом один сервер находится в производстве (клиенты его ударяют), а другой сервер подключен к сети, но не используется. (мы используем его для тестирования atm). 6.67Gb / s также является одним из способов, я должен упомянуть. Мы будем называть эти серверы A и сервер B.

Когда сервер A действует как сервер iperf, мы получаем скорость 6,67 Гбит / с. Когда сервер А действует как клиент на сервер Б, он может только нажимать около 20 Мбит / с.

Что я наделал:

Пока что единственное, что я сделал, это увеличить буферы TX / RX на обоих серверах до их максимального. Один из них был настроен на 512 других 453. (Только RX, TX уже превышен), так что вот что выглядит как после обновления:

Server A:
Ring parameters for em1:
Pre-set maximums:
RX:     4096
RX Mini:    0
RX Jumbo:   0
TX:     4096
Current hardware settings:
RX:     4096
RX Mini:    0
RX Jumbo:   0
TX:     4096

Server B:
Ring parameters for p1p1:
Pre-set maximums:
RX:     4078
RX Mini:    0
RX Jumbo:   0
TX:     4078
Current hardware settings:
RX:     4078
RX Mini:    0
RX Jumbo:   0
TX:     4078

NICS выглядят так:

Server A: 
ixgbe 0000:01:00.0: em1: NIC Link is Up 10 Gbps, Flow Control: RX/TX

Serer B:
bnx2x 0000:05:00.0: p1p1: NIC Link is Up, 10000 Mbps full duplex,     Flow control: ON - receive & transmit

Server A ethtool stats:
 rx_errors: 0
 tx_errors: 0
 rx_over_errors: 0
 rx_crc_errors: 0
 rx_frame_errors: 0
 rx_fifo_errors: 0
 rx_missed_errors: 0
 tx_aborted_errors: 0
 tx_carrier_errors: 0
 tx_fifo_errors: 0
 tx_heartbeat_errors: 0
 rx_long_length_errors: 0
 rx_short_length_errors: 0
 rx_csum_offload_errors: 123049

 Server B ethtool stats:
 [0]: rx_phy_ip_err_discards: 0
 [0]: rx_csum_offload_errors: 0
 [1]: rx_phy_ip_err_discards: 0
 [1]: rx_csum_offload_errors: 0
 [2]: rx_phy_ip_err_discards: 0
 [2]: rx_csum_offload_errors: 0
 [3]: rx_phy_ip_err_discards: 0
 [3]: rx_csum_offload_errors: 0
 [4]: rx_phy_ip_err_discards: 0
 [4]: rx_csum_offload_errors: 0
 [5]: rx_phy_ip_err_discards: 0
 [5]: rx_csum_offload_errors: 0
 [6]: rx_phy_ip_err_discards: 0
 [6]: rx_csum_offload_errors: 0
 [7]: rx_phy_ip_err_discards: 0
 [7]: rx_csum_offload_errors: 0
 rx_error_bytes: 0
 rx_crc_errors: 0
 rx_align_errors: 0
 rx_phy_ip_err_discards: 0
 rx_csum_offload_errors: 0
 tx_error_bytes: 0
 tx_mac_errors: 0
 tx_carrier_errors: 0
 tx_deferred: 0
 recoverable_errors: 0
 unrecoverable_errors: 0

Потенциальная проблема: сервер A имеет тонны rx_csum_offload_errors. Сервер A является одним из производителей, и я не могу не думать, что прерывания процессора могут быть основным фактором здесь и что вызывает ошибки, которые я вижу.

cat / proc / interrupts с сервера A:

122:   54938283          0          0          0          0            0          0          0          0          0          0          0            0          0          0          0          0          0          0           0          0          0          0          0  IR-PCI-MSI-edge      em1-  TxRx-0
123:   51653771          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-1
124:   52277181          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-2
125:   51823314          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-3
126:   57975011          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-4
127:   52333500          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-5
128:   51899210          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-6
129:   61106425          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-7
130:   51774758          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-8
131:   52476407          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-9
132:   53331215          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0  IR-PCI-MSI-edge      em1-TxRx-10
133:   52135886          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0

Отключит ли rx-checkumming помощь, если это то, что может быть проблемой? Также я не вижу прерываний процессора на сервере, который не находится в производстве, что имеет смысл, поскольку его сетевому адаптеру не требуется время процессора.

Server A:
 ethtool -k em1
Features for em1:
rx-checksumming: on
tx-checksumming: on
tx-checksum-ipv4: on
tx-checksum-unneeded: off
tx-checksum-ip-generic: off
tx-checksum-ipv6: on
tx-checksum-fcoe-crc: on [fixed]
tx-checksum-sctp: on [fixed]
scatter-gather: on
tx-scatter-gather: on
tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: on
tx-tcp-segmentation: on
tx-tcp-ecn-segmentation: off
tx-tcp6-segmentation: on
udp-fragmentation-offload: off [fixed]
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: on
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off
receive-hashing: on
highdma: on [fixed]
rx-vlan-filter: on [fixed]
vlan-challenged: off [fixed]
tx-lockless: off [fixed]
netns-local: off [fixed]
tx-gso-robust: off [fixed]
tx-fcoe-segmentation: on [fixed]
tx-gre-segmentation: off [fixed]
tx-udp_tnl-segmentation: off [fixed]
fcoe-mtu: off [fixed]
loopback: off [fixed]

Помимо использования больших фреймов, что невозможно, потому что наш сетевой механизм не поддерживает их, что еще я могу сделать или проверить, чтобы предоставить мне самую оптимальную производительность TCP для моей сети 10Gb? 6.67Gb / s не что плохо, я думаю, принимая во внимание, что один из серверов находится в производстве, и моя гипотеза о том, что процессор прерывает создание сетевого адаптера. Но скорость 20 Мбит / с в другом направлении на линии 10 Гбит просто неприемлема. Любая помощь будет принята с благодарностью.

Характеристики сервера A: x64 24v CPU ОЗУ 32 ГБ RHEL 6.7

Характеристики сервера B: x64 16v CPU 16 ГБ оперативной памяти RHEL 6.7


7
2018-02-17 21:55


Источник


Являются ли серверы одних и тех же спецификаций? Является irqbalance включен? Вы используете настроенный профиль? - ewwhite
Обновленный вопрос для включения спецификаций. irqbalance не включен и не настроен. - user53029
Здесь есть тонна информации настройки. Я использовал его несколько раз. fasterdata.es.net - Stefan Lasiewski


Ответы:


В Linux / Intel я бы использовал следующую методологию анализа производительности:

Оборудование:

  • turbostat
    Ищите состояния C / P для ядер, частот, количества SMI. [1]
  • cpufreq-info
    Ищите текущий драйвер, частоты и регулятор.
  • atop
    Ищите распределение прерываний по ядрам
    Ищите контекстные переключатели, прерывания.
  • ethtool
    -S для статистики, искать ошибки, капли, перерасходы, пропущенные прерывания и т. Д.
    -k для разгрузки, включить GRO / GSO, rss (/ rps / rfs) / xps
    -g для размеров кольца, увеличить
    -c для объединения в прерывание

Ядро:

  • /proc/net/softirq[2] и /proc/interrupts[3]
    Опять же, распределение, пропущенные, задержанные прерывания (необязательно) NUMA-сродство
  • perf top
    Посмотрите, где ядро ​​/ benchmark тратит свое время.
  • iptables
    Посмотрите, есть ли правила (если они есть), которые могут повлиять на производительность.
  • netstat -s, netstat -m, /proc/net/*
    Ищите счетчики ошибок и количество буферов
  • sysctl / grub
    Так много, чтобы настроить здесь. Попробуйте увеличить размеры хэш-таблицы, играя с буферами памяти, контролем перегрузки и другими кнопками.

В вашем случае ваша основная проблема - распределение прерываний по всем ядрам, поэтому исправление этого будет вашим лучшим фактором действия.

PS. Не забывайте, что в таких тестах важную роль играют версии ядра и драйвера / прошивки.

PPS. Вероятно, вы захотите установить новейшие ixgbe драйвер от Intel [4]. Не забудьте прочитать README и изучить каталог сценариев. В нем много советов по производительности.

[0] Intel также имеет хорошие документы о масштабировании производительности сети
https://www.kernel.org/doc/Documentation/networking/scaling.txt
[1] Вы можете привязать процессор к определенному состоянию C:
https://gist.github.com/SaveTheRbtz/f5e8d1ca7b55b6a7897b
[2] Вы можете проанализировать эти данные с помощью:
https://gist.github.com/SaveTheRbtz/172b2e2eb3cbd96b598d
[3] Вы можете установить сродство с:
https://gist.github.com/SaveTheRbtz/8875474
[4] https://sourceforge.net/projects/e1000/files/ixgbe%20stable/


4
2018-02-18 02:25





Являются ли серверы одних и тех же спецификаций (марка и модель)? Вы внесли какие-либо изменения sysctl.conf?

Вы должны включить irqbalance, потому что ваши прерывания происходят только на CPU0.

Если вы не используете настроенный профиль с EL6, вы должны выбрать тот, который близок к вашей рабочей нагрузке, в соответствии с графиком Вот,


3
2018-02-17 22:28



Нет, сервер A - это Dell PE R620 с сетевым подключением SFI / SFP + с корпоративной корпорацией Intel 82599ES (версия 01) и сервером B Dell PE 430. с Broadcom Corporation NetXtreme II BCM57810 10 Gigabit Ethernet (версия 10). Есть ли какие-либо рекомендации по настройке irqbalance для 10 Gb ethernet или я просто запускаю сервис, и так? Я ничего не изменил с помощью sysctl. - user53029
Просто запустите услугу. - ewwhite


Скорость 6 Гбит / с в порядке, если вы запускаете только один экземпляр iperf, так как он ограничен одним ядром процессора. Два процесса одновременно должны дать вам ожидаемые 10 Гбит / с.

Проблема с 20 Мбит / с в одном направлении выглядит как проблема с драйверами / прошивкой / аппаратной несовместимостью.

Я предлагаю вам попробовать следующие действия по устранению неполадок:

У ваших сетевых адаптеров есть два порта, поэтому сначала попробуйте тесты скорости обратной связи на обеих сетевых адаптерах. Это может помочь вам локализовать проблему: на сервере A или на сервере B.  2. Измените патч-корды.  3. Попробуйте новые драйверы.  4. Обновите прошивку.  5. Изменение сетевых адаптеров)


1
2018-02-18 11:01



запуск 2 параллельных потоков дает мне около 9 Гбит / с. Я также заметил, что когда я запускаю параллельные потоки в медленном направлении, скажем, до 10, я могу получить около 220 Мбит / с. 100 параллельно, и я получаю 1,8 Гбит / с. Таким образом, у него есть возможность выталкивать больше данных и теоретически, если бы я использовал достаточное количество потоков, я мог бы, вероятно, получить максимум схемы. Но зачем нужно только 2 потока в одном направлении и несколько в другом? - user53029
Медленное направление всегда от сервера А до сервера Б? - anx
Да, когда сервер A является клиентом iperf, а сервер B принимает пакеты. - user53029
Попробуйте еще один оптический патч. Или замените волокна того, который используется сейчас. Может быть, это сломано. - anx


Я бы попытался отключить LRO (Large Receive Offload) ... Я бы предположил, что у вас есть один с включенным, а один с ним выключен.

Это зависит от NIC / драйвера, но в целом, когда мы видим, что в нашей среде мы знаем, что мы пропустили один, и отключите LRO


0
2018-01-12 15:14