620137 г. Екатеринбург
ул. Комсомольская 6е, офис 213
e-mail:
[email protected]
+7 (343) 382-44-94
+7 (982) 660-660-8
23.08.2018
SWAP (своп) — это механизм виртуальной памяти, при котором часть данных из оперативной памяти (ОЗУ) перемещается на хранение на HDD (жёсткий диск), SSD (твёрдотельный накопитель), флеш-накопитель или иное вторичное хранилище. Как правило, swapping (свопинг) происходит, когда оперативная память переполнена, и ей для работы требуется дополнительное пространство.
Зачастую, от недостатка свободной памяти первой страдает база данных. Вы можете сталкиваться с проблемами типа:
Постоянное падение сайта: Ошибка соединения с базой данных — означает, например, что MySQL упал; При внимательном изучении логов /var/log/mysql.log обнаруживается ошибка InnoDB: Fatal error: cannot allocate memory for the buffer pool. Она свидетельствует о том, что базе данных не хватает выделенной ей оперативной памяти для создания буфера.При подобных симптомах и ошибках может помочь своппинг.
Сравнение стоимости оперативной памяти и SSD | ||
(цены актуальны на 7 июля 2017 года) | IHOR | FirstVDS |
Оперативная память, в среднем за 1 гигабайт | 100 рублей в месяц | 170 рублей в месяц |
SSD, в среднем за 1 гигабайт | 10 рублей в месяц | 13 рублей в месяц |
Как видно из таблицы, экономия выйдет примерно в 10 раз.
SWAP — это не замена оперативной памяти, а всего лишь его поддержка.
Необходимо наличие свободного места на диске Вам необходимо зарезервировать свободное место на диске под своп, иначе стабильность работы не гарантируется. Это не то, чтобы недостаток свопа, просто его надо учитывать и помнить о нём.Далее, в работе используется командная строка SSH .
Инструментарий: Far Manager или Putty. Для примера приводятся команды из под root. Если Вы работаете не под root, перед командами задавайте префикс sudoДля начала, нужно убедиться, что своп ещё не подключен:
swapon -sЕсли команда выдала пустой результат или что-то навроде:
Filename Type Size Used Priority— значит, своп, скорее всего отсутствует.
Дополнительно проверим командой:
free -m Если в таблице в строке swap стоит 0, значит своп отсутствует.Теперь, надо проверить, сколько свободного места есть на диске:
df -hВ результате, мы увидим что-то подобное:
[email protected] :~# df -h Файловая система Размер Использовано Дост Использовано% Cмонтировано в /dev/vda1 30G 20G 9,0G 66% / udev 10M 0 10M 0% /dev tmpfs 403M 41M 362M 11% /run tmpfs 1006M 336K 1005M 1% /dev/shm tmpfs 5,0M 0 5,0M 0% /run/lock tmpfs 1006M 0 1006M 0% /sys/fs/cgroup tmpfs 1006M 492K 1005M 1% /tmpКак мы видим, доступно 9 гигабайт дискового пространства — вполне достаточно, чтобы создать своп-файл.
Исходите из принципа — сколько может понадобиться, столько и выделяйте. Как правило, можно начинать с размера объёма оперативной памяти, либо его удвоенного количества. Например, если у вас в системе 2 гигабайта оперативки, своп можно сделать размером 2-4 гигабайта, как правило, этого должно хватать. Но, Вы можете скорректировать его размер под себя.
Допустим, мы хотим создать swap-файл размером 4 гигабайта.
Далее, здесь существует 2 подхода, традиционный медленный и новый быстрый: Быстрый способ Используем fallocate: fallocate -l 4G /swapfileРезультатом будет пустая строка, это нормально.
В отличие от dd, результат будет получен почти сразу, и я рекомендую именно его. Традиционный, медленный способ Или используем команду: dd if=/dev/zero of=/swapfile bs=1G count=4Синтаксис команды простой:
dd — команда предназначена для того, чтобы что-то куда-то копировать побайтово; if=/dev/zero — указывает на источник, т.е. на то, откуда копируем, в данном случае из /dev/zero — это специальный файл в UNIX-подобных системах, представляющий собой источник нулевых байтов; of=/swapfile — указывает путь назначения, куда копируем данные; bs=1G — количество байт, которые будут записаны за раз. В нашем случае, 1 гигабайт. Обозначения: G — гигабайт, M — мегабайт, K — килобайт, и так далее; count=4 — сколько блоков размером с bs будет создано, в нашем случае 4.Будьте очень внимательны с синтаксисом команды, потому что если, например, ошибиться с определением пути для of= (куда сохранять файл), можно повредить данные на диске.
Теперь, когда файл создан, проверим результат:
ls -lh /swapfileВ результате увидим:
-rw-r--r-- 1 root root 4.0G Jul 07 16:16 /swapfile Как видим, файл создался верно и с нужным объёмом.Для начала, ограничим права доступа к вновь созданному файлу.
Предоставление другим пользователям возможности читать или писать в этот файл будет представлять собой огромный риск для безопасности, поэтому ограничение командой ниже строго обязательно:
chmod 600 /swapfileПроверим результат:
ls -lh /swapfileВ результате, мы должны увидеть подобное:
-rw------- 1 root root 4.0G Jul 07 16:16 /swapfile Права прописаны верно.Теперь нужно сделать из swapfile файл подкачки:
mkswap /swapfileВ результате, увидим примерно следующее:
Setting up swapspace version 1, size = 4193300 KiB no label, UUID=e5f3e9cf-c1a9-4ed4-b8ab-711b6a7d6544Теперь, файл готов в роли свопа. Подключим его к системе:
swapon /swapfile swapon: /swapfile: swapon failed: Operation not permittedЕсли на данном этапе выходит похожая ошибка, значит, скорее всего, своп запрещено подключать в систему. Такое ограничение часто ставят на VDS с виртуализацией OpenVZ. Рекомендую использовать IHOR , сервера от 100 рублей в месяц и виртуализация KVM позволяют включать SWAP .
Всё, теперь своп подключен и работает. Осталось проверить правильность работы самой первой командой:
swapon -s Filename Type Size Used Priority /swapfile file 4193300 0 -1Своп также будет виден в стандартных командах:
free -m total used free shared buffers cached Mem: 2010 1887 122 0 5 30 -/+ buffers/cache: 827 1183 Swap: 4095 0 4095Всё, теперь точно, своп в системе готов и будет использоваться при необходимости.
Чтобы при перезагрузке сервера своп автоматически подтягивался в систему, нужно прописать его в /etc/fstab:
echo "/swapfile none swap sw 0 0" >> /etc/fstabТеперь система знает, где и как при перезагрузке искать и подключать своп.
Проверить, подключен ли своп в автозагрузке, можно с помощью редактора: nano /etc/fstabВообще, это делается с помощью отключения и включения свопа.
swapoff -a && sleep 3 && swapon -aОднако, я не рекомендую прибегать к этому способу, так как swap просто очищается, а не переносится в ОЗУ, и, в случае наличия данных системных процессов, система может стать недоступна.