Как посмотреть информацию о swap? Создание SWAP раздела

Подкачка страниц (англ. 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 ГБ.

  • Создать swap-файл размером 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
  • Сделать файл доступным только для root:
chmod 600 /swapfile
  • Пометить файл как swap-файл (файл подкачки):
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
  • Еще одно связанное значение — vfs_cache_pressure. Эта настройка определяет, насколько система будет кэшировать данные индексных дескрипторах (inode и dentry) по сравнению с другими данными. По сути, это данные доступа к файловой системе. Как правило, искать их довольно сложно, а запрашиваются они часто, так что кэш-память в этом случае весьма полезна. Чтобы узнать текущее значение этого параметра, можно еще раз запросить файловую систему proc:
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 простых действия.

  1. деактивируйте пространство подкачки
    sudo swapoff -v /swapfile
  2. Затем удалите запись файла подкачки /swapfile и файла /etc/fstab
  3. И удалите физический файл подкачки на диске с помощью команды rm:
    sudo rm /swapfile

В этой статье вы научились создавать своп файл в любом Linux и определять какие процессы используют файл подкачки.

PQ VPS сервера в 28+ странах.