Тюним память и сетевой стек в Linux: история перевода...

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

Transcript of Тюним память и сетевой стек в Linux: история перевода...

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

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

Дмитрий Самсонов

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

OpenSuSE 10.2Release: 07.12.2006End of life: 30.11.2008

CentOS 7Release: 07.07.2014End of life: 30.06.2024

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

Видео раздача● 4 x 10 Гбит к пользователям

● 2 x 10 Гбит к хранилищу

● 256 Гбайт RAM — кэш в памяти

● 22 х 480 Гбайт SSD — кэша на SSD

● 2 х E5-2690 v2

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

Содержание● Память

○ OOM killer○ Swap

● Сеть○ Broken pipe○ Распределение сетевой нагрузки по

ядрам○ SoftIRQ

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

ПамятьOOM killer

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

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 ...

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

Что происходит?OOM killer, скачки system CPU!

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

Фрагментация памятиПамять после загрузки сервера

Через некоторое время

Ещё через какое-то время

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

Почему это происходит?

● Мало свободной памяти● Memory pressure

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

Что делать с фрагментацией?

Увеличивать vm.min_free_kbytes!

High/low/min watermark.

/proc/zoneinfoNode 0, zone Normal pages free 2020543 min 1297238 low 1621547 high 1945857

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

Информация о текущей фрагментации

● /proc/buddyinfoNode 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

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

Почему это плохо повышать

min_free_kbytes?

Потому что часть памяти размером с min_free_kbytes не может быть

использована

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

ПамятьSwap

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

Swap при 40GB свободной памяти и vm.swappiness=0!

Что происходит?

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

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_SIZE21*PAGE_SIZE22*PAGE_SIZE23*PAGE_SIZE24*PAGE_SIZE25*PAGE_SIZE26*PAGE_SIZE27*PAGE_SIZE ...28*PAGE_SIZE ...29*PAGE_SIZE ...210*PAGE_SIZE ...

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

Неравномерное использование

памяти между нодами

NODE 0

(CPU N0)NODE 1

(CPU N1)

Free

Used

Free

Used

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

● numastat -m <PID>● numastat -m

Node 0 Node 1 Total --------------- --------------- ---------------MemFree 51707.00 23323.77 75030.77...

Текущее распределение по нодам

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

Что делать с NUMA? Выключить NUMA

● Целиком для ядра:

numa=off

● Для процесса:

numactl —interleave=all <cmd>

Оптимизировать приложение

● Многопоточность во всём

● Node affinity

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

Сеть

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

Что уже должно быть сделано

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

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

СетьBroken pipe

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

Фон ошибок broken pipe.В tcpdump - half-duplex close sequence.

Что происходит?

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

OOOOut-of-order пакет, т.е. пакет неправильной очерёдности (с неправильным номером SEQ).

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

Что делать с OOO?Отсылать пакеты одного соединения по одному маршруту:

● Одно процессорное ядро● Одна сетевая карта● Одна очередь

Для этого:

● Привязывать триды/процессы к ядрам● Привязывать очереди сетевой карты к ядрам● Использовать RFS

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

Было/сталоКоличество broken pipe/s на сервер

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

Чем плохо строгое определение

“маршрутов”?Нагрузка на ядра процессора может быть не равномерной

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

СетьРаспределение сетевой нагрузки

по ядрам

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

CPU0 загружен на 100%

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

Почему это происходит?

1. Одна очередь - включить больше: ethtool -l/-L

2. Не распределены прерывания:○ распределить динамически -

запустить irqbalance/irqd/birq○ распределить статически -

настроить RSS

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

RSSCPU

RSS

Network

eth0

Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7

0 1 2 3 4 5 6 7 8 9 10 11 12

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

CPU0 - CPU7 загружен на 100%

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

Половина ядер загружены на 100%

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

Нам нужно больше очередей!

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

16 ядер загружены на 100%

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

scaling.txtRPS = Software RSS

XPS = RPS для исходящих пакетов

RFS? Учитывает номер ядра потребителя.

https://www.kernel.org/doc/Documentation/networking/scaling.txt

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

Почему RPS/RFS/XPS это плохо?

1. Нагрузка на ядра процессора может быть не равномерной.

2. Оверхед по CPU

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

Accelerated RFSЕсть у Mellanox, но после включения скорость не поднималась выше 5Gbit/s на 10G интерфейсах.

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

IntelSignature Filter (он же ATR - Application Targeted Receive) - аналог RPS+RFS.

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

СетьSoftIRQ

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

Откуда берутся SoftIRQ

Network

eth0

Q0 Q...

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

Откуда берутся SoftIRQ

Network

eth0

Q0 Q...

CPU

C0 C... HW IRQ 42

RSS

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

Откуда берутся SoftIRQ

Network

eth0

Q0 Q...

CPU

C0 C... HW IRQ 42

SoftIRQNET_RXCPU0

RSS

Обработка HW interrupt завершена

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

Откуда берутся SoftIRQ

Network

eth0

Q0 Q...

CPU

C0 C... HW IRQ 42

SoftIRQNET_RXCPU0

RSS

NAPI poll

Обработка HW interrupt завершена

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

Что делать с высоким SoftIRQ?

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

Модерация прерыванийethtool -c/-C

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

Чем плоха модерация прерываний?

Надо выбирать между пропускной способностью и latency

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

Что происходит?Нелинейный рост

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

Минздрав предупреждает

ИЗМЕНЕНИЯ

ТЕСТЫ

ОТКАТ

ОСТАВИТЬ

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

Спасибо за внимание!● Блог Одноклассников на Хабре http://habrahabr.

ru/company/odnoklassniki/● Тестирование аварий / Андрей Губа

завтра, 3 зал, 17:30http://www.highload.ru/2015/abstracts/1913.html

Дмитрий Самсонов[email protected]