Вступление
Один из самых простых способов сделать ваш сервер более отзывчивым и защититься от ошибок нехватки памяти в вашем приложении — это добавить немного пространства подкачки. Подкачка (swap) — это область на накопителе, где операционная система может временно хранить данные, которые она больше не может хранить в памяти.
Это дает вам возможность увеличить объем информации, которую ваш сервер может хранить в своей рабочей памяти, с некоторыми оговорками. Чтение и запись в своп медленнее, чем использование памяти, но это может обеспечить хорошую подстраховку, когда на вашем сервере мало памяти.
Без подкачки сервер, которому не хватает памяти, может начать убивать приложения, чтобы освободить память, или даже выйти из строя. Это может привести к потере несохраненных данных или простоям. Чтобы обеспечить надежный доступ к данным, для работы некоторых приложений требуется своп.
В этом руководстве мы расскажем, как создать и включить файл подкачки на сервере CentOS 7.
Примечание
Хотя подкачка обычно рекомендуется для систем, использующих традиционные вращающиеся жесткие диски, использование подкачки с твердотельными накопителями может со временем вызвать проблемы с аппаратным износом. В связи с этим мы не рекомендуем включать своп на любом провайдере, который использует хранилище SSD. Это может повлиять на надежность базового оборудования для вас и ваших соседей.
Если вам нужно повысить производительность вашего сервера, мы рекомендуем обновить тариф. Это приведет к лучшим результатам в целом и уменьшит вероятность возникновения проблем с оборудованием, которые могут повлиять на вашу службу.
Предпосылки
Прежде чем приступить к работе с этим руководством, необходимо выполнить несколько шагов.
Вам понадобится сервер CentOS 7, установленный и настроенный с пользователем без полномочий root, у которого есть sudo
привилегии. Если вы еще этого не сделали, вы можете выполнить шаги по начальной настройке сервера CentOS 7, чтобы создать эту учетную запись. Но это не обязательно.
После того, как у вас есть пользователь без полномочий root, вы можете использовать его для SSH на вашем сервере CentOS и продолжить установку вашего файла подкачки. Если вы решили обойтись доступом root — просто не используйте sudo
.
Проверьте систему на наличие информации о свопе
Прежде чем мы начнем, мы должны взглянуть на хранилище нашего сервера, чтобы увидеть, есть ли у нас уже доступное пространство подкачки. Хотя у нас может быть несколько файлов подкачки или разделов подкачки, обычно одного должно быть достаточно.
Мы можем увидеть, есть ли в системе какой-либо настроенный своп, используя swapon
утилиту свопинга общего назначения. С -s
флагом swapon
будет отображаться сводка использования и доступности подкачки на нашем устройстве хранения:
swapon -s
Если команда ничего не возвращает, значит сводка пуста и файла подкачки не существует.
Другой способ проверки пространства подкачки — с помощью free
утилиты, которая показывает нам общее использование памяти системой. Мы можем увидеть наше текущее использование памяти и подкачки (в мегабайтах), набрав:
free -m
total used free shared buffers cached
Mem: 3953 315 3637 8 11 107
-/+ buffers/cache: 196 3756
Swap: 0 0 4095
Как видите, наше общее пространство подкачки в системе равно 0. Это соответствует тому, что мы видели с swapon
.
Проверить доступное место для хранения
Типичный способ выделения пространства для подкачки — использование отдельного раздела, предназначенного для этой задачи. Однако изменение схемы разделов не всегда возможно из-за аппаратных или программных ограничений. К счастью, мы можем так же легко создать файл подкачки, который находится в существующем разделе.
Прежде чем мы это сделаем, мы должны знать о нашем текущем использовании диска. Мы можем получить эту информацию, набрав:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 59G 1.5G 55G 3% /
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 8.3M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
Примечание: флаг -h
просто говорит dh
о выводе информации о диске в удобном для чтения формате. Например, вместо того, чтобы выводить необработанное количество блоков памяти в разделе, df -h
будет указано использование и доступность пространства в M (для мегабайт) или G (для гигабайт).
Как видно из первой строки, в нашем разделе хранилища доступно 59 гигабайт, так что у нас достаточно места для работы. Имейте в виду, что это новый экземпляр VPS среднего размера, поэтому ваше фактическое использование может сильно отличаться.
Хотя существует множество мнений о подходящем размере пространства подкачки, на самом деле это зависит от требований вашего приложения и ваших личных предпочтений. Как правило, хорошей отправной точкой является объем, равный или удвоенный объем памяти в вашей системе.
Поскольку в моей системе 4 гигабайта памяти, и удвоение этого объема заняло бы больше места для хранения, чем я готов расстаться, я создам пространство подкачки размером 4 гигабайта, чтобы соответствовать памяти моей системы.
Создать файл подкачки
Теперь, когда мы знаем доступное пространство для хранения, мы можем приступить к созданию файла подкачки в нашей файловой системе. Мы создадим файл с именем swapfile
в нашем корневом ( /
) каталоге, хотя вы можете присвоить этому файлу другое имя, если хотите. Файл должен выделять объем пространства, который мы хотим для нашего файла подкачки, и он должен быть создан в одном непрерывном блоке.
Лучше всего это сделать с помощью dd
утилиты. Эта команда создаст файл размером 4 гигабайта:
sudo dd if=/dev/zero of=/swapfile count=4096 bs=1MiB
После ввода пароля для авторизации sudo
привилегий будет создан файл подкачки. Это может занять некоторое время, после чего вам вернется подсказка. Мы можем убедиться, что для подкачки было зарезервировано правильное количество места, используя ls
:
ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Oct 30 11:00 /swapfile
Как видите, наш файл подкачки был создан с правильным объемом выделенного пространства.
Включить файл подкачки
Прямо сейчас наш файл создан, но наша система не знает, что он должен использоваться для подкачки. Нам нужно указать нашей системе отформатировать этот файл как файл подкачки, а затем включить его.
Прежде чем мы это сделаем, мы должны настроить права доступа к нашему файлу подкачки, чтобы он не был доступен для чтения никому, кроме учетной записи root. Разрешение другим пользователям читать или писать в этот файл было бы огромным риском для безопасности. Мы можем заблокировать разрешения с помощью chmod
:
sudo chmod 600 /swapfile
Это ограничит права на чтение и запись только для учетной записи root. Мы можем убедиться, что файл подкачки имеет правильные разрешения, ls -lh
снова используя:
ls -lh /swapfile
-rw------- 1 root root 4.0G Oct 30 11:00 /swapfile
Теперь, когда наш файл подкачки стал более безопасным, мы можем указать нашей системе настроить пространство подкачки для использования, набрав:
sudo mkswap /swapfile
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=b99230bb-21af-47bc-8c37-de41129c39bf
Наш файл подкачки готов к использованию в качестве пространства подкачки. Мы можем начать использовать его, набрав:
sudo swapon /swapfile
Чтобы убедиться, что процедура прошла успешно, мы можем проверить, сообщает ли теперь наша система о пространстве подкачки:
swapon -s
Filename Type Size Used Priority
/swapfile file 4194300 0 -1
Этот вывод подтверждает, что у нас есть новый файл подкачки. Мы можем free
снова использовать утилиту, чтобы подтвердить наши выводы:
free -m
total used free shared buffers cached
Mem: 3953 315 3637 8 11 107
-/+ buffers/cache: 196 3756
Swap: 4095 0 4095
Наш своп успешно настроен, и наша операционная система начнет использовать его по мере необходимости.
Сделать файл подкачки постоянным
Наш файл подкачки в данный момент включен, но когда мы перезагрузимся, сервер не включит файл для использования автоматически. Мы можем изменить это, изменив fstab
файл, представляющий собой таблицу, управляющую файловыми системами и разделами.
Отредактируйте файл с sudo
привилегиями в текстовом редакторе:
sudo nano /etc/fstab
Внизу файла нужно добавить строку, которая укажет операционной системе автоматически использовать созданный вами файл подкачки:
/swapfile swap swap sw 0 0
Когда вы закончите добавлять строку, вы можете сохранить и закрыть файл. Сервер будет проверять этот файл при каждой загрузке, поэтому с этого момента файл подкачки будет готов к использованию.
Настройте параметры обмена (необязательно)
Вы можете настроить несколько параметров, которые повлияют на производительность вашей системы при работе с свопом. В большинстве случаев эти конфигурации необязательны, и вносимые вами изменения будут зависеть от потребностей вашего приложения и ваших личных предпочтений.
Swappiness
Параметр swappiness
определяет, как часто ваша система выгружает данные из памяти в пространство подкачки. Это значение от 0 до 100, представляющее процент использования памяти, который инициирует использование подкачки.
При значениях, близких к нулю, система не будет обмениваться данными на диск без крайней необходимости. Помните, что взаимодействие с файлом подкачки «дорогое» в том смысле, что оно намного медленнее, чем взаимодействие с памятью, и эта разница в скорости чтения и записи может привести к значительному снижению производительности приложения. Указание системе не полагаться на своп, как правило, сделает вашу систему быстрее.
Значения, близкие к 100, будут пытаться поместить больше данных в своп, чтобы сохранить больше свободной памяти. В зависимости от профиля памяти ваших приложений или того, для чего вы используете свой сервер, в некоторых случаях это может быть лучшим выбором.
Мы можем увидеть текущее значение swappiness, прочитав swappiness
файл конфигурации:
cat /proc/sys/vm/swappiness
30
В CentOS 7 по умолчанию параметр swappiness равен 30, что является справедливой промежуточной точкой для большинства настольных компьютеров и локальных серверов. Для системы VPS мы, вероятно, хотели бы приблизить его к 0.
Мы можем установить для swappiness другое значение с помощью sysctl
команды. Например, чтобы установить swappiness равным 10, мы могли бы ввести:
sudo sysctl vm.swappiness=10
vm.swappiness = 10
Этот параметр сохранится до следующей перезагрузки. Чтобы настройка сохранялась между перезагрузками, мы можем добавить выведенную строку в наш sysctl
файл конфигурации:
sudo nano /etc/sysctl.conf
Добавьте настройку swappiness в конец файла:
vm.swappiness = 10
Когда вы закончите добавлять строку, вы можете сохранить и закрыть файл. Теперь сервер будет автоматически устанавливать swappiness на значение, которое вы заявляли при каждой загрузке.
Давление кеша
Другое связанное значение, которое вы, возможно, захотите изменить, — это vfs_cache_pressure
. Этот параметр влияет на хранение специальных записей метаданных файловой системы. Постоянное чтение и обновление этой информации, как правило, требует больших затрат, поэтому более длительное хранение ее в кэше положительно сказывается на производительности вашей системы.
Вы можете увидеть текущее значение этого давления на кеш, proc
снова запросив файловую систему:
cat /proc/sys/vm/vfs_cache_pressure
100
В текущих настройках наша система слишком быстро удаляет информацию об индексных дескрипторах из кеша. Мы можем установить более консервативное значение, например 50, используя sysctl
:
sudo sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure = 50
Опять же, это действительно только для нашего текущего сеанса. Мы можем изменить это, добавив его в наш файл конфигурации, как мы сделали с нашей настройкой swappiness:
sudo nano /etc/sysctl.conf
Внизу добавьте строку, указывающую новое значение:
vm.vfs_cache_pressure = 50
Когда вы закончите добавлять строку, вы можете сохранить и закрыть файл. Теперь сервер будет автоматически устанавливать давление кэша на значение, которое вы указали при каждой загрузке.
Вывод
Выполняя шаги, описанные в этом руководстве, вы предоставите своему серверу некоторую передышку с точки зрения использования памяти. Пространство подкачки невероятно полезно для предотвращения некоторых распространенных проблем.
Если вы сталкиваетесь с ошибками OOM (недостаточно памяти) или если вы обнаружите, что ваша система не может использовать нужные вам приложения, лучшим решением будет оптимизация конфигураций приложений или обновление сервера. Однако настройка пространства подкачки может дать вам больше гибкости и помочь выиграть время на менее мощном сервере.