Что такое swap-файл

Развитие компьютерных технологий идёт семимильными шагами. Вспомните, если лет 20 назад было очень хорошо, если у тебя был домашний компьютер с 1ГБ оперативной памяти и частотой одноядерного процессора 2ГГц. Да и техника стоила очень дорого. А что же сейчас? Сейчас у многих телефоны мощнее и производительнее старых компьютеров. Тогда одним из способов расширить возможности своего компьютера было использование подкачки страниц или swap.

ВНИМАНИЕ! Использование подкачки страниц(swap) на SSD приводит к быстрому выходу из строя твердотельных накопителей. Если Вы размещаете свой сервер на хостинге - уточните перед включением swap на каком типе жёстких дисков находится Ваш сервер.

Что такое swap

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

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

Система не постоянно использует область swap, в основном только тогда, когда закончилось свободное место в оперативной памяти (ОЗУ) для запущенных приложений (программ). Поэтому в современных компьютерах не так критично использование swap из-за больших объемов оперативной памяти, сейчас даже 8ГБ ОЗУ считается мало.

Стоит понимать, что перенос из оперативной памяти на резервное хранилище и обратная загрузка страниц памяти в ОЗУ - дополнительная нагрузка на систему, а значит уменьшается производительность. К тому же скорость работы ОЗУ в разы превосходит все существующие жесткие диски. Вы скажете, а как же SSD (solid-state drive, твердотельный накопитель или попросту жёсткий диск)? Если посмотреть на один из критичных параметров SSD - это количество циклов записей/перезаписей. Этот параметр напрямую влияет на продолжительность жизни таких дисков, поэтому использование swap на SSD не рекомендуется.

Без использования swap можно наблюдать в логах ошибки связанные с памятью. Если на Вашем компьютере внезапно стало не хватать ОЗУ, то до увеличения объема можно попробовать использовать swap. Поэтому мы рассмотрим создание файла подкачки на примере операционной системы CentOS 7.

Проверка подкачки страниц

Для начала посмотрим используется в нашей системе swap(обратите внимание, что все команды выполняются от пользователя root, если Вы хотите выполнить их от своего пользователя, то необходимо использовать перед всеми командами sudo):

# swapon --show

Если отсутствует какой-либо вывод - значит swap не используется.

# free -h
       total   used   free   shared   buff/cache   available
Mem:   991M    80M    783M    6.6M    126M    768M
Swap:    0B    0B    0B

Как видно, у нас на компьютере всего 1ГБ оперативной памяти и swap не используется. Теперь посмотрим наличие свободного места на жестком диске:

# df -h
Filesystem   Size   Used   Avail   Use%   Mounted on
/dev/vda2    4.8G   1.1G   3.8G   22%      /
devtmpfs     485M     0   485M    0%      /dev
tmpfs        496M     0   496M    0%      /dev/shm
tmpfs        496M  6.6M    489M   2%     /run
tmpfs        496M     0   496M    0%     /sys/fs/cgroup
/dev/vda1    240M   97M   127M   44%     /boot
tmpfs        100M     0   100M    0%     /run/user/0

В данном случае раздел /dev/vda2 имеет еще 3,8 ГБ свободного места. Сколько выделить под swap места - решать лично Вам основываясь на используемых приложениях, но в большинстве случаев рекомендуется выделять от размера ОЗУ до удвоенного значения.

В нашем случае swap желателен от 1ГБ до 2ГБ. В общих случаях, при ОЗУ меньше 2ГБ мы бы советовали использовать удвоенное значение под swap, при больших объемах ОЗУ - равное значение, но не более 4ГБ. Мы же помним, что swap находится на более медленных устройствах? А значит это напрямую влияет на производительность. Если такой параметр критичен - то стоит рассмотреть покупку дополнительной оперативной памяти.

Создание подкачки страниц

В нашем примере довольно мало места на жёстком диске, поэтому создадим swap размером 1ГБ. Будем использовать команду fallocate, поскольку он позволяет заранее указать размер файла. Создадим файл подкачки в корневой директории.

# fallocate -l 1G /swapfile

В данном примере параметр -l позволяет указать размер файла. Далее идет сам размер 1ГБ и полное название файла вместе с путем.

# ls -lh /swapfile
-rw-r--r-- 1 root root 1.0G Jan 13 22:25 /swapfile

Параметры -lh позволяют вывести данные в удобно-читаемом формате. Как мы видим размер файла соответствует 1ГБ.

Теперь пришло время подумать о безопасности и ограничить доступ к файлу только пользователем root:

# chmod 600 /swapfile
# ls -lh /swapfile
-rw------- 1 root root 1.0G Jan 13 22:25 /swapfile

Далее мы заполняем файл нолями блоками по 1024КБ и указываем проделать данную процедуру 1000 раз, что в итоге будет равно 1ГБ.

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

Теперь инициализируем файл подкачки:

# mkswap /swapfile
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=2d247a05-2677-4fda-966e-5b353ab678c9
# swapon /swapfile

Теперь проверим:

# swapon --show
NAME    TYPE  SIZE  USED  PRIO
/swapfile file 1000M   0B   -2
# free -h
       total   used   free   shared   buff/cache   available
Mem:   991M    81M    65M    6.6M    843M    749M
Swap:   999M    0B    999M

Но после перезагрузки нам надо будет снова включать файл подкачки, поэтому автоматизируем данный процесс с помощью файла /etc/fstab, предварительно скопировав его на случай ошибки:

# cp /etc/fstab /etc/fstab.bkp
# echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab
# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jan 13 15:28:36 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=84c10b6f-4758-4877-ad89-a884b96f7473 /                       xfs     defaults        0 0
UUID=0ea9e01e-0d3b-41b4-91a9-95bd1ffbd9eb /boot                   ext4    defaults        1 2
/swapfile none swap sw 0 0

Настройка параметров работы ОС со swap

Настройка некоторых параметров может сильно повлиять на производительность системы, поэтому внимательно отнесемся к этому. Для начала посмотрим на параметр swappiness, который указывает системе с какого момента надо использовать swap. Это число от 0 до 100, представляющий собой процент оставшегося свободного места в оперативной памяти. Для домашних компьютеров можно установить данный параметр на 60, но для серверных систем лучше уменьшить хотя бы до 10, что мы и сделаем. Для начала проверим текущее значение:

# cat /proc/sys/vm/swappiness
30

Теперь установим с помощью утилиты sysctl:

# sysctl vm.swappiness=10
vm.swappiness = 10
# cat /proc/sys/vm/swappiness
10

Для сохранения данного значения после перезагрузки изменим файл /etc/sysctl.conf или можем переопределить параметр с помощью отдельного файла. Для этого надо разместить его в директории /etc/sysctl.d/, что мы и сделаем:

# touch /etc/sysctl.d/swap.conf
# echo 'vm.swappiness=10' | tee -a /etc/sysctl.d/swap.conf

Следующий параметр vfs_cache_pressure, отвечающий за частоту использования памятью кэшем, т.е. swap. Чем больше параметр, тем реже будет использоваться кэш операционной системой, чаще будет использоваться оперативная память. По умолчанию данный параметр равен 100. Для систем с маленьким количеством оперативной памяти лучше выставим параметр поменьше, например, 50:

# cat /proc/sys/vm/vfs_cache_pressure
100
# sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure = 50

Теперь, как и предыдущий параметр, нам нужно добавить его в конфигурационный файл утилиты sysctl:

# echo 'vm.vfs_cache_pressure=50' | tee -a /etc/sysctl.d/swap.conf

На этом настройка файла подкачки закончена. Потом вернуть значения к параметрам по умолчанию достаточно будет удалить файл /etc/sysctl.d/swap.conf и перезагрузить сервер.

Заключение

Мы узнали как на некоторое время дать себе пространство для маневра и избежать ошибок нехватки памяти(out of memory) в приложениях. Если оперативная память заполнится - компьютер может “повиснуть”, что приведет к остановке всех сервисов. В этом нам сильно поможет файл подкачки.

Но стоит понимать, что это не является панацеей от всех проблем. Если использование всей оперативной памяти у Вас происходит постоянно - стоит рассмотреть вариант оптимизации кода приложений, замене приложений или приобретения нового компьютера/увеличение оперативной памяти. А для всего остального есть swap.

Слишком сложно?
Закажите администрирование серверов.