Один из самых простых способов повышения скорости отклика сервера и защиты от ошибок памяти в приложениях, это добавить Swap. Swap представляет собой область на жестком диске, где операционная система может временно хранить данные, которые она больше не может держать в оперативной памяти.
В основном, это дает возможность увеличить объем информации, которую ваш сервер может хранить в своей рабочей “памяти”, с некоторыми оговорками. Пространство на жестком диске будет использоваться, главным образом, тогда, когда пространства в оперативной памяти больше не будет достаточным для данных.
Информация записывается на диск будет медленнее (в современных дисках SSD такой проблемы нет), чем информации, хранящейся в оперативной памяти, но операционная система предпочтет продолжать работать с данными приложения в памяти и использовать Swap для старых данных. В целом, имея пространство подкачки, когда оперативной памяти будет исчерпана, является хорошей подстраховкой.
В этом руководстве мы рассмотрим, как создать и включить файл подкачки на сервере с 14.04 Ubuntu.
Прежде чем мы начнем, мы посмотрим на нашу операционную систему, чтобы увидеть, есть ли у нас уже доступное пространство для свопа. Мы можем иметь несколько файлов подкачки или раздел подкачки.
Мы можем увидеть, если система имеет какой-либо сконфигурированный Swap, набрав:
sudo swapon -s
Filename Type Size Used Priority
Если вы получаете на выводе только заголовок таблицы, как я показал выше, у вас в системе в настоящее время нет включенного свопа.
Другой, более привычный способ проверки swopa с помощью утилиты free
, которая показывает нам использование системной памяти. Мы можем видеть нашу текущую память и использование Swap в мегабайтах, набрав:
free -m
total used free shared buffers cached Mem: 4714 147 4567 0 7 78 -/+ buffers/cache: 58 4248 Swap: 0 0 0
Как вы можете видеть выше, общее пространство подкачки в нашей системе равно 0. Это соответствует тому, что мы видели с предыдущей командой.
Типичный способ распределения пространства для подкачки, это использовать отдельный раздел, посвященный этой задаче. Тем не менее, изменять схему разбиения не всегда предоставляется возможным. Мы можем так же легко создать файл подкачки на существующем разделе.
Перед тем, как сделать это, мы должны быть осведомлены о нашем текущем использовании дискового пространства. Мы можем получить эту информацию, набрав:
df -h
Filesystem Size Used Avail Use% Mounted on /dev/sda2 20G 19G 1.7G 92% / devtmpfs 487M 0 487M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 51M 447M 11% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup /dev/sda1 240M 194M 30M 87% /boot tmpfs 100M 0 100M 0% /run/user/0
Как вы можете видеть в первой строке, наш раздел жесткого диска имеет 55 гигабайт свободными, так что у нас есть огромное количество пространства для работы. Это размер среднего VPS, тем не менее, фактическое использование может быть очень разным.
Хотя существует много мнений по поводу соответствующего размера пространства подкачки, это действительно зависит от ваших личных предпочтений и требований приложения. Как правило, swop имеет сумму, равную или вдвое большую объему оперативной памяти вашей системы.
Так как моя система имеет 4 Гб оперативной памяти, и удваивая ее, займет значительную часть моего дискового пространства, с которой мы не готовы расстаться, мы создадим пространство подкачки в 4 гигабайта оперативной памяти, чтобы соответствовать моей системе.
Теперь, когда мы знаем информацию о имеющейся свободной памяти на жестком диске, мы можем создать файл подкачки в нашей файловой системе.
Мы создадим файл с именем swapfile
в нашем корневом каталоге (/). Файл должен занимать объем пространства, который мы хотим для нашего файла подкачки. Есть два основных способа сделать это:
Традиционно, мы создали бы файл с пространством выделенную с помощью команды dd
. Эта универсальная утилита записи на диск из одного места в другое место.
Мы можем использовать ее, чтобы записать нули в файл из специального устройства в системах Linux , расположенных в /dev/zero
.
Мы указываем размер файла, используя комбинацию bs
для размера блока и count
для числа блоков. То, что мы присваиваем каждому параметру почти полностью произвольно.
Например, в нашем примере, мы хотим создать файл в 4 гигабайт. Мы можем сделать это, указав размер блока 1 Гб и 4 блока:
sudo dd if=/dev/zero of=/swapfile bs=1G count=4
4+0 records in
4+0 records out
4284867395 bytes (4.3 GB) copied, 17.6333 s, 431 MB/s
Проверьте вашу команду, прежде чем нажать кнопку ENTER, поскольку это имеет потенциал , чтобы уничтожить данные, если Вы установите файл в неправильном месте.
Мы можем узнать, что 4 гигабайта были выделены, набрав:
ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Feb 13 14:01 /swapfile
Если вы выполнили команду выше, вы можете заметить, что это заняло довольно много времени. На самом деле, вы можете увидеть в выводе, что он использовал систему 18 секунд, чтобы создать файл. Это потому, что он должен записать 4 гигабайта нулей на диск.
Если вы хотите узнать, как создать файл быстрее, удалите этот файл и следуйте ниже:
sudo rm /swapfile
Быстрый способ получить тот же самый файл можно с помощью программы fallocate
. Эта команда создает файл с размером, мгновенно выделяется заранее, фактически без необходимости писать фиктивное содержимое.
Мы можем создать файл в 4 гигабайт, набрав:
sudo fallocate -l 4G /swapfile
Запрос будет возвращен вам почти сразу. Мы можем проверить, что правильное количество пространства было зарезервировано, набрав:
ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Feb 13 14:03 /swapfile
Как вы можете видеть, наш файл создается с правильным количеством установленного пространства.
На данный момент, наш файл создался, но наша система не знает, что это за файл, и как его использовать для обмена. Мы должны сообщить системе, чтобы отформатировать этот файл подкачки, а затем включите его.
Перед тем, как сделать это, хотя, нам нужно настроить разрешения на наш файл так, чтобы он не мог быть прочитан кем-либо, кроме root. Предоставление другим пользователям для чтения или записи в этого файла будет огромным риском для безопасности. Мы можем заблокировать разрешения, набрав:
sudo chmod 600 /swapfile
Убедитесь, что файл имеет необходимые разрешения, набрав:
ls -lh /swapfile
-rw------- 1 root root 4.0G Feb 13 14:06 /swapfile
Как вы можете видеть, только столбцы для корневого пользователя включены флаги чтения и записи.
Теперь, когда наш файл является более безопасным, мы можем указать нашей системе создать пространство подкачки, набрав команду:
sudo mkswap /swapfile
Setting up swapspace version 1, size = 4184320 KiB
no label, UUID=f8f2edfg-crt5-sd45-gy7l-qwf6e3dfgt67
Наш файл теперь готов к использованию в качестве пространства подкачки. Мы можем включить его, набрав:
sudo swapon /swapfile
Мы можем убедиться, что процедура прошла успешно, проверив, использует ли наша система своп сейчас:
sudo swapon -s
Filename Type Size Used Priority /swapfile file 4184322 0 -1
У нас теперь есть новый файл подкачки. Мы можем использовать утилиту free
еще раз, чтобы подтвердить наши выводы:
free -m
total used free shared buff/cache available Mem: 992 315 263 0 414 484 Swap: 2047 489 1558
Наш swap был успешно установлен и наша операционная система будет использовать его по мере необходимости.
У нас есть рабочий файл подкачки, но когда мы перезагрузим сервер, своп не будет работать, его необходимо автоматически включать в систему. Мы можем изменить это, путем модификации файла fstab
.
Измените файл с привилегиями суперпользователя в текстовом редакторе:
sudo nano /etc/fstab
В нижней части файла необходимо добавить строку, которая сообщит операционной системе, автоматически использовать созданный своп-файл:
/swapfile none swap sw 0 0
Сохраните и закройте файл, после изменений.
Есть несколько вариантов, которые вы можете настроить, что будет иметь влияние на производительность вашей системы при работе со свопом.
Параметр swappiness
определяет, как часто ваша система будет обмениваться данными из оперативной памяти в пространство подкачки. Это значение в диапазоне от 0 до 100, который представляет собой процент.
При значениях, близких к нулю, ядро не обменяется данными с диском, если это абсолютно необходимо. Помните, что взаимодействие с файлом подкачки являются “дорогим” в том, что занимает гораздо больше времени, чем взаимодействие с оперативной памятью, и может привести к значительному снижению производительности. Как правило, системы не полагаться на своп, если вы хотите сделать вашу систему быстрее.
Значения, которые находятся ближе к 100 будет пытаться поместить больше данных в своп в попытке освободить как можно больше свободного места в оперативной памяти. В зависимости от профиля памяти ваших приложений или то, что вы используете своем сервере, это может быть лучше в некоторых случаях.
Мы можем увидеть текущее значение swappiness, набрав:
cat /proc/sys/vm/swappiness
40
Для рабочего стола, установка swappiness в 10 оптимально для SSD дисков. Для системы VPS, мы, вероятно, хотим, переместить его ближе к 0.
Мы можем установить другое значение swappiness с помощью команды sysctl
.
Например, чтобы установить swappiness до 10, мы могли бы ввести:
sudo sysctl vm.swappiness=10
vm.swappiness = 10
Этот параметр не будет сохраняться до следующей перезагрузки. Мы можем установить это значение автоматически при перезагрузке, добавив строку в наш файл /etc/sysctl.conf
:
sudo nano /etc/sysctl.conf
В нижней части, вы можете добавить:
vm.swappiness=10
Сохраните и закройте файл, когда сделаете изменения.
Другой параметр, связанный с этим значением, который вы можете изменить это vfs_cache_pressure
. Этот параметр определяет, сколько система подберет для кэша inode и информационных дерева над другими данными.
В основном, это доступ к данным о файловой системе. Вы можете видеть текущее значение, запрашивая proc
в файловую систему:
cat /proc/sys/vm/vfs_cache_pressure
100
Он настроен так, что наша система удаляет информацию inode из кэша слишком быстро. Мы можем установить его в более оптимальное значение, как 45, набрав:
sudo sysctl vm.vfs_cache_pressure=45
vm.vfs_cache_pressure = 45
Опять же, это справедливо только для нашей текущей сессии. Мы можем изменить его, добавив его в наш файл конфигурации, как мы сделали с нашей установкой swappiness:
sudo nano /etc/sysctl.conf
В нижней части, добавьте строку, которая определяет ваше новое значение:
vm.vfs_cache_pressure = 45
Сохраните и закройте файл, когда сделаете изменения.
Следуя инструкциям, приведенным в данном руководстве, дает вам некоторое временное разрешение проблемы с оперативной памятью, с точки зрения вашего использования RAM. Пространство подкачки невероятно полезна, в случае избежания некоторых распространенных проблем.
Если вы работаете в OOM (из памяти) ошибок, или если вы обнаружите, что ваша система не в состоянии использовать нужные вам приложения, наилучшим решением является оптимизации конфигурации приложений или обновления сервера. Настройка пространства подкачки, однако, может дать вам большую гибкость и может помочь использовать менее мощный сервер.