Как управлять использованием свопа в Linux
Вы могли столкнуться с задержками системы, высоким использованием свопа или проблемами с низкой памятью в вашей системе Linux. Обычный совет - “уменьшить значение swappiness”, уменьшить использование свопа. Но что такое swappiness? И действительно ли его стоит настраивать?
Примечание: мы не будем углубляться в детали своп-раздела. Вы можете прочитать об этом в нашей статье о том, что нужно знать о своп-разделах в Linux.
Swappiness
Существует значение под названием swappiness в системах, подобных UNIX, которое определяет, как будут обрабатываться страницы в памяти. Его значение по умолчанию на большинстве систем составляет “60”, но его можно установить в пределах от 0 до 100. Если память начинает заканчиваться, ядро либо выгрузит некоторые файлы кэша, чтобы освободить больше оперативной памяти для процессов, либо переместит некоторые страницы процесса из оперативной памяти на диск.
Значение по умолчанию 60 означает, что своп будет использоваться реже, а кэши ввода-вывода с большей вероятностью будут освобождены для перераспределения оперативной памяти. Выгрузка кэшей считается “дешевле” (менее ресурсозатратной), в то время как перемещение страниц на своп включает операции чтения и записи с диска, делая их более “дорогими”. При значении ‘60’ использование свопа будет немного ниже, чем повторное использование кэша. Если значение swappiness увеличивается до 100, своп и выгрузка файлового кэша будут использоваться с одинаковым весом. Это означает большее использование свопа и более быструю работу ввода-вывода по сравнению с умолчанием. Низкие значения, такие как “10”, означают, что своп будет использоваться гораздо реже, и кэши ввода-вывода могут быть выгружены гораздо раньше в пользу процессов. Это может повысить взаимодействие, но также может негативно сказаться на скорости I/O.
Уменьшение swappiness
Вы часто можете встретить совет на сайтах и форумах уменьшить swappiness до примерно “10”. Это должно ускорить работу, использовав меньше свопа и оставив больше процессов в физической оперативной памяти. Эта логика может оказаться слишком простой и не быть универсальным решением.
Уменьшение значения swappiness может быть полезно в следующих сценариях:
- Для систем баз данных или если вы используете много приложений с высокой нагрузкой на базу данных: Базы данных, как правило, лучше обрабатывают файловый кэш, чем это делает ОС. Если вы уменьшите swappiness, вы ограничите файловый кэш ОС, дав возможность базе данных управлять своим собственным кэшем.
- Для интерактивности: Если вы часто выполняете многозадачность, но работаете с небольшим количеством файлов или не открываете большие документы, это может улучшить плавность работы вашей системы. Меньше процессов будет записываться на диск, а поскольку доступ к оперативной памяти намного быстрее, ваш компьютер может казаться быстрее. Однако следует учитывать, что это может снизить производительность I/O. Если у вас медленные диски или вы выполняете операции, требующие большого ввода-вывода, это может даже ухудшить производительность.
- Для плацебо-эффекта: Многие считают, что более низкий swappiness ускоряет систему. Если вы думаете, что ваша система работает быстрее, это может создать эффект ее восприятия как более быстрой.
Имейте в виду, что уменьшение swappiness может привести к сбоям и произвольной остановке процессов системой для освобождения памяти. Уменьшение swappiness будет оптимальным, если у вас достаточно оперативной памяти для плавной работы вашей системы. Однако следует поддерживать значение выше “10”, поскольку использование свопа в некотором объеме полезно.
Увеличение swappiness
Увеличение swappiness может иметь общее преимущество в ускорении ввода-вывода. Хотя это не часто рекомендуется, увеличение swappiness может оказаться полезным, если:
- Вы выполняете операции, требующие большого ввода-вывода, и у вас медленные, старые жесткие диски. Например: выполнение резервного копирования или пакетное редактирование изображений могут быть ресурсозатратными по I/O (выдающееся исключение - базы данных, которые естественно интенсивны в плане I/O, но могут выиграть от более низкого значения swappiness, как было упомянуто выше.).
- У вас низкая память, но относительно быстрые диски. В этом маловероятном сценарии более высокое значение swappiness может помочь более эффективно управлять памятью (хотя слишком высокое значение снова может негативно сказаться на производительности.).
Как управлять swappiness
Сначала подумайте, нужно ли вообще менять это значение. Испытываете ли вы проблемы с производительностью? И что более важно, пробовали ли вы другие настройки системы? Если нет, возможно, лучше сначала посмотреть в другом направлении. Но если у вас есть конкретный сценарий на уме, возможно, стоит продолжить.
Далее, насколько велико ваше использование свопа? Вы можете выяснить это с помощью любого инструмента мониторинга производительности на ваш выбор или с помощью команды free. free -m предоставит вам снимок использования памяти в мегабайтах. Для непрерывного мониторинга вы можете использовать watch.
watch -n 1 free -mЭто будет запускать команду free -m каждую секунду и выводить ее результат, пока вы не нажмете “Ctrl + C”.

Как видно на рисунке выше, системой, на которой написана эта статья, используется очень мало свопа.
Теперь, если вы действительно столкнулись с использованием свопа, вас может интересовать, сколько из него активно. Команда vmstat сообщит вам все, что вам нужно знать о использовании виртуальной памяти вашей системы (своп и физическая память вместе).
vmstat 1
Вам нужно проверить столбец swap, где si означает “ввод свопа”, а so означает “вывод свопа”. Если числа высокие, это означает, что много активности свопа, что является индикатором низкой памяти. Если вы видите использование свопа по free, но мало активного свопа, возможна необходимость в настройке swappiness.
Также целесообразно установить другие показатели производительности, такие как ввод-вывод на диск, средние нагрузки и т. д., чтобы при тестировании новых значений swappiness у вас было с чем сравнивать.
Чтобы протестировать другое значение swappiness, вы можете установить его временно с помощью команды sysctl. Это не требует перезагрузки, и эффект будет немедленным. На самом деле, перезагрузка восстановит значение по умолчанию, поэтому вы вполне можете экспериментировать:
sudo sysctl vm.swappiness=10Конечно, вы можете указать любое значение вместо “10” (в пределах от “0” до “100”).
Как только вы найдете предпочтительное значение, вы можете навсегда изменить конфигурацию системы, отредактировав “etc/sysctl.conf”.
sudo nano /etc/sysctl.confи добавив строки
# Установить значение swappiness
vm.swappiness=10в конец этого файла, с тем же установленным значением, конечно.
Заключение
Снижение swappiness до “10” часто рекомендуется как универсальное решение, но реальное использование этой техники может быть чуть сложнее. Установив контрольные показатели, зная свою систему, как вы ее используете и что вам от нее нужно, вы можете точно настроить использование свопа и добиться повышения производительности (либо интерактивности, либо I/O).