Памяти впритык, а сборка падает с Killed. Показываем, как добавить swap-файл, как включить его насовсем и когда он не спасёт.
Сервер работает, но при установке пакетов или сборке проекта процесс вдруг умирает с коротким словом Killed. Чаще всего это значит, что закончилась память, а подушки в виде файла подкачки (swap) нет. Показываем, как добавить его за несколько команд, как сделать так, чтобы он пережил перезагрузку, и в каких случаях он не поможет.
Коротко. Создаём файл (
fallocate -l 512M /swapdemo), закрываем права (chmod 600), размечаем (mkswap) и включаем (swapon). Чтобы файл включался после перезагрузки, добавляем строку в/etc/fstab. Проверка:swapon --showиfree -h. Swap - подушка на случай пика, а не замена памяти: если памяти не хватает постоянно, нужен тариф побольше.
Сначала посмотрим на память. Команда free -h показывает размеры понятными единицами, а строка Swap - подкачку. На нашем сервере её не было:
Нули в строке Swap значат, что подкачки нет. Подтверждает это команда swapon --show: когда swap отсутствует, она ничего не выводит. Обратите внимание на available: чуть больше 1 ГБ из 3,8 ГБ, то есть запас небольшой, и при пике нагрузки процессы начнут падать.
Для примера возьмём 512 МБ. Команда fallocate мгновенно резервирует место на диске под файл нужного размера. Название файла любое, мы назвали его swapdemo, в обычной жизни привычно /swapfile:
sudo fallocate -l 512M /swapdemoФайл подкачки содержит куски памяти, в том числе пароли и ключи, поэтому читать его должен только root. Закрываем права:
sudo chmod 600 /swapdemoПрава -rw------- значат: читать и писать может только владелец. Теперь размечаем файл как область подкачки:
Размер и идентификатор команда выводит сама, ошибок быть не должно. Если вместо fallocate файл создаётся на файловой системе без его поддержки, воспользуйтесь командой dd: sudo dd if=/dev/zero of=/swapdemo bs=1M count=512.
sudo swapon /swapdemoКоманда ничего не печатает, если всё получилось. Проверим:
В строке Swap появились 511 МБ, занято пока ноль: файл подключён, но ядро им не пользуется, пока хватает памяти. Это нормальное состояние подушки.
После перезагрузки файл сам не включится. Чтобы система подключала его на старте, добавьте в файл /etc/fstab такую строку:
/swapdemo none swap sw 0 0В нашем примере мы строку не добавляли и файл после показа убрали, поэтому подставьте настоящее имя своего файла. После правки fstab проверьте командой sudo swapon --show и перезагрузкой в удобное время.
Для небольшого VPS обычно хватает 1-2 ГБ, а больше размера оперативной памяти брать смысла нет. Своп лежит на диске, поэтому работает медленнее памяти: он спасает от падения, но не ускоряет сервер. Параметр vm.swappiness задаёт, насколько охотно ядро использует подкачку. По умолчанию он равен 60, это видно командой sysctl vm.swappiness. Чтобы ядро реже трогало своп, можно временно поставить sudo sysctl vm.swappiness=10, а для постоянного значения добавить строку в файл в каталоге /etc/sysctl.d/.
Два типичных случая. Если swapon пишет про небезопасные права на файл, вы пропустили chmod 600: выполните его и повторите команду. Если появляется ошибка вроде «read swap header failed», файл не размечен: запустите mkswap и включайте снова. Перед правками сверяйтесь с реальным текстом сообщения: он может немного отличаться в разных версиях системы.
Пока серверу хватает памяти, занятое место свопа остаётся близким к нулю. Если оно растёт, посмотрите статистику: vmstat 1 3 печатает её три раза с интервалом в секунду. Столбцы si и so показывают, как много данных ушло в подкачку и вернулось из неё. Единичные ненулевые значения не страшны, а постоянные - сигнал, что памяти мало и пора выбирать больший тариф.
Если сервер использует подкачку постоянно, а процессор простаивает в ожидании диска, сервер «буксует»: страницы гоняются между памятью и диском. Это решается не файлом побольше, а тарифом с большей памятью или оптимизацией приложения. Причины падений процессов подробнее разобраны в статье про OOM killer и load average, а общий порядок поиска узкого места - в разборе медленного сервера.
Сначала отключаем, потом удаляем. Одной командой это делается так:
sudo swapoff /swapdemo && sudo rm /swapdemoПосле этого swapon --show снова ничего не выведет, а строку из /etc/fstab нужно удалить, если вы её добавляли.
Создайте файл через fallocate, закройте права chmod 600, разметьте mkswap и включите swapon. Для автозапуска добавьте строку в /etc/fstab.
Обычно 1-2 ГБ для маленького сервера, не больше объёма оперативной памяти. Больше не имеет смысла: своп медленнее памяти.
Можно, если памяти с запасом. Но при пиках процессы будут падать с Killed, а небольшая подушка часто избавляет от этого.
Командой swapon --show или по строке Swap в выводе free -h.
Swap в free -h и пустой swapon --show - подкачки нет.fallocate, chmod 600, mkswap, swapon./etc/fstab.