Подкачка страниц (англ. Paging; иногда используется термин swapping от swap, /swɔp/) — один из механизмов виртуальной памяти, при котором отдельные фрагменты памяти (обычно неактивные) перемещаются из ОЗУ на жёсткий диск (или другой внешний накопитель, такой как флеш- память), освобождая ОЗУ для загрузки других фрагментов памяти.
Временно выгруженные из памяти страницы могут сохраняться на внешних запоминающих устройствах как в файле, так и в специальном разделе на жёстком диске (partition), называемые соответственно swap- файл и swap- раздел. В случае откачки страниц, соответствующих содержимому какого-либо файла (например, memory-mapped files), они могут удаляться. При запросе такой страницы она может быть считана из оригинального файла.
Swapping (или «подкачка памяти») — это процесс, при котором страница памяти копируется в специальное пространство на жестком диске, называемое пространством подкачки (англ. «swap space»), освобождая занимаемый ею объем оперативной памяти. В Linux для этого существует специальная программа — менеджер памяти. Каждый раз, когда системе требуется больше памяти, чем ей физически доступно в данный момент, менеджер памяти ищет все редко используемые страницы памяти и вытесняет их на жесткий диск, предоставляя освободившуюся память другому приложению (процессу).
Как посмотреть информацию о swap? Небольшая утилита swapon, входящая в состав любого дистрибутива Linux, поможет вам посмотреть информацию о разделе swap и оценить его использование. Для просмотра информации о swap, выполним в консоли следующую команду:
HN OpenVZ
swapon -s Filename Type Size Used Priority /dev/sda6 partition 8007676 33948 -1
VE OpenVZ
swapon -s Filename Type Size Used Priority /dev/null partition 2097152 0 -1
В колонке Filename мы видим название раздела, на котором расположен наш swap, колонка Type показывает, что этот раздел диска есть “partition”, Size показывает нам тот размер, который мы определили при установке системы для нашего swap. А вот в Used мы увидим насколько, на текущий момент, использован в нашей системе swap-раздел.
Аналогичную информацию вы можете получить, выполнив в консоли:
cat /proc/swaps
Начиная с ядра 2.6.16, мы можем найти программы использующие swap с помощью smaps из файловой системе proc. Ниже простой bash-скрипт, который выводит все запущенные процессы и их использование подкачки. Это быстро и грязно, но делает свою работу и может быть легко изменено для работы с любой информацией, представленной в /proc/$PID/smaps.
#!/bin/bash # Get current swap usage for all running processes # Erik Ljungstrom 27/05/2011 SUM=0 OVERALL=0 for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do PID=`echo $DIR | cut -d / -f 3` PROGNAME=`ps -p $PID -o comm --no-headers` for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` do let SUM=$SUM+$SWAP done echo "PID=$PID - Swap used: $SUM - ($PROGNAME )" let OVERALL=$OVERALL+$SUM SUM=0 done echo "Overall swap used: $OVERALL"
Скрипт нужно запустить от имени пользователя root, чтобы он мог собирать точные числа. Он по-прежнему будет работать, даже если вы этого не сделаете, но будет сообщать 0 для любых процессов, не принадлежащих вашему пользователю. Вывод упорядочен в алфавитном порядке в соответствии с вашей локалью.
Например, чтобы найти процесс с наибольшим использованием подкачки, просто запустите скрипт следующим образом:
./getswap.sh | sort -n -k 5 ... PID=1624 - Swap used: 3344 - (outline-client ) PID=2247 - Swap used: 5760 - (chrome ) PID=1752 - Swap used: 23296 - (chrome )
Исключить программы, которые вообще не используют своп:
./getswap.sh | egrep -v "Swap used: 0" |sort -n -k 5
Аналогичные данные можно получить используя утилиту smem, запустив ее так:
smem -s swap -r
Команды тестировались на Debian, Ubuntu, CentOS и будут работать на любых дистрибутивах Linux. Рекомендация. Без нужды не создавайте swap-файл более 4 ГБ, разберитесь с параметром swappiness, для сервера его значение стремится к нуля, для десктопного компьютера больше 60. И параметром vfs_cache_pressure.
Значение 60 параметра vm.swappiness говорит о том, что при 100-60=40% занятой ОЗУ Ubuntu начнет использовать swap. Если ОЗУ много, можно изменить параметр, например до 10, 20 и тем самым указать Ubuntu не использовать swap.
swapon --show
free -h
df -h
В примере был выбран размер свопа в 2 ГБ.
fallocate -l 2G /swapfile
Если утилиты fallocate отсутствует или вы получаете сообщение об ошибке, можно использовать для создание файла подкачки утилиту dd
dd if=/dev/zero of=/swapfile bs=1024 count=2097152
ls -lh /swapfile -rw-r--r-- 1 root root 2.0G Dec 18 21:21 /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show NAME TYPE SIZE USED PRIO /swapfile file 2G 0B -2
Чтобы своп оставался доступен после перезагрузки, необходимо добавить файл подкачки в файл /etc/fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Параметр swappiness определяет, как часто система выгружает данные из оперативной памяти в пространство подкачки. Его значение выражается числом от 0 до 100 процентов.
При значениях, близких к нулю, ядро не будет выгружать данные на диск, если в этом нет абсолютной необходимости. Взаимодействие с файлом подкачки требует гораздо больше времени, чем взаимодействие с оперативной памятью, и может вызывать значительное снижение производительности. Если система не зависит от подкачки, то, как правило, ее производительность повышается.
При значениях, близких к 100, система будет пытаться выгрузить больше данных на подкачку, чтобы разгрузить оперативную память. В зависимости от профиля памяти приложений и от тех задач, которые ставятся перед сервером, в некоторых случаях это плюс.
cat /proc/sys/vm/swappiness 60
На моем сервере значение vm.swappiness=60 (это значение по умолчанию на всех Линукс дистрибутивах). Уменьшим параметр до 10:
sysctl vm.swappiness=10
Этот параметр будет действовать до следующей перезагрузки. Установить это значение автоматически при перезапуске, добавив строку в конец файла /etc/sysctl.conf программы sysctl:
echo 'vm.swappiness=10' >> /etc/sysctl.conf
cat /proc/sys/vm/vfs_cache_pressure 100
Согласно текущим настройкам (100), система удаляет данные инодов из кэша слишком быстро. Можно задать более консервативное значение, например 50:
sysctl vm.vfs_cache_pressure=50
Также для того чтобы это параметр загружался автоматически, после перезагрузки операционной системы, добавим его в файл sysctl.conf:
echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf
Всё! Мы добавили и настроили файл подкачки в ОС Linux.
Для удаления своп раздела, выполните 3 простых действия.
sudo swapoff -v /swapfile
sudo rm /swapfile
В этой статье вы научились создавать своп файл в любом Linux и определять какие процессы используют файл подкачки.