Одним из способов защиты от ошибок, связанных с недостатком памяти в приложениях, является добавление области подкачки на вашем сервере. В этом руководстве мы расскажем, как добавить файл подкачки на сервер Ubuntu 20.04.
<$>[warning] Предупреждение. Хотя подкачка в целом рекомендуется для систем с использованием традиционных жестких дисков, ее использование с SSD-накопителями может со временем вызывать ухудшение работоспособности аппаратного обеспечения. В связи с этим мы не рекомендуем активировать подкачку при использовании услуг DigitalOcean или любого другого провайдера, применяющего SSD-накопители. <$>
Подкачка — это часть хранилища на жестком диске, которая была выделена для временного хранения данных операционной системой в случае переполнения оперативной памяти. Это позволит вам увеличить количество информации, которое ваш сервер может хранить в рабочей памяти, соблюдая определенные меры предосторожности. Область подкачки на жестком диске будет использоваться в основном тогда, когда в оперативной памяти больше нет достаточного места хранения данных для приложений.
Чтение и запись информации с диска намного медленнее, чем из оперативной памяти. Операционная система будет по-прежнему предпочитать работать с данными приложений в памяти, а подкачку использовать для более старых данных. Как правило, полезно перестраховываться и иметь область подкачки в качестве резерва на случай нехватки оперативной памяти, чтобы исключить ошибки памяти в системах без SSD.
Сначала мы можем посмотреть, есть ли уже в системе область подкачки. Можно иметь несколько файлов или разделов подкачки, но обычно одного достаточно.
Можно узнать, сконфигурирована ли в системе подкачка, введя:
- sudo swapon --show
Если после этой команды ничего не появляется, в системе сейчас нет области подкачки.
Можно убедиться в отсутствии активной подкачки при помощи утилиты free
:
- free -h
Output total used free shared buff/cache available
Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi
Swap: 0B 0B 0B
В строке Swap видно, что в системе отсутствует активная подкачка.
Перед созданием файла подкачки проверим текущее состояние диска, чтобы убедиться, что у нас достаточно места. Вводим:
- df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 932K 98M 1% /run
/dev/vda1 25G 1.4G 23G 7% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
/dev/loop0 55M 55M 0 100% /snap/core18/1705
/dev/loop1 69M 69M 0 100% /snap/lxd/14804
/dev/loop2 28M 28M 0 100% /snap/snapd/7264
tmpfs 99M 0 99M 0% /run/user/1000
В данном случае устройство с /
в столбце Mounted on
— наш диск. В данном примере у нас достаточно места (использовано только 1,4 Гбайт). Ваше использование, вероятно, будет другим.
Хотя существует много мнений относительно правильного размера области подкачки, на самом деле он зависит от ваших личных предпочтений и требований приложений. Обычно можно начать с объема, равного объему оперативной памяти в системе, или в два раза большего. Еще одно полезное общее правило — любое превышение 4 Гбайт для области подкачки, скорее всего, не нужно, если вы используете ее только для резервирования оперативной памяти.
Теперь, когда известно свободное место на жестком диске, можно создать файл подкачки в нашей файловой системе. Мы добавим файл необходимого размера под названием swapfile
в корневую (/
) директорию.
Лучше всего создавать файл подкачки при помощи программы fallocate
. Эта команда мгновенно создает файл указанного размера.
Поскольку на сервере в нашем случае 1 Гбайт оперативной памяти, в этом руководстве создадим файл размером 1 Гбайт. Скорректируйте с учетом необходимости на вашем сервере:
- sudo fallocate -l 1G /swapfile
Чтобы проверить правильность выделенного объема памяти, введите:
- ls -lh /swapfile
- -rw-r--r-- 1 root root 1.0G Apr 25 11:14 /swapfile
Файл создан с правильным выделенным объемом памяти.
Теперь, когда у нас есть файл правильного размера, нам нужно превратить его в пространство подкачки.
Сначала нужно изменить права доступа к файлу, чтобы только пользователи с правами root могли читать его содержимое. Это предотвращает доступ обычных пользователей к файлу — такой доступ может существенно влиять на безопасность.
Чтобы передать все права доступа пользователям root, введите:
- sudo chmod 600 /swapfile
Проверьте изменение прав доступа, введя следующее:
- ls -lh /swapfile
Output-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
Теперь только у пользователя с правами root отмечены флажки чтения и записи.
Теперь можем отметить файл как пространство подкачки, введя следующее:
- sudo mkswap /swapfile
OutputSetting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
После этого мы можем активировать файл подкачки, чтобы система могла его использовать:
- sudo swapon /swapfile
Убедитесь, что пространство подкачки активировано, введя следующее:
- sudo swapon --show
OutputNAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -2
Чтобы подтвердить наши выводы, можем снова проверить ответ утилиты free
:
- free -h
Output total used free shared buff/cache available
Mem: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi
Swap: 1.0Gi 0B 1.0Gi
Подкачка успешно настроена, и операционная система начнет использовать ее по мере необходимости.
В результате внесенных нами изменений файл подкачки активирован для текущей сессии. После перезагрузки сервер не сохранит настройки подкачки автоматически. Мы можем изменить это, добавив файл подкачки к файлу /etc/fstab
.
Сделайте резервную копию файла /etc/fstab
на случай если что-то пойдет не так:
- sudo cp /etc/fstab /etc/fstab.bak
Добавьте информацию о файле подкачки в конец файла /etc/fstab
, введя следующее:
- echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Далее рассмотрим некоторые настройки, которые мы сможем обновить, чтобы настроить пространство подкачки.
Существует несколько настраиваемых опций, влияющих на производительность системы при работе с пространством подкачки.
Параметр swappiness
определяет, как часто система выгружает данные из оперативной памяти в пространство подкачки. Его значение выражается числом от 0 до 100 процентов.
При значениях, близких к нулю, ядро не будет выгружать данные на диск, если в этом нет абсолютной необходимости. Взаимодействие с файлом подкачки требует гораздо больше времени, чем взаимодействие с оперативной памятью, и может вызывать значительное снижение производительности. Если система не зависит от подкачки, то, как правило, ее производительность повышается.
При значениях, близких к 100, система будет пытаться выгрузить больше данных на подкачку, чтобы разгрузить оперативную память. В зависимости от профиля памяти приложений и от тех задач, которые ставятся перед сервером, в некоторых случаях это плюс.
Можем увидеть текущее значение фактора swappiness, введя следующее:
- cat /proc/sys/vm/swappiness
Output60
Для настольного компьютера неплохое значение swappiness — 60. Для сервера, возможно, вы захотите приблизить его к 0.
Можно задать другое значение swappiness при помощи команды sysctl
.
Например, чтобы установить значение swappiness 10, можно ввести следующее:
- sudo sysctl vm.swappiness=10
Outputvm.swappiness = 10
Эта настройка будет сохраняться до следующей перезагрузки. Можно автоматически задать это значение при перезагрузке, добавив строку в файл /etc/sysctl.conf
:
- sudo nano /etc/sysctl.conf
Внизу можно ввести следующее:
vm.swappiness=10
Сохраните файл и закройте его после завершения.
Еще одно связанное значение, которое вы, возможно, захотите изменить — vfs_cache_pressure
. Эта настройка определяет, насколько система будет кэшировать данные inode и dentry по сравнению с другими данными.
По сути, это данные доступа к файловой системе. Как правило, искать их довольно сложно, а запрашиваются они часто, так что кэш-память в этом случае весьма полезна. Чтобы узнать текущее значение этого параметра, можно еще раз запросить файловую систему proc
:
- cat /proc/sys/vm/vfs_cache_pressure
Output100
Согласно текущим настройкам, система удаляет данные инодов из кэша слишком быстро. Можно задать более консервативное значение, например 50, введя следующее:
- sudo sysctl vm.vfs_cache_pressure=50
Outputvm.vfs_cache_pressure = 50
Опять-таки, это значение действительно только для текущей сессии. Чтобы сделать его постоянным, нужно (как и в случае со swappiness) изменить файл конфигурации:
- sudo nano /etc/sysctl.conf
Внизу добавьте строку с новым значением:
vm.vfs_cache_pressure=50
Сохраните и закройте файл после завершения.
Следуя настоящему руководству, можно использовать оперативную память более эффективно, предотвращая исключения нехватки памяти. Пространство подкачки может быть весьма полезным для предотвращения некоторых распространенных проблем.
Когда возникают ошибки нехватки памяти или когда система не может запустить нужные приложения, наилучшее решение — оптимизировать конфигурации приложений или обновить сервер.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.
Добрый день. Спасибо за статью. Есть небольшой нюанс, у меня не принимались изменения пока временно не отключил файл подкачки командой “sudo swapoff /swapfile”, а потом после изменений включил его заново. Подредактируйте пожалуйста. В остальном все класс, хорошо и доступно описано.