Предыдущая версия данного обучающего руководства была написана Джастином Эллингвудом
Один из наиболее простых способов предотвратить ошибки нехватки памяти в приложениях — добавить пространство подкачки на сервер. В этом руководстве мы расскажем, как добавить файл подкачки на сервер Ubuntu 18.04.
Предупреждение: Хотя подкачка в целом рекомендуется для систем с использованием традиционных жестких дисков, ее использование с SSD-накопителями может со временем вызывать ухудшение аппаратного обеспечения. В связи с этим мы не рекомендуем использовать подкачку с DigitalOcean или с любым другим провайдером, использующим SSD-накопители. Использование подкачки может повлиять на надежность соответствующего аппаратного обеспечения у вас и ваших соседей. Настоящее руководство предоставляет справочные данные для пользователей, у которых в других местах имеются системы вращающихся дисков.
Если вам нужно повысить производительность сервера на DigitalOcean, рекомендуем обновить Droplet. Это приведет к лучшим результатам в целом и снизит вероятность создания проблем с аппаратным обеспечением, способных повлиять на ваши работы.
Область подкачки — раздел на жестком диске, отведенный для того, чтобы операционная система могла временно хранить данные, которые она больше не может удерживать в оперативной памяти. По сути, она дает возможность увеличить количество информации, которую сервер может сохранить в рабочей «памяти», с некоторыми оговорками. Область подкачки на жестком диске будет использоваться в основном тогда, когда в оперативной памяти больше нет достаточного места хранения данных для приложений.
Чтение и запись информации с диска намного медленнее, чем из оперативной памяти. Операционная система будет по-прежнему предпочитать работать с данными приложений в памяти, а подкачку использовать для более старых данных. Как правило, полезно перестраховываться и иметь область подкачки в качестве резерва на случай нехватки оперативной памяти, чтобы исключить ошибки памяти в системах без SSD.
Сначала мы можем посмотреть, есть ли уже в системе область подкачки. Можно иметь несколько файлов или разделов подкачки, но обычно одного достаточно.
Можно узнать, сконфигурирована ли в системе подкачка, введя:
- sudo swapon --show
Если после этой команды ничего не появляется, в системе сейчас нет области подкачки.
Можно убедиться в отсутствии активной подкачки при помощи утилиты free
:
- free -h
Output total used free shared buff/cache available
Mem: 985M 84M 222M 680K 678M 721M
Swap: 0B 0B 0B
В строке Swap видно, что в системе отсутствует активная подкачка.
Перед созданием файла подкачки проверим текущее состояние диска, чтобы убедиться, что у нас достаточно места. Вводим:
- df -h
OutputFilesystem Size Used Avail Use% Mounted on
udev 481M 0 481M 0% /dev
tmpfs 99M 656K 98M 1% /run
/dev/vda1 25G 1.4G 23G 6% /
tmpfs 493M 0 493M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 493M 0 493M 0% /sys/fs/cgroup
/dev/vda15 105M 3.4M 102M 4% /boot/efi
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: 985M 84M 220M 680K 680M 722M
Swap: 1.0G 0B 1.0G
Подкачка успешно настроена, и операционная система начнет использовать ее по мере необходимости.
В результате внесенных нами изменений файл подкачки активирован для текущей сессии. После перезагрузки сервер не сохранит настройки подкачки автоматически. Мы можем изменить это, добавив файл подкачки к файлу /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!