Тюним память
и сетевой стек в Linux:
история перевода
высоконагруженных
серверов на свежий
дистрибутив
Дмитрий Самсонов
OpenSuSE 10.2
Release:
07.12.2006
End of life:
30.11.2008
CentOS 7
Release:
07.07.2014
End of life:
30.06.2024
Видео раздача
● 4 x 10 Гбит к пользователям
● 2 x 10 Гбит к хранилищу
● 256 Гбайт RAM — кэш в памяти
● 22 х 480 Гбайт SSD — кэша на SSD
● 2 х E5-2690 v2
Содержание
● Память
○ OOM killer
○ Swap
● Сеть
○ Broken pipe
○ Распределение сетевой нагрузки по
ядрам
○ SoftIRQ
Память
OOM killer
NODE 0
(CPU N0)
1. Вся физическая память
NODE 1
(CPU N1)
ZONE_DMA (0-
16MB)
ZONE_DMA32 (0-
4GB)
ZONE_NORMAL
(4+GB)
2. NODE 0
3. Каждая зона
20
*PAGE_SIZE
21
*PAGE_SIZE
2
2
*PAGE_SIZE
2
3
*PAGE_SIZE
2
4
*PAGE_SIZE
25
*PAGE_SIZE
2
6
*PAGE_SIZE
2
7
*PAGE_SIZE ...
28
*PAGE_SIZE ...
2
9
*PAGE_SIZE ...
210
*PAGE_SIZE ...
Что происходит?
OOM killer, скачки system CPU!
Фрагментация памяти
Память после загрузки сервера
Через некоторое время
Ещё через какое-то время
Почему это
происходит?
● Мало свободной памяти
● Memory pressure
Что делать с
фрагментацией?
Увеличивать vm.min_free_kbytes!
High/low/min watermark.
/proc/zoneinfo
Node 0, zone Normal
pages free 2020543
min 1297238
low 1621547
high 1945857
Информация о текущей
фрагментации
● /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
Почему это плохо
повышать
min_free_kbytes?
Потому что часть памяти размером
с min_free_kbytes не может быть
использована
Память
Swap
Swap при 40GB свободной памяти
и vm.swappiness=0!
Что происходит?
NODE 0
(CPU N0)
1. Вся физическая память
NODE 1
(CPU N1)
ZONE_DMA (0-
16MB)
ZONE_DMA32 (0-
4GB)
ZONE_NORMAL
(4+GB)
2. NODE 0
3. Каждая зона
20
*PAGE_SIZE
21
*PAGE_SIZE
22
*PAGE_SIZE
23
*PAGE_SIZE
24
*PAGE_SIZE
25
*PAGE_SIZE
26
*PAGE_SIZE
27
*PAGE_SIZE ...
28
*PAGE_SIZE ...
29
*PAGE_SIZE ...
210
*PAGE_SIZE ...
Неравномерное
использование
памяти между нодами
NODE 0
(CPU N0)
NODE 1
(CPU N1)
Free
Used
Free
Used
● numastat -m <PID>
● numastat -m
Node 0 Node 1 Total
--------------- --------------- ---------------
MemFree 51707.00 23323.77 75030.77
...
Текущее распределение
по нодам
Что делать с NUMA?
Выключить NUMA
● Целиком для ядра:
numa=off
● Для процесса:
numactl —
interleave=all <cmd>
Оптимизировать
приложение
● Многопоточность
во всём
● Node affinity
Сеть
Что уже должно быть
сделано
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
Сеть
Broken pipe
Фон ошибок broken pipe.
В tcpdump - half-duplex close sequence.
Что происходит?
OOO
Out-of-order пакет, т.е. пакет неправильной
очерёдности (с неправильным номером SEQ).
Что делать с OOO?
Отсылать пакеты одного соединения по одному
маршруту:
● Одно процессорное ядро
● Одна сетевая карта
● Одна очередь
Для этого:
● Привязывать триды/процессы к ядрам
● Привязывать очереди сетевой карты к ядрам
● Использовать RFS
Было/стало
Количество broken pipe/s на сервер
Чем плохо строгое
определение
“маршрутов”?
Нагрузка на ядра процессора
может быть не равномерной
Сеть
Распределение сетевой нагрузки
по ядрам
CPU0 загружен на 100%
Почему это
происходит?
1. Одна очередь - включить больше:
ethtool -l/-L
2. Не распределены прерывания:
○ распределить динамически -
запустить irqbalance/irqd/birq
○ распределить статически -
настроить RSS
RSS
CPU
RSS
Network
eth0
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
0 1 2 3 4 5 6 7 8 9 10 11 12
CPU0 - CPU7 загружен
на 100%
Половина ядер
загружены на 100%
Нам нужно больше
очередей!
16 ядер загружены на
100%
scaling.txt
RPS = Software RSS
XPS = RPS для исходящих
пакетов
RFS? Учитывает номер ядра
потребителя.
https://www.kernel.
org/doc/Documentation/networking/s
Почему RPS/RFS/XPS
это плохо?
1. Нагрузка на ядра процессора
может быть не равномерной.
2. Оверхед по CPU
Accelerated RFS
Есть у Mellanox, но после
включения скорость не
поднималась выше 5Gbit/s на 10G
интерфейсах.
Intel
Signature Filter (он же ATR -
Application Targeted Receive) -
аналог RPS+RFS.
Сеть
SoftIRQ
Откуда берутся
SoftIRQ
Network
eth0
Q0 Q...
Откуда берутся
SoftIRQ
Network
eth0
Q0 Q...
CPU
C0 C...
HW
IRQ
42
RSS
Откуда берутся
SoftIRQ
Network
eth0
Q0 Q...
CPU
C0 C...
HW
IRQ
42
SoftIRQ
NET_RX
CPU0
RSS
Обработка HW
interrupt завершена
Откуда берутся
SoftIRQ
Network
eth0
Q0 Q...
CPU
C0 C...
HW
IRQ
42
SoftIRQ
NET_RX
CPU0
RSS
NAPI
poll
Обработка HW
interrupt завершена
Что делать с
высоким SoftIRQ?
Модерация прерываний
ethtool -c/-C
Чем плоха модерация
прерываний?
Надо выбирать между пропускной
способностью и latency
Что происходит?
Нелинейный рост
Минздрав
предупреждает
ИЗМЕНЕНИЯ
ТЕСТЫ
ОТКАТ
ОСТАВИТЬ
Спасибо за внимание!
● Блог Одноклассников на Хабре http://habrahabr.
ru/company/odnoklassniki/
● Тестирование аварий / Андрей Губа
завтра, 3 зал, 17:30
http://www.highload.ru/2015/abstracts/1913.html
Дмитрий Самсонов
dmitry.samsonov@odnoklassniki.ru

Тюним память и сетевой стек в Linux: история перевода высоконагруженных серверов на свежий дистрибутив