Содержание:
Объём оперативной памяти в компьютере ограничен. Чаще всего из финансовых соображений, хотя и чисто технически в конкретную материнскую плату не установишь ОП больше, чем предусмотрено её спецификациями. А раз так, то ситуации, когда возникает нехватка памяти, нередки, особенно для многозадачных операционных систем. В их число входит и Linux, и хотя она считается менее требовательной к ресурсам ПК, идеальной её назвать тоже нельзя. Дефицит ОЗУ решается разными способами. Одним из самых оптимальных из них считается использование файла или раздела на диске, где временно хранятся данные, которые извлекаются в физическую память по мере необходимости.
В линуксоподобных ОС под свопом понимают механизм организации виртуальной памяти, при которой часть хранимых в ОЗУ данных (как правило, редко используемых), перемещается на временное хранение в специальный раздел или файл на жёстком или твердотельном диске.
Весь объём физической памяти в Linux разбивается на страницы. По мере необходимости содержимое отдельных страниц перемещается на выделенный раздел диска, именуемый swap space или на отдельный файл (аналог файла подкачки в Windows). Сама процедура освобождения ОП называется свопингом, а общий размер физической и swap-памяти – объёмом доступной виртуальной памяти.
Многозадачность не означает одновременное открытие многих программ. Даже если мы запустим браузер, он сам по себе использует множество библиотек, каждая из которых использует свою область памяти. Каждая новая вкладка, каждый открытый документ – это всё новые и новые страницы памяти, которых в определённый момент времени может и не хватить.
И если для новой вкладки свободных страниц уже нет, операционная система вынуждена заняться освобождением памяти. А что освобождать, если все страницы заняты нужными данными или кэшем? Что используется реже. Но рано или поздно выгруженный кусочек кода понадобится, а его в памяти уже не окажется. Такая ситуация называется page fault, и ОС придётся её обрабатывать по новой. Если недостающие данные на диске не обнаружатся, процесс завершится аварийно. Если он есть, система загрузит код с диска, но для этого потребуется освободить энное количество других страниц памяти. В результате начинается процесс, называемый трэшингом, когда ОС только тем и занимается, что освобождает новые страницы, удаляя их содержимое и загружая в них недостающие данные.
Наличие swap-файла как раз и решает эту дилемму. Вместо того, чтобы просто очищать страницы памяти, система сбрасывает их содержимое на диск, который как бы расширяет объём физического ОЗУ. При этом трэшинг заменяется на однократную процедуру чтения/записи.
Разумеется, мы описали процесс достаточно схематично, на самом деле он имеет множество нюансов и достаточно сложный алгоритм реализации. В любом случае картина получается следующая: если сделать swap-файл достаточно большим, редко используемые и неизменённые данные при возникновении дефицита из ОЗУ «уезжают» на диск, откуда могут по необходимости извлекаться столько раз, сколько нужно.
Если файл/раздел подкачки маленький, пользы от него будет немного, поскольку рано или поздно свободное место исчерпается и на нём, и тогда снова начнутся «пляски» с постоянными операциями записи-чтения в файл подкачки, из-за чего система будет сильно тормозить.
Отвечая на вопрос о необходимости swap в Linux, можно утверждать следующее:
Но не всё так просто. Swap тоже не лишён недостатков, главным из которых является скорость операций записи/чтения с диска. Достаточно сказать, что при операциях с физической памятью эта скорость измеряется в наносекундах (просто посмотрите характеристики чипов ОЗУ), а для жёсткого диска это миллисекунды, то есть на несколько порядков больше. У SSD-дисков скорости обмена данными намного больше, но из-за медленного интерфейса всё равно несравнимы с показателями ОЗУ. Вот и получается, что при частых сбросах страниц памяти в swap система тоже может работать медленнее.
Особенно часто такое случается, если компьютер используется в качестве сервера, а с Linux это большинство ПК. При нехватке памяти обычно в число первых пострадавших попадают базы данных, и если это MySQL, то его падение грозит недоступность сайта или его страниц, поэтому для серверов так важно иметь swap-раздел большого объёма – пускай лучше сайт будет работать медленнее, чем будет недоступен совсем.
Процедура создания файла подкачки достаточно сложная, требующая наличия определённых навыков работы с командной строкой.
И первый этап – нам нужно выяснить, имеется ли в системе раздел или файл, выделенный под swap.
Используем команду:
swapon -s
или
free –m
Если swap отсутствует, в первом случае вы получите пустую результирующую строку, во втором – таблицу использования виртуальной памяти, в которой строка Swap будет содержать нули.
Если файла подкачки нет, нужно определиться, имеется ли возможность его создать.
Выполняем команду
df -h
Отобразится таблица примерно такого содержания:
На диске порядка 23 ГБ свободного пространства, этого более чем достаточно для создания swap-файла.
Размер файла подкачки зависит от множества факторов:
Разумеется, главным аспектом является объём физической памяти. Если её меньше 2 ГБ, sawp-файл нужнее размером в 1,5-2 раза больше, то есть до 4 ГБ.
Если у вас 3-4 ГБ ОЗУ, то определитесь сначала, будете ли вы использовать режим сна. Если да, объём файла подкачки желательно выбирать из расчёта 110-115% от объёма оперативной памяти, если нет – идеальным вариантом будет swap-файл такого же объёма.
Если у вас мощный компьютер и объём ОП превышает 6 ГБ, размер swap-файла в Linux выбирайте из расчёта половины объёма оперативной памяти. Если планируется использование режима гибернации, может потребоваться эксперимент для выяснения, сколько ОЗУ используется для режима сна и выбирать значение, исходя из полученных результатов. Благо сформировать файл подкачки можно в любой момент времени, не обязательно на этапе установки Linux.
Процедура создания файла подкачки в Linux имеет несколько вариантов, один из которых считается традиционным, а другой – ускоренным.
Для начала ознакомимся с быстрым способом, который заключается в использовании одной команды:
fallocate -l 2G /swapfile
Здесь второй параметр указывает на размер создаваемого файла, выраженный в ГБ (если букву не указывать, система будет интерпретировать параметр в КБ, это нужно обязательно учитывать).
При этом файл будет создан и доступен сразу после выполнения команды, так что желательно использовать именно этот способ.
Второй вариант, традиционный:
dd if=/dev/zero of=/swapfile bs=1М count=2096
Здесь параметр bs указывает, в каких единицах мы задаём размер одного блока для swap-файла. В данном случае – 1 мегабайт. Параметр count указывает на количество таких блоков, выделяемых под файл подкачки, и в сумме получаются те же 2 ГБ, как в первом варианте.
Сама команда dd в Linux обозначает побайтовое копирование, параметр if указывает, откуда копировать, в нашем случае это /dev/zero – специальный файл с нулевыми байтами. Параметр of указывает, что записывать эти нулевые байты мы будем в файл /swapfile.
Отметим, что при использовании этой команды ошибки недопустимы. Если вы неправильно укажете параметр of, то имеется вероятность повреждения важных данных.
Если вы указали недостаточный размер файла подкачки (это может выясниться много позже), увеличить или просто изменить размер swap Ubuntu можно отключив текущий (как это сделать, мы расскажем позже) и создав его заново по приведённому здесь алгоритму с указанием правильного размера.
Файл подкачки является важным с точки зрения операционной системы, и его редактирование может привести к её краху. Поэтому важно ограничить доступ к swap следующей командой:
chmod 600 /swapfile
В результате право чтения и записи в него будет иметь только пользователь root (аналог admin в Windows).
Дальнейшая настройка swap-файла заключается в преобразовании /swapfile в файл подкачки с помощью команды
mkswap /swapfile
И заключительная команда, действие которой заключается в подключении swap к системе (его включению):
swapon /swapfile
Теперь он полностью готов к работе.
Чтобы после каждой перезагрузки не выполнять подключение файла подкачки к системе последней командой предыдущего раздела, вписываем в файл /etc/fstab с помощью любого текстового редактора строку, которая будет использоваться при каждой загрузке Linux:
/swapfile none swap defaults 0 0
После перезагрузки компьютера можно проверить правильность срабатывания командой free –m.
Иногда может потребоваться временно освободить место на диске, и зачастую именно файл подкачки – единственный реальный кандидат для этих целей.
Очистка swap (вернее, отключение) осуществляется командой
swapoff –a
Включение производится командой
swapon -a
Если вы решили и вовсе отказаться от использования файла подкачки, удалить swap можно следующим образом:
cat /proc/swaps (определяем местоположение swap-файла)
swapoff /dir/swapXXXXX (отключаем файл подкачки, здесь dir – это результат выполнения предыдущей команды, то есть директория с файлом, а swapXXXXX – имя самого файла подкачки)
rm /dir/swapXXXXX (удаляем файл с диска)
Если вы добавляли swap в автозагрузку, его нужно оттуда убрать, удалив соответствующую строчку в файле /etc/fstab (например, редактором gedit).
Но напомним, что без наличия swap-файла система может работать нестабильно, особенно при малом объёме оперативной памяти, поэтому удаление файла подкачки без создания нового настоятельно не рекомендуется.
Спасибо за столь содержательную статью. У меня вопрос к экспертам: я добавил в сервер оперативки, и теперь хочу соответствующим образом увеличить размер свопа. Как это лучше сделать, добавив еще один файл подкачки, или удалив старый и создав новый большего размера?