Открыть сервис

Swappiness

Swappiness — это параметр настройки ядра операционной системы Linux, определяющий степень предпочтения использования пространства подкачки (swap) на диске по сравнению с освобождением страниц оперативной памяти (RAM) при нехватке памяти. Значение swappiness представляет собой целое число от 0 до 200 (в ядрах до версии 5.8 — от 0 до 100), которое влияет на алгоритм выбора страниц для вытеснения из физической памяти.

История и происхождение

Параметр swappiness был введён в ядро Linux версии 2.6.0 (2003 год) как часть подсистемы управления памятью. Разработчики ядра стремились создать гибкий механизм, позволяющий администраторам систем настраивать поведение подкачки в зависимости от типа нагрузки. Изначально значение по умолчанию было установлено на 60, что считалось компромиссным вариантом между производительностью и экономией памяти.

В ядре Linux 5.8 (2020 год) диапазон допустимых значений был расширен с 0–100 до 0–200. Это изменение было внесено для более тонкой настройки поведения системы на современных серверах с большими объёмами оперативной памяти и специализированными рабочими нагрузками.

Принцип работы

Механизм подкачки страниц

Операционная система Linux использует виртуальную память, которая делится на страницы фиксированного размера (обычно 4 КБ). Когда физическая память (RAM) заполняется, ядро должно освободить место для новых страниц, вытесняя часть существующих страниц на диск (в swap-раздел или swap-файл) или удаляя их из памяти (если это страницы данных, которые можно заново прочитать с диска).

Алгоритм выбора страниц для вытеснения основан на двух основных факторах:

  1. Частота использования — страницы, к которым давно не было обращений, имеют более высокий приоритет для вытеснения.
  2. Тип страницы — различают анонимные страницы (память процессов, кучи, стеки) и страницы файлового кэша (кэшированные данные с диска).

Влияние swappiness

Параметр swappiness управляет весовым коэффициентом между вытеснением анонимных страниц (требующих записи на диск) и страниц файлового кэша (которые можно просто сбросить, если они не изменены). Чем выше значение swappiness, тем больше ядро склонно вытеснять анонимные страницы в swap, а не освобождать файловый кэш. Чем ниже значение — тем чаще ядро будет предпочитать сброс кэша, а не использование swap.

Формально, алгоритм вычисляет «стоимость» вытеснения каждой страницы, и swappiness выступает как множитель для анонимных страниц. При значении 0 ядро никогда не будет вытеснять анонимные страницы (если только это не абсолютно необходимо), а при значении 200 — будет максимально агрессивно использовать swap.

Значения и их влияние

Значение по умолчанию (60)

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

Низкие значения (0–10)

При swappiness около 0 система практически не использует swap, предпочитая освобождать файловый кэш. Это может быть полезно для:

  • Высокопроизводительных вычислений (HPC) — где важна минимальная задержка доступа к памяти.
  • Баз данных в памяти — например, Redis или Memcached, где swap нежелателен.
  • Систем с большим объёмом RAM — где файловый кэш не является критическим ресурсом.

Однако при слишком низком значении (0) в условиях нехватки памяти ядро может начать убивать процессы (OOM-killer) вместо использования swap, что может привести к потере данных.

Высокие значения (100–200)

При swappiness 100 и выше система активно использует swap, даже если в RAM ещё есть свободное место. Это может быть полезно для:

  • Систем с медленной RAM и быстрым SSD — если скорость подкачки на SSD сопоставима с доступом к RAM, можно сэкономить оперативную память для других задач.
  • Серверов с большим количеством фоновых процессов — где неактивные процессы можно выгрузить в swap, освобождая RAM для активных задач.
  • Систем с ограниченной RAM — например, на встраиваемых устройствах.

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

Настройка и просмотр

Текущее значение

Текущее значение swappiness можно просмотреть в файловой системе proc: `` cat /proc/sys/vm/swappiness ``

Временное изменение

Для временной настройки (до перезагрузки) используется команда: `` sysctl -w vm.swappiness=10 ``

Постоянное изменение

Для постоянного изменения необходимо добавить строку в файл /etc/sysctl.conf или в отдельный файл в каталоге /etc/sysctl.d/: `` vm.swappiness = 10 ` После этого изменения применяются командой sysctl -p` или перезагрузкой системы.

Особенности в различных дистрибутивах

Разные дистрибутивы Linux могут устанавливать различные значения по умолчанию:

  • Ubuntu и Debian — значение 60 (стандартное).
  • Red Hat Enterprise Linux и CentOS — значение 30 (более консервативное, ориентированное на серверные нагрузки).
  • Fedora — значение 60.
  • Arch Linux — значение 60.
  • Linux Mint — значение 60.

Некоторые дистрибутивы для настольных систем могут использовать динамические настройки, где swappiness автоматически корректируется в зависимости от доступной памяти и типа нагрузки.

Применение в различных сценариях

Настольные системы

Для настольных компьютеров с достаточным объёмом RAM (8 ГБ и более) рекомендуется значение 10–30. Это позволяет избежать излишнего использования swap, что улучшает отзывчивость системы при переключении между приложениями. Для систем с 4 ГБ RAM или менее значение 60 может быть более подходящим.

Серверы баз данных

На серверах баз данных (например, PostgreSQL, MySQL) рекомендуется значение 1–10. Базы данных активно используют файловый кэш для ускорения доступа к данным, и вытеснение этого кэша в swap может значительно снизить производительность. При этом сам процесс базы данных должен оставаться в RAM.

Веб-серверы

Для веб-серверов (Nginx, Apache) значение 30–60 обычно является оптимальным. Веб-серверы часто обслуживают множество одновременных соединений, и файловый кэш для статического контента может быть полезен, но не критичен.

Контейнерные среды

В средах с контейнерами (Docker, Kubernetes) рекомендуется значение 10–30. Контейнеры обычно имеют ограниченные ресурсы, и использование swap может привести к непредсказуемому поведению. Многие оркестраторы (например, Kubernetes) отключают swap на узлах для повышения стабильности.

Критика и ограничения

Параметр swappiness подвергается критике за то, что он не всегда точно отражает реальную производительность системы. В современных ядрах Linux алгоритм управления памятью стал более сложным, и swappiness является лишь одним из многих факторов, влияющих на принятие решений.

Основные ограничения:

  • Не учитывает скорость диска — swappiness не различает swap на HDD, SSD или NVMe, хотя скорость доступа к ним различается на порядки.
  • Не учитывает тип нагрузки — для интерактивных приложений и пакетной обработки данных оптимальные значения могут различаться.
  • Влияние на OOM-killer — при слишком низких значениях swappiness система может чаще убивать процессы, что нежелательно для production-сред.

Альтернативные подходы к управлению памятью, такие как использование cgroups, memory.limit_in_bytes и zswap, могут предоставить более точный контроль над использованием памяти, чем простая настройка swappiness.

Интересные факты

  • В ядре Linux 5.8 было добавлено значение 200, которое позволяет системе использовать swap даже при наличии свободной RAM, что может быть полезно для тестирования и отладки.
  • Некоторые дистрибутивы для мобильных устройств (например, Android) используют значение 100, чтобы максимально эффективно использовать ограниченную оперативную память.
  • В системах с zram (сжатый swap в RAM) значение swappiness рекомендуется устанавливать высоким (100–200), так как запись в сжатый swap происходит быстрее, чем на диск.

Источники

  1. Документация ядра Linux: Documentation/admin-guide/sysctl/vm.rst
  2. Man-страница sysctl (8)
  3. Архитектура ядра Linux: управление памятью (Robert Love, «Linux Kernel Development»)
  4. Документация дистрибутива Ubuntu: «Swappiness» в Ubuntu Community Help Wiki
  5. Документация Red Hat Enterprise Linux: «Tuning the virtual memory subsystem»

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →