Swap на быстрых локальных NVMe SSD позволяет заметно увеличить число нагрузок на одном узле Kubernetes, показали тесты в трёх сценариях: сборке ядра Linux, браузерных песочницах и изолированных Python-сессиях. Поддержка работы узлов со swap стала общедоступной в Kubernetes 1.34.

При сборке ядра Linux 6.1.1 без swap лимит памяти должен был быть не ниже 600 MB, иначе процесс завершался из-за нехватки памяти (OOM). С swap на локальном SSD лимит удалось снизить вдвое, до 300 MB, и сборка прошла за 374 секунды вместо 433. При лимите 200 MB в swap попал активный рабочий набор, и время сборки выросло более чем на 40%.

В тестах с браузерными песочницами на узле c4-standard-32 с 32 vCPU и 120 GB RAM обычные контейнеры runc без swap упирались в 512 подов, а со swap узел поддерживал 768. Среда gVisor без swap ограничивалась 80 подами, со swap — 160. MicroVM Kata Containers без swap исчерпывали память при 40 подах, со swap стабильно работали 50, после чего ограничением стал CPU.

Изолированные Python-сессии, каждая из которых обрабатывала 5 млн строк из MovieLens 20M и занимала около 375 MiB, без swap исчерпывали память при 80 параллельных запусках. Swap на локальном SSD позволил выгрузить неактивную память и запустить 240 сессий одновременно — втрое больше.

При максимальной плотности поды отвечают дольше главным образом из-за конкуренции за CPU, а не из-за ввода-вывода swap. Для соблюдения заданного времени отклика рекомендуется размещать меньше подов, чем в пиковых результатах тестов.

Для включения swap в Kubernetes 1.34 и новее нужна настройка kubelet, а нагрузкам, которым нужен swap, подходит класс QoS Burstable: запрос памяти у контейнера должен быть меньше лимита. При LimitedSwap доступный объём swap рассчитывается с учётом запроса памяти контейнера и объёма RAM узла.

Авторы отмечают, что результаты получены на быстрых локальных SSD, и переносить их на другую дисковую подсистему без собственных замеров не стоит. В Managed Kubernetes для ручной настройки swap нужно отключить автовосстановление группы узлов и выполнить команды с правами root на каждом рабочем узле.