В процессе обновления высоконагруженных серверов раздачи видео (40Gbit/s с каждого сервера) со старого OpenSuSE 10.2 на новый CentOS 7 (время между релизами - 7 лет) мы столкнулись с рядом проблем - необъяснимый свопинг и запуски OOM killer, неравномерное распределение нагрузки по ядрам, обрывы соединений, скачки системной нагрузки на CPU.
В докладе будет рассказано о том, как мы боролись с этими проблемами и какие технологии для этого использовали.
3. Видео раздача
● 4 x 10 Гбит к пользователям
● 2 x 10 Гбит к хранилищу
● 256 Гбайт RAM — кэш в памяти
● 22 х 480 Гбайт SSD — кэша на SSD
● 2 х E5-2690 v2
4. Содержание
● Память
○ OOM killer
○ Swap
● Сеть
○ Broken pipe
○ Распределение сетевой нагрузки по
ядрам
○ SoftIRQ
10. Что делать с
фрагментацией?
Увеличивать vm.min_free_kbytes!
High/low/min watermark.
/proc/zoneinfo
Node 0, zone Normal
pages free 2020543
min 1297238
low 1621547
high 1945857
11. Информация о текущей
фрагментации
● /proc/buddyinfo
Node 0, zone DMA 0 0 1 0 ...
Node 0, zone DMA32 1147 980 813 450 ...
Node 0, zone Normal 55014 15311 1173 120 ...
Node 1, zone Normal 70581 15309 2604 200 ...
... 2 1 1 0 1 1 3
... 386 115 32 14 2 3 5
... 5 0 0 0 0 0 0
... 32 0 0 0 0 0 0
18. Что делать с NUMA?
Выключить NUMA
● Целиком для ядра:
numa=off
● Для процесса:
numactl —
interleave=all <cmd>
Оптимизировать
приложение
● Многопоточность
во всём
● Node affinity
20. Что уже должно быть
сделано
Ring buffer: ethtool -g/-G
Transmit queue length: ip link/ip link set <DEV>
txqueuelen <PACKETS>
Receive queue length: net.core.
netdev_max_backlog
Socket buffer: net.core.<rmem_default|rmem_max>
net.core.<wmem_default|wmem_max>
net.ipv4.<tcp_rmem|udp_rmem>
net.ipv4.<tcp_wmem|udp_wmem>
net.ipv4.udp_mem
Offload: ethtool -k/-K
24. Что делать с OOO?
Отсылать пакеты одного соединения по одному
маршруту:
● Одно процессорное ядро
● Одна сетевая карта
● Одна очередь
Для этого:
● Привязывать триды/процессы к ядрам
● Привязывать очереди сетевой карты к ядрам
● Использовать RFS