База знаний

Часто задаваемые вопросы, на которые мы уже ответили

Настройка swap

Если ваш проект часто требует большего количества оперативной памяти, ее объем нужно увеличить, изменив тариф бокса.

Но бывают случаи, когда оперативная память исчерпывается незапланированно: на сайтах возникают ошибки, процессы неожиданно завершаются. Чтобы оптимизировать потребление памяти требуется время, в течение которого нужно поддерживать стабильную работу машины.

От внезапных ошибок из-за нехватки оперативной памяти поможет защититься swap, механизм подкачки: на жестком диске создается область (swap-файл), в которую по мере заполнения оперативной памяти выгружаются устаревшие данные. Если какой-то процесс снова обращается к ним, они возвращаются в оперативную память. Стоит отметить, что за счет использования диска работа с информацией замедляется.

Чтобы настроить swap, подключитесь к боксу по SSH и следуйте этой инструкции. 

Подготовка

Перед созданием swap-файла проверьте, что его еще нет:

$ swapon --show

Если вывод команды пуст, значит, swap неактивен.

Альтернативный способ — воспользоваться утилитой free:

$ free -h

Вывод при выключенном swap будет выглядеть так:

              total        used        free      shared  buff/cache   available
Mem:           2.0G         35M        1.6G        3.1M        339M        1.8G
Swap:            0B          0B          0B

Если swap включен, вместо 0B будут указаны значения памяти.

Чтобы увеличить уже существующий swap-файл, пересоздайте его. 

Отключается swap командой:

swapoff /swapfile

/swapfile – произвольное имя swap-файла, может быть и другим: вы увидите его в выводе утилит swapon и free.

Создание SWAP

Инструкция подойдет для CentOS, Debian/Ubuntu. 

1. Проверьте свободное место на диске:

$ df -h

Вывод команды будет примерно таким:

Filesystem       Size   Used    Avail Use%  Mounted on
udev             992M      0     992M   0%  /dev
tmpfs            200M   3.1M     197M   2%  /run
/dev/vda1         31G   993M      30G   4%  /
tmpfs           1000M      0    1000M   0%  /dev/shm
tmpfs            5.0M      0     5.0M   0%  /run/lock
tmpfs           1000M      0    1000M   0%  /sys/fs/cgroup
tmpfs            200M      0     200M   0%  /run/user/0

Посмотрите на раздел, обозначенный знаком / в столбце “Mounted on”. Это и будет основной раздел диска, на котором мы разместим swap-файл. В примере выше — это раздел /dev/vda1. Сейчас на нем свободно 30 гигабайт.

2. Создайте файл подкачки с помощью команды fallocate. Эта команда позволяет выделить указанный объем дискового пространства в один файл:

$ fallocate -l 1G /swapfile

C помощью ключа -l задается объем памяти. В качестве примера мы взяли 1 гигабайт. Выделить можно и больше, главное не задействовать весь доступный объем диска. Оптимальное решение — выделить для swap-файла объем, равный объему оперативной памяти.

/swapfile — название swap-файла, пространства, в которое будут перемещены файлы из оперативной памяти. Вы можете назвать его иначе. 

3. Выделите для swap-файла реальное пространство диска. Командой dd заполняем файл нулевыми блоками по 1024КБ и делаем процедуру 1000 раз, что в итоге будет равно 1ГБ:

$ dd if=/dev/zero of=/swapfile bs=1024k count=1000

Если вы выбрали больший объем swap-файла на предыдущем шаге, измените число 1000 пропорционально.

4. В целях безопасности заблокируйте доступ к /swapfile всем, кроме пользователя root:

$ chmod 600 /swapfile

5. Проверьте корректность создания файла и применения настроек с помощью утилиты ls (ключ -l отобразит нужную нам информацию, -h — выведет размер в файла в удобном формате):

$ ls -lh /swapfile

Получаем:

-rw------- 1 root root 1.0G Jan 01 00:00 /swapfile

Права должны быть -rw-------, владелец и группа — root. 

6. Создайте файловую систему swap командой:

$ mkswap /swapfile
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=439b47c2-73c4-4a6e-a603-507e7ecb5bdb

7. Включите файл подкачки:

$ swapon /swapfile

8. Проверьте, что swap активен:

$ swapon --show

Если подключение прошло успешно, вы увидите:

NAME      TYPE  SIZE USED PRIO
/swapfile file 1024M   0B   -1
$ free -h

В нашем случае вывод будет таким:

              total        used        free      shared  buff/cache   available
Mem:           2.0G         36M        1.6G        3.1M        341M        1.8G
Swap:          1.0G          0B        1.0G

Пункты 6 и 7 нужно повторять вручную при каждой загрузке виртуальной машины. Чтобы они применялись автоматически, добавьте информацию о swap-разделе в файл /etc/fstab командой:

$ echo '/swapfile none swap sw 0 0' >> /etc/fstab

Дополнительные настройки swap

У swap есть разные параметры, которые влияют на производительность системы.

С помощью swappiness можно контролировать интенсивность использования swap-файла. Параметр может иметь значения от 0 до 100. Чем ближе к 100, тем больше данных система будет пытаться поместить в подкачку и сберечь тем самым оперативную память. При близких к нулю значениях система не переносит данные на диск, если в этом нет крайней необходимости. Ориентируйтесь на меньшее значение: это позволит увеличить скорость работы системы, так как скорость работы с областью подкачки ниже, чем с оперативной памятью.

Чтобы установить значение 10, выполните:

$ sysctl -w vm.swappiness=10

Посмотреть значение этого параметра можно в файле  /proc/sys/vm/swappiness:

$ cat /proc/sys/vm/swappiness

На количество используемой памяти также влияет vfs_cache_pressure. Параметр указывает, какое время нужно хранить открытые файлы в кеше оперативной памяти. Значение 100 заставляет систему удалять такие файлы очень быстро, 0 — держать их в памяти как можно дольше. Для начала лучше выбрать среднее значение (50), затем ориентироваться на быстродействие системы. Изменить параметр можно через sysctl:

$ sysctl -w vm.vfs_cache_pressure=50

Посмотреть текущее состояние:

$ cat /proc/sys/vm/vfs_cache_pressure


Была ли эта инструкция полезной?