Если ваш проект часто требует большего количества оперативной памяти, ее объем нужно увеличить, изменив тариф бокса.
Но бывают случаи, когда оперативная память исчерпывается незапланированно: на сайтах возникают ошибки, процессы неожиданно завершаются. Чтобы оптимизировать потребление памяти требуется время, в течение которого нужно поддерживать стабильную работу машины.
От внезапных ошибок из-за нехватки оперативной памяти поможет защититься 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.
Также строку с его упоминанием нужно удалить из /etc/fstab, чтобы swap не подключался при запуске системы.
Создание 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