LINUX.ORG.RU
решено ФорумAdmin

Сеть в VM вешается под нагрузкой

 , ,


1

4

Есть двухпроцессорный сервер, debian12 libvirt. В CPU2 подключен 81:00.0 Ethernet controller: Broadcom Inc. and subsidiaries BCM57840 NetXtreme II 10 Gigabit Ethernet (rev 11)
Порт сетевой карты добавлен в br1.


Я неправильно описал проблему, актуальное состояние ниже по теме


VM с количеством ядер примерно в 2/3 от всего доступного гипервизору virtio драйвером также подключена к br1

В VM наблюдаю картину

root@avreg889:~# iperf3 -c 192.168.236.12
Connecting to host 192.168.236.12, port 5201
[  5] local 192.168.237.152 port 41452 connected to 192.168.236.12 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  2.56 GBytes  22.0 Gbits/sec    0   1.98 MBytes       
[  5]   1.00-2.00   sec  2.10 GBytes  18.0 Gbits/sec    0   2.26 MBytes       
[  5]   2.00-3.00   sec  2.00 GBytes  17.1 Gbits/sec    0   2.26 MBytes       
[  5]   3.00-4.00   sec  2.02 GBytes  17.4 Gbits/sec    0   2.26 MBytes       
[  5]   4.00-5.00   sec  2.14 GBytes  18.4 Gbits/sec    0   2.40 MBytes       
[  5]   5.00-6.00   sec   222 MBytes  1.87 Gbits/sec  4492    206 KBytes       
[  5]   6.00-7.00   sec   111 MBytes   933 Mbits/sec   34    206 KBytes       
[  5]   7.00-8.00   sec   112 MBytes   944 Mbits/sec  113    249 KBytes       
[  5]   8.00-9.00   sec   112 MBytes   944 Mbits/sec    9    246 KBytes       
[  5]   9.00-10.00  sec   111 MBytes   933 Mbits/sec   98    236 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  11.5 GBytes  9.86 Gbits/sec  4746             sender
[  5]   0.00-10.00  sec  11.5 GBytes  9.85 Gbits/sec                  receiver

И при дальнейших тестах вплоть до перезапуска сети VM ~941 Mbits/sec с постоянными retr. В обратную сторону всегда ~941Mbits/s без retr.
Стоит дать нагрузку планируемым приложением внутри VM начинаются подвисания сети и потери пакетов.

Вопрос: что и где надо подкрутить чтобы хотябы просадок сети не было? Приложение в VM планируется гонять до ~1.5Gb/s видео трафика.

Что я пробовал:

  • уменьшить количества ядер VM и cpuset ядер VM на CPU2. Тогда iperf стабильно показывает ~20Gb/s от VM, но не более ~950Mb/s к VM(-R тест)
  • Правил tcp parameter settings как описано тут https://darksideclouds.wordpress.com/2016/10/10/tuning-10gb-nics-highway-to-hell/ на гипервизоре и VM. Вообще не увидел разницы.

PS. Мало знаком с точечной настройкой сети и numa, грешу на какую-то numa магию. Т.к. на домашнем ПК с одним CPU без каких либо настроек iperf хост-VM в обе стороны выдаёт все ~20Gb/s без retr

★★★

Последнее исправление: Flotsky (всего исправлений: 1)

Что я пробовал

Также попробовал пробросить сетевую карту силами sriov.

Проверить iperf не с кем (до гипервизора по какой-то причине трафик не ходит, допускаю что криво настроил сеть)
Но приложение всё так-же виснет со временем и также наблюдаю просадки и потери пакетов ping до VM, что трактую как сетевую проблему.

Flotsky ★★★
() автор топика

В порядке убывания правильности (с моей точки зрения):

  1. Переставить сеть в шину к CPU1;
  2. Сделать PCI passthrough карточки внутрь VM;
  3. RTFM в сторону https://docs.kernel.org/networking/scaling.html и https://docs.kernel.org/core-api/irq/irq-affinity.html и https://blog.cloudflare.com/how-to-achieve-low-latency/ и т.п. прибивая RX очереди и TX очереди к своему CPU2.
BOOBLIK ★★★★
()
Ответ на: комментарий от BOOBLIK

Переставить сеть в шину к CPU1;

нет такой возможности

Сделать PCI passthrough карточки внутрь VM;

опробовано комментарием выше, косвенно проблема осталась, может позже придумаю как более точно проверить

RTFM в сторону

Пойду читать…

Flotsky ★★★
() автор топика

Помониторьте /proc/interrupts в момент проблем — какие прерывания лидируют? Проще всего каким-нибудь prometheus или netdata. На худой конец watch -n 5 -d cat /proc/interrupts, если экрана хватит на многоядерной системе. Исключить ядро/драйверы.

Смущают ровно 5 секунд до затыка — как будто планировщик при росте нагрузки влезает.

Что за процессоры? Кто управляет частотой/питанием — сервер или ядро?

anonymous
()
Ответ на: комментарий от anonymous

watch -n 5 -d cat /proc/interrupts, если экрана хватит на многоядерной системе.

ens1f0-fp-X, где X от 0-15. Соответствует имени интерфейса 10Gb/s сетевой карты на которую приходится трафик.
Что кстати странно, в общении участвуют только VM и гипервизор, зачем дёргать физическую сетевую карту?

Что за процессоры? Кто управляет частотой/питанием — сервер или ядро?

CPU E5-2683 v4 @ 2.10GHz, силами tuned включен профиль virtual-host, что подразумевает под собой cpu governor=performance

Flotsky ★★★
() автор топика
Ответ на: комментарий от Flotsky

Сделать PCI passthrough карточки внутрь VM; опробовано комментарием выше, косвенно проблема осталась, может позже придумаю как более точно проверить

Проверил точно. Пробросил другой порт, который подключен к такой-же карточке соседнего гипервизора.

iperf в 3 потока успешно утилизировал весь канал в обе стороны без каких либо проблем.

Flotsky ★★★
() автор топика

ХМ, я совсем неправильно описал проблему.

В VM наблюдаю картину root@avreg889:~# iperf3 -c 192.168.236.12 и всегда 1Gb/s в обратную сторону

Я неправильно запускал тест. У меня на гипервизоре 236.12 это адрес моста с 1Gb/s интерфейсом и br1 мост без IP с 10Gb карточкой и VM.
Поэтому такой iperf тест ходил петлёй через коммутатор с гигабитным портом с одной из сторон.

Почему я после поднятия интерфейса в VM в начале теста видел ~20Gb/s для меня загадка.

Flotsky ★★★
() автор топика

Попробуй увеличь размер кадра (MTU) на сетевой и со стороны оборудования куда она подключена.

kostik87 ★★★★★
()
Ответ на: комментарий от Flotsky

ХМ, я совсем неправильно описал проблему.

Попробую ещё раз.

Есть ПО avreg, с кучей камер. avreg с каждой камеры забирает 2 потока: основной для записи без декодирования и вторичный ~720p для просмотра с декодированием.
Где-то для половины камер пришлось явно забирать rtsp поток по tcp.

Проблема: стоит запустить avreg он в течении нескольких минут начинает вешаться с кучей ошибок переподключений к камерам. Это зависание всегда сопровождается кратными «скачками» LA до значений в 2-8X от «обычной нагрузки сервиса»

В качестве сети проброшенная по SRIOV сетевая карта.

Как я вижу проблему:

  • В процессе работы LA подскакивает до каких-то нереально больших значений, потом может зависнуть в этом состоянии или постепенно опускаться до «нормальных» значений. И так периодически.
    • При этом ping VM показывает «просадки» времени ответа до 500ms и/или потери
    • Также ip -s -s link show показывает сильный рост rx_errors, ethtool -S это показывает как rx_discards
    • avreg всегда рядом с проблемой начинает спамить сообщениями об отвале камер

Я вроде понимаю, что у меня CPU не справляется с забирать пакетики от сетевой карты, но работающего решения не нашёл

Что я уже успел попробовать:

  • net.core.netdev_budget=9600 и net.core.netdev_budget_usecs=48000 с виду заставляют проблему возникать «реже», но не более
    • по крайней мере скорость и частота прироста rx_errors резко падает, но «просадки ping» остаются и почти всегда коррелируют с ростом rx_errors и ошибками avreg
    • выставление значений netdev_budget выше 1200 с виду не имеет особого эффекта
  • ethtool -g показывает, что буферы на стороне сетевой карты уже выставлены на максимум, увеличивать нечего
  • ethtool -k большая часть оптимизаций включены, для драйвера bnx2x явных тем вида «отключите то-то» не вижу, оставляю как есть
  • Установка и включение сервиса irqbalance с виду не меняет ничего или явно делает хуже
  • Любые варианты запуска iperf не вызывают проблему
  • Сетевая карта не позволяет менять MTU или я не понял как это делать
Flotsky ★★★
() автор топика
Ответ на: комментарий от Flotsky

Попробуй в sysctl.conf добавь
vm.overcommit_memory = 1
vm.overcommit_ratio = 100
vm.vfs_cache_pressure = 1000
net.core.default_qdisc = fq_codel
net.ipv4.tcp_congestion_control = cubic
net.ipv4.tcp_mtu_probing = 1
vm.laptop_mode = 0

В iptables

iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -o eth1 -j TCPMSS --clamp-mss-to-pmtu

Где eth1 твои сетевые карты.
И ethtool -r сетевая карта

romlejokke
()
Ответ на: комментарий от romlejokke

Странные параметры, но ладно. Применил

sysctl vm.overcommit_memory=1
sysctl vm.overcommit_ratio=100
sysctl vm.vfs_cache_pressure=1000
sysctl net.ipv4.tcp_mtu_probing=1
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -o ens11 -j TCPMSS --clamp-mss-to-pmtu

Остальные параметры уже в нужных значениях. Разницы не увидел, откатил.

Когда sysctl.conf правишь перезагружаться не забывай

Допускаю для теста поправить параметры без правки conf файлов не перезагружаясь, проверил оба варианта на всякий

Flotsky ★★★
() автор топика
Ответ на: комментарий от Flotsky

Скорее всего debian собран без серверных инструкций CPU.
На gentoo я наблюдал двукратный буст при сборке всей системы под нативную архитектуру процессора.
Вот скорость просто помноженная на 2.
Там всё быстрее и особенно сеть.
cpu governor=performance это не совсем правильный метод.
Нужно выставлять минимальную частоту примерно 40 или 50% от максимальной в турбобусте.
Например --governor schedutil -d 2GHz -u 4GHz
Некоторые чипсеты могут выставлять частоту до мегагерца в точности.
У некоторых фиксированные уровни, это тоже учитывайте.

romlejokke
()
Ответ на: комментарий от Flotsky

А ты не пробовал сделать виртуальную сетевую карту в qemu? virtio+vhost

Возможно проброс физической карты создает избыточную нагрузку на проц из-за обработки прерываний гипервизором, может так оказаться (теоретически), что виртуальная карта будет лучше.

soomrack ★★★★★
()
Ответ на: комментарий от romlejokke

Когда sysctl.conf правишь перезагружаться не забывай

зачем? sysctl позволяет модифицировать параметры в процессе работы системы.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

Я начал с virtio+vhost и также наблюдал проблему + ещё и на гипервизоре в виде tx_errors на vnet интерфейсе.

Поэтому пробросил сетевую в VM чтобы исключить сеть гипервизора.

Flotsky ★★★
() автор топика
Ответ на: комментарий от romlejokke

Скорее всего debian собран без серверных инструкций CPU.

Вы про x86-64-vX?

Если да, то и на гипервизоре и в VM

# ld.so --help
...
Subdirectories of glibc-hwcaps directories, in priority order:
  x86-64-v4
  x86-64-v3 (supported, searched)
  x86-64-v2 (supported, searched)
...

Не вижу тут явных проблем. Поменять ОС на гипервизоре всёравно не получится

Flotsky ★★★
() автор топика
Ответ на: комментарий от Flotsky

Ну тогда хз, может и невозможно сделать то, что ты хочешь.

Работа с проброшенным железом все равно идет через хост систему, точнее, через модуль ядра который обрабатывает VMX или SVM прерывания, т.е. переключение в контекст ядра хост системы все равно происходит, а сеть гипервизора вся в ядре, поэтому там нет дополнительного переключения из пространства пользователя… ну чисто теоретически…

soomrack ★★★★★
()
Ответ на: комментарий от Flotsky

Откатился на вариант с vnet (bridge на гипервизоре и к нему подключена VM) и кажется сделал достаточно лучше за счёт:

  • Включил multiqueue для сети. В libvirt это добавить <driver name="vhost" queues="16">
    • я ранее это уже пробовал но оно не дало эффекта
  • Увеличил размер очереди для vnet интерфейса # ip l set vnet7 txqlen 16000
    • пока руками, потом как-то автоматизирую
  • Внутри VM выставил net.core.netdev_budget=9600 net.core.netdev_budget_usecs=48000

После этого не вижу чтобы явно пакеты терялись.

Сильно долго копаю, точно знаю что только первого пункта мало, возможно что-то из других пунктов тоже лишнее, но откатывать уже не буду.

Есть ещё какие-то странности в VM, но явно не могу их с сетью увязать, пока понаблюдаю…

Flotsky ★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.