Подкачка, она же swap или своп - понятие знакомое каждому, вне зависимости от того с каким семейством ОС приходится работать. Да и представление о процессе вроде бы имеется... Именно, что "вроде бы", если спросить, как работает пространство подкачки, то услышим стандартные фразы про недостаток памяти и сброс второстепенных страниц на диск. А можно и вообще услышать, что памяти сегодня много и подкачка не нужна. Так ли это на самом деле или происходящие процессы гораздо более глубоки? Давайте разбираться.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Начнем с того, что процессор может исполнять код и обрабатывать данные только после их помещения в оперативную память (далее просто память), которая организована в виде набора адресуемых сегментов - страниц. Минимальный размер страницы для 32-битного процессора x86 - 4 КБ, современные системы могут работать со страницами большего размера.
На заре развития вычислительной техники памяти было немного и остро стоял вопрос ее эффективного использования, тогда же возникло предложение использовать для хранения страниц не только оперативную память, но и специально размеченное место на дисковых накопителях. Это позволяло при недостатке памяти вытеснить на диск редко используемые страницы и освободить память для работающих приложений. Данный процесс и получил название подкачки. Общий объем физической памяти и пространств подкачки называется виртуальной памятью.
Собственно, для системы нет никакой разницы, где находится требуемая страница: в памяти - хорошо, в пространстве подкачки - придется предварительно считать ее оттуда в память. Чтение с дисков - операция медленная (по сравнению с доступом к памяти) и поэтому вы можете заметить, что, развернув свернутое приложение приходится некоторое время подождать пока оно начнет нормально работать и при этом идет интенсивный обмен с диском.
Конечно, тормоза многих раздражают, но лучше пусть система время от времени тормозит, нежели глухо виснет только потому, что вы случайно исчерпали всю доступную память. Это самые общие черты, которые знает практически каждый, а вот дальше уже идут тонкости.
Особенности использования памяти в Linux
Управление памятью - сложная тема, поэтому мы будем использовать максимально упрощенную модель, достаточную для понимания происходящих процессов. Начнем с памяти приложений, это просто и понятно - при запуске приложение загружает в память собственный код, код связанных библиотек, обрабатываемые данные. Именно этот объем памяти мы видим, как занятый в простых утилитах, таких как Системный монитор.
Чем больше мы запускаем приложений и чем больше данных они обрабатывают - тем выше будет объем занимаемой ими оперативной памяти, остальную память принято считать свободной, но это не так.
Почему? Обратимся к устройству файловой системы Linux, которая реализована в виде отдельного уровня абстракции - виртуальной файловой системы (VFS), которая позволяет работать с самыми различными носителями и физическими файловыми системами абсолютно прозрачно для ОС и приложений. Когда программа хочет что то прочитать или записать на диск, то ей абсолютно все равно что это такое: быстрый SSD с ext4 или флешка с FAT32, она обращается к VFS, а именно та уже через драйвер файловой системы осуществляет запись или чтение с нее.
Все ресурсы VFS хранятся в оперативной памяти, а так как дисковые операции достаточно дороги, то VFS активно кеширует данные в той же оперативной памяти, это очень важный момент, так как кеш VFS очень серьезно влияет на производительность системы. Вспомните, как долго осуществляется отображение содержимого папки с большим количеством файлов при первом входе в нее и как быстро происходит повторное открытие.
Фактически за использование оперативной памяти в Linux постоянно конкурируют между собой приложения и кеш VFS, при этом однозначно отдать кому-то предпочтения нельзя, любая крайность будет негативно влиять на производительность.
Если мы возьмем более профессиональные инструменты, то сможем увидеть, что значительный объем "свободной" памяти используется под кеш.
А что будет, если оперативной памяти станет не хватать? Самый простой вариант - сбросить кеш, это можно сделать быстро и без особых затрат. Но это не всегда хороший вариант, да и как быть, если памяти не хватает VFS-кешу? Выгрузить какое-то приложение нельзя, для этого потребуется завершить процесс, что делать? И тут на помощь приходят пространства подкачки, зачем закрывать приложение, если можно выгрузить его страницы на диск, особенно если это приложение в данный момент не активно. Таким образом мы можем выделить нужное количество памяти под VFS-кеш без ущерба для производительности.
Именно этим объясняется использование пространств подкачки при наличии "свободной" оперативной памяти, этот момент приводит в недоумение многих начинающих администраторов. Но если же мы заглянем немного глубже, то увидим, что на самом деле "свободная" память далеко не свободна.
Проведем небольшой эксперимент. На его начало у нас было открыто и свернуто несколько приложений, включая браузер и графический редактор GIMP с загруженным в него 4К изображением. Посмотрим расклад по памяти:
Итак: занято 2,36 ГБ, используется кешем 1,3 ГБ и в подкачке 578 МБ. Теперь распакуем какой-нибудь достаточно большой архив, в нашем случае около 1 ГБ включающий около сотни файлов различных типов и размеров. И снова посмотрим на статистику:
А здесь мы увидим достаточно неожиданную картину: объем занимаемой памяти уменьшился, зато объем выделенный под кеш вырос, так же часть страниц была сброшена в своп. Если взять калькулятор и выполнить грубые прикидки, то увидим, что размер кеша вырос примерно на 400 МБ, часть этой памяти была взята из небольшого количества свободной, а другая часть была освобождена путем вытеснения части страниц в подкачку.
Благодаря этому система быстро выполнила требуемую дисковую операцию, но потом мы испытали некоторую задержку разворачивая GIMP. Но это вполне разумная плата за сохранение общей производительности системы.
Здесь стоит обсудить еще один вопрос: реальную и воспринимаемую производительность. Если нам требуется вытащить приложение, на которое мы переключаемся из подкачки, то это займет некоторое время, что ухудшит воспринимаемую производительность, но на реальную никак не повлияет, будучи загружено обратно в память приложение будет работать также быстро.
В настольных системах между реальной и воспринимаемой производительностью нужно найти оптимальный баланс. Мало кому понравится тормозящий интерфейс, но еще меньше понравится реальное замедление работы приложений, хотя они будут очень отзывчивы, из-за того, что ради этого пришлось сбросить VFS-кеш.
Swappiness
Это параметр sysctl, задающийся в файле /etc/sysctl.conf и позволяющий установить приоритеты доступа к оперативной памяти. Он может принимать значения от 0 до 200, значение по умолчанию равно 60. Что это означает? При значении равным 100 считается что стоимость подкачки и стоимость дискового ввода-вывода равны и поэтому подкачка будет использоваться всегда, если кешу VFS требуется место в памяти, но точно также кеш будет сбрасываться, если память понадобилась приложениям.
При значениях менее 100 память приложений имеет приоритет, так при значении в 60 получается, что стоимость подкачки на 40% дороже, чем дисковый ввод-вывод и система будет стараться не свопить до определенного предела. Очень грубо этот параметр в диапазоне от 0 до 100 можно рассматривать как минимальный процент свободной оперативки при котором начнет работать подкачка.
vm.swappiness=60
При значении в 60 система начнет вытеснять страницы приложений в подкачку после того, как останется свободной менее 60% памяти, при 100 - подкачка будет работать всегда. Если выставить значение в ноль, то это не отключит подкачку, но она не будет использоваться до последнего, в критической ситуации система все-таки начнет сбрасывать страницы на диск, чтобы сохранить приемлемый уровень производительности.
Значения свыше 100 куда более интересны, хотя на первый взгляд практического смысла в них нет. Однако это не так, допустим у вас есть система, которая грузится с быстрого NVMe диска, но основная работа происходит с данными на HDD. Скорость современных жестких дисков доходит до 200 МБ/с, а даже самый простой NVMe свободно дает от 1500 МБ/с. Так может лучше скинуть своп на NVMe, чем вытеснять VFS-кеш?
Именно так, поэтому берем в руки калькулятор и считаем. По грубым прикидкам NVME в 8 раз быстрее. Поэтому:
x + 8x = 200
Вычислить x несложно, его значение будет 22,22, теперь можем узнать 8x - это будет 177, именно это значение мы должны задать в опции swappiness если хотим агрессивно сбрасывать страницы приложений в быстрый своп ради сохранения высокой реальной производительности.
Например, вы работаете с виртуальными машинами VirtualBox расположенными на HDD, поэтому вам более интересно вытеснить в пространство подкачки данные приложений, скажем браузера, чем потерять кеш VFS, который вызовет тормоза в виртуальной машине. При этом NVMe обеспечит быструю скорость извлечения данных, и вы не почувствуете дискомфорта переключившись на браузер.
VFS cache pressure
Это еще одно значение sysctl, оно означает приоритет кеша VFS перед страницами приложений. Значение в 100% обозначает паритет, дисковый кеш и приложения имеют равный вес и вытесняются в зависимости от иных настроек.
Но если мы хотим это изменить, то нужно в /etc/sysctl.conf задать опцию
vm.vfs_cache_pressure=100
При увеличении этого числа мы получим более агрессивную политику ядра по отношению освобождения памяти занятой под дисковый кеш. Если мы хотим в 10 раз активнее освобождать кеш VFS, то следует задать значение опции равным 1000, в 100 раз - 10 000. При уменьшении значения ядро, наоборот будет избегать освобождения памяти занятой под кеш. И если установить данную опцию в ноль, то кеш VFS никогда не будет освобождаться, что может спровоцировать опасную ситуацию, когда память в системе действительно закончится.
Мы не рекомендуем изменять данный параметр без четкого понимания что именно вы делаете и зачем.
Создание и использование пространств подкачки
Классическим для Linux является использование раздела подкачки, который выделяется, обычно, в конце диска и особым образом размечается. Для этого используется особый тип файловой системы 82 (область подкачки Linux). Если вы создали раздел подкачки при установке системы, то больше ничего делать не нужно. Если же вы хотите добавить в подкачку еще один раздел, скажем sde5, то выполните одну простую команду:
mkswap /dev/sde5
Затем включите подкачку на этом разделе, перезагрузка системы не потребуется:
swapon /dev/sde5
Чтобы автоматически подключать раздел подкачки при монтировании добавьте в /etc/fstab строку:
/dev/sde5 swap swap defaults 0 0
Однако современные системы не приветствуют монтирование устройств по их наименованию, потому что в случае изменения конфигурации наименования дисков и разделов на них могут измениться, поэтому более правильным будет использовать для монтирования UUID, прежде всего узнаем его:
lsblk -no UUID /dev/sde5
Затем изменим запись монтирования в fstab следующим образом:
UUID=<UUID> swap swap defaults 0 0
Где вместо <UUID> подставьте полученный на предыдущем шаге идентификатор.
Современные системы все чаще отказываются от отдельного раздела подкачки отдавая предпочтению файлу. Это имеет ряд преимуществ в простоте и гибкости использования - изменить размер файла гораздо легче чем раздела. В остальном никакой разницы между ними нет, файл и раздел подкачки работают одинаково.
Для создания файла можно воспользоваться командой:
fallocate -l 4G /swapfile
Или старым добрым dd:
dd if=/dev/zero of=/swapfile bs=1M count=4096
В обоих случаях мы создадим файл размером 4 ГБ, сразу ограничим права на него:
chmod 600 /swapfile
А дальше точно также:
mkswap /swapfile
swapon /swapfile
Для его постоянного монтирования добавьте в /etc/fstab запись:
/swapfile swap swap defaults 0 0
Кстати, при помощи файла можно временно увеличить пространство подкачки, например, для выполнения какой-то ресурсоемкой разовой работы. Просто создайте и подключите еще один файл, а закончив - отключите его:
swapoff /swapfile
Если в системе создано несколько пространств подкачки, вне зависимости от того разделы это или файлы, то обращение к ним происходит по принципу чередования, что позволяет увеличить общую производительность подкачки, но бывают случаи, когда использование пространств нужно указать явно. Допустим у нас есть раздел подкачки на старом HDD и файл на новом быстром NVMe, нам, конечно же, хотелось бы сначала использовать своп на быстром диске, а только по его заполнению переходит на медленный жесткий.
Для этого добавим в опции монтирования еще один параметр - приоритет: минимальный приоритет 0, максимальный 32767. Чем выше приоритет, тем предпочтительнее использование данного пространства, для нескольких пространств с одинаковым приоритетом будет использоваться чередование.
UUID=<UUID> swap swap defaults,pri=0 0 0
/swapfile swap swap defaults,pri=10 0 0
Таким образом вы можете создать пространство подкачки из множества частей и достаточно тонко настроить их использование. Скажем, небольшой файл на NVMе с максимальным приоритетом, файл побольше на обычном SSD и большой файл на HDD, приоритет которого установлен на минимум.
Пространства подкачки и SSD
В настоящий момент SSD не роскошь, а основной тип накопителя для ПК, рабочих станций и серверов и поэтому нужно использовать их возможности на полную. Советы убирать с SSD подкачку, временные файлы и т.д. и т.п. кроме как вредными назвать нельзя. Поэтому размещать подкачку на SSD не только можно, но и нужно. Единственный момент, для разделов подкачки следует включить использование TRIM, для этого в опции монтирования добавьте discard:
UUID=<UUID> swap swap defaults,discard,pri=0 0 0
Обратите внимание, что данная опция нужна только для разделов подкачки, для файлов она не имеет никакого смысла.
Спящий режим и пространства подкачки
Спящий режим (гибернация) - особый режим завершения работы системы, когда все содержимое оперативной памяти сохраняется на жесткий диск и может быть восстановлено при включении компьютера. В Linux для этих целей используются пространства подкачки, в них вытесняются занятые страницы памяти, сохраняются настройки устройств и только после этого компьютер выключается.
При включении, если система обнаруживает в подкачке сохраненный образ памяти, то вместо нормальной загрузки начинается его восстановление. Таким образом вы получите полностью рабочее состояние компьютера со всеми открытыми программами и документами.
Использование спящего режима предъявляет особые требования к размеру пространств подкачки, они должны быть способны вместить полный объем оперативной памяти, настройки устройств и собственное содержимое подкачки, если оно используется системой (а как мы видели - оно используется).
Кроме того, при большом объеме оперативной памяти сброс ее на диск при выключении и восстановление при включении может занимать продолжительное время и может оказаться, что быстрее закрыть приложения и нормально выключить компьютер, а по включении просто заново все открыть.
Какой размер файла подкачки выбрать?
Единого мнения на этот счет не существует, но есть определенные наработанные практики, которые позволяют дать рекомендации. Наиболее подробно они приведены в документации Fedora и мы приведем именно их:
Объем ОЗУ в системе | Рекомендуемый размер подкачки | При использовании спящего режима |
---|---|---|
Менее 2 ГБ | 2 х ОЗУ | 3 х ОЗУ |
2 ГБ - 8 ГБ | ОЗУ | 2 х ОЗУ |
8 ГБ - 64 ГБ | 0,5 х ОЗУ | 1,5 х ОЗУ |
Более 64 ГБ | зависит от нагрузки | спящий режим не рекомендуется |
Но приведенные значения не догма и могут быть пересмотрены исходя из реальных нагрузок. Так если использовать 4 ГБ подкачки для системы с объемом ОЗУ 2 ГБ выглядит нормально, то выделять 32 ГБ для системы с 64 ГБ ОЗУ выглядит излишеством, поэтому изучите реальный режим работы системы и скорректируйте размер пространства подкачки исходя из реальных запросов. Именно в этой ситуации и становятся удобны файлы подкачки - их размер очень легко менять.
Заключение
Конечно же это не все возможности, которые предоставляют пространства подкачки в Linux, многое оставлено за кадром просто потому, что объем статьи не позволяет все это вместить. Но приведенные данные являются необходимым минимумом для каждого системного администратора, который выбрал Linux как одну из используемых операционных систем.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Последние комментарии