О своппинге в Linux






Linux, работая с оперативной памятью, разбивает её на отдельные кусочки, называемые страницами. Своппинг (swapping) — это процесс, посредством которого страницы оперативной памяти копируются в специально предназначенное место на диске, называемое свопом (swap), для того, чтобы освободить часть оперативной памяти. Суммарный объём оперативной памяти и свопа составляют общее количество доступной виртуальной памяти.


Необходимость в своппинге возникает по двум причинам. Во-первых, когда системе нужно больше оперативной памяти, чем есть в данный момент в распоряжении, ядро сбрасывает часть редко-используемые страниц в своп, освобождая затребовавшему процессу нужное количество физической памяти. Во-вторых, существенное количество страниц используется приложениями лишь в фазе инициализации, и в дальнейшем эта занятая память может вообще не понадобиться. Такие страницы ядро сбрасывает в своп, освобождая физическую память  для остальных приложений или дискового кэша.

Однако, своппинг имеет и обратную сторону. По сравнению с оперативной памятью диски — очень медленные устройства. Скорость работы памяти измеряется наносекундами, в то время как скорость работы дисков — миллисекундами, так что доступ к диску выполняется в десятки тысяч раз медленнее, чем доступ к оперативной памяти. Таким образом, чем больше система работает со свопом, тем она будет медленнее работать. Иногда процесс своппинга становится очень интенсивным, когда какие-то страницы помещаются в своп, но тут же возвращаются обратно в память, затем опять в своп, и так далее. Такие ситуации возникают из-за попытки системы предоставить требуемую память всем запущенным приложениям и избавиться от этого неприятного явления можно лишь за счёт увеличения количества оперативной памяти.

В Linux бывает два вида свопа: своп-раздел и своп-файл. Своп-раздел — это специально выделенная область на диске, которая не может содержать файлов и предназначена исключительно для хранения страниц памяти. Своп-файл — это отдельный файл, расположенный среди остальных файлов системы.

При помощи команды swapon -s вы можете увидеть информацию свопе в вашей системе:

Filename     Type            Size    Used    Priority
/dev/sda1    partition       1951856 11588   -1

Каждая строка отображает информацию подключённом в системе своп-хранилище. В столбце Type содержится информация о типе свопа: файл или дисковый раздел, а из столбца Filename мы можем увидеть место физического размещения своп-пространства (в моём примере — это диск /dev/sda1). Содержимое столбца Size отражает размер доступного свопа в килобайтах, а Used — количество задействованного. Значение в столбце Proirity сообщает Linux о том, какое своп-хранилище использовать первым, вторым и т. д. Одним из замечательных свойств работы Linux со своп-пространством является следующее. Если вы подключите в систему два или более своп-хранилища (желательно, хранящихся на разных дисках), назначив им одинаковый приоритет, то Linux будет равномерно распределять нагрузку между ними, что весьма увеличит производительность.

Swap-раздел

Прежде, чем добавить в Linux дополнительный своп-раздел, его нужно специальным образом подготовить. Для начала нужно убедиться, что добавляемый раздел помечен как своп, а затем создать в нём  файловую систему своп. Чтобы убедиться в том, что нужный раздел помечен как своп, от имени пользователя root запустите:

fdisk -l /dev/hdb

заменив /dev/hdb на путь к вашему диску, на котором планируете размещать своп-раздел. После ввода команды вы увидите примерно следующее:

Device      Boot    Start  End     Blocks  Id      System
/dev/hdb1           2328   2434    859446  82      Linux swap / Solaris

Если раздел не помечен как swap, вам нужно будет отметить его таковым при помощи команды «t» меню fdisk. Будьте осторожны при работе с разделами, поскольку вы можете по ошибке удалить раздел с важными данными или изменить идентификатор раздела, на котором установлена ваша система. Все данные на swap-разделе будут уничтожены, так что лишний раз убедитесь в правильности того, что собираетесь сделать. Также имейте ввиду, что разделы Solaris имеют такой же ID, как и swap-разделы  в Linux, так что вы можете по ошибке удалить раздел с Solaris!

После того, как пометили swap-раздел, вам нужно подготовить его при помощи программы mkswap, запущенной от имени root:

mkswap /dev/hdb1

И, если всё прошло без ошибок, ваш swap-раздел готов к использованию. Теперь вы можете подключить его к системе:

swapon /dev/hdb1

Проверить, используется ли подключённый раздел, можно при помощи команды swapon -s. Для того, чтобы swap-пространство автоматически монтировалось при загрузке системы, добавьте строку в ваш /etc/fstab:

/dev/hdb1  none   swap    sw    0    0

Первый параметр указывает имя устройства — /dev/hdb1. Своп-разделы не могут иметь точки монтирования в файловой системе, поэтому второй параметр равен none. Тип файловой системы, третий параметр — swap. Четвёртый параметр,опции файловой системы — sw. И последние два параметра установлены равными нулю, поскольку они не используются в контексте swap-раздела.

Если необходимо проверить корректность внесённым вами изменений в /etc/fstab, вы можете целиком отключить использование swap при помощи команды swapoff -a, а затем включить командой swapon -a, которая подключит все swap-разделы, описанные в /etc/fstab. Проверить, всё ли подключилось как надо, можно, как обычно, командой swapon -s.

Swap-файл

Своп-файлы в Linux подготавливаются и подключаются примерно так же, как и своп-разделы. Своп-файлы удобно использовать в случаях, когда вы не хотите или не можете выделять свободный раздел под swap.

Чтобы создать своп-файл, воспользуйтесь командой dd для создания пустого файла. Например, эта команда создаст файл размеров 1 Гб:

dd if=/dev/zero of=/swapfile bs=1024 count=1048576

/swapfile — это имя файла в файловой системе, 1048576 — размер файла в килобайтах, т. е. 1 гигабайт.

Подготовка swap-файла к использованию выполняется так же, как и swap-раздела, только вместо имени устройства укажите путь к файлу:

mkswap /swapfile

Монтируется своп-файл всё той же утилитой swapon:

swapon /swapfile

И строчка /etc/fstab будет выглядеть примерно так:

/swapfile  none  swap   sw   0   0

Какого размера должен быть своп?

Конечно, возможно запустить Linux без swap вообще, и система будет прекрасно работать, если у вас достаточно физической памяти. Однако, как только приложениям понадобится больше памяти, чем имеется фактически, система перестанет корректно работать. Так что, желательно иметь место для своппинга, особенно если учесть, что стоимость дискового пространства на сегодня относительно небольшая.

Основной вопрос состоит в том, сколько? Ранние версии UNIX-систем, таких как SunOS и Ultrix требовали, чтобы размер своп-пространства был равен дву- трёхкратному объёму физической памяти. Современные реализации UNIX, такие как Linux, не предъявляют таких требований и буду использовать то, что вы им предоставите. «Правило большого пальца» гласит:

  1. для настольных систем выбирайте размер своп-хранилища равным объёму физической памяти, помноженному на два. Это позволит вам запускать одновременно большое количество программ (большая часть которых обычно простаивает и память, занимаемая ими, может быть легко сброшена в своп), освобождая физическую память для работающих приложений;
  2. для серверных систем делайте своп меньшего, чем объём физической памяти, размера (примерно наполовину). Этим вы будете иметь в запасе некоторое количество swap-пространства на случай необходимости. Но при этом наблюдайте за загруженностью свопа, чтобы добавить физической памяти в случае его предельной загрузки;
  3. на старых компьютерах, где физической памяти совсем мало, выделяйте под своп столько места, насколько это возможно

Ядро Linux, начиная с версии 2.6, имеет параметр swappiness, призванный помочь администраторам регулировать процесс своппинга. Значением этого параметра должно быть целое число в диапазоне от 0 до 100. Чем больше значение этого параметра, тем более активно ядро будет своппиться, а чем меньше — тем меньше страниц памяти будет выгружаться в своп, вплоть до того, что данные неактивных приложений буду всё равно храниться в физической памяти. Разработчик ядра Andrew Morton говорит, что его настольные компьютеры работают со значением swappiness равным 100. «Я считаю неправильным заставлять ядро держать в памяти всё. Не стоит отдавать сотни мегабайт памяти жирным приложениям. отправьте их на диск и используйте память для чего-то полезного.».

Отрицательным моментом в идее Мортона является тот факт, что слишком быстрое перемещение данных приложения в своп отражается на времени отклика приложения. Если вы переключились на окно неактивного ранее приложения, то система должна сперва загрузить его из свопа, и лишь после этого оно заработает.

По-умолчанию значение swappiness равно 60, и вы можете временно (до следующей перезагрузки) изменить его при помощи команды от имени root:

echo 50 > /proc/sys/vm/swappiness

А если вы хотите использовать нужное значение постоянно, то исправьте значение параметра vm.swappiness в файле /etc/sysctl.conf.

Заключение

Настройка своппинга — важный аспект системного администрирования. Хорошее планирование и правильное использование своппинга может существенно вам помочь в некоторых ситуациях. Не бойтесь экспериментировать и всегда следите за тем, получаете ли вы нужные результаты!

По мотивам Linux.Com




О своппинге в Linux: 6 комментариев

  1. «Конечно, возможно запустить Linux без swap вообще, и система будет прекрасно работать, если у вас достаточно физической памяти. Однако, как только приложениям понадобится больше памяти, чем имеется фактически, система перестанет корректно работать.»

    Исходя из вышенаписанного, следует, что даже если добавить раздел подкачки, и настанет случай, когда приложениям понадобится больше памяти, то система всё равно перестанет корректно работать.

    Т.е. система в любом случае перестанет корректно работать. Зачем нужна такая система?

  2. >>Т. е. система в любом случае перестанет корректно работать. Зачем нужна такая система?

    Тоже самое случится с любой другой системой.

  3. Лучше ограничить своппинг до 10 процентов,так как эта убережёт систему от плохих вещей в случае сбоя или нехватки памяти. Я бы не отключал его совсем

  4. > Т.е. система в любом случае перестанет корректно работать. Зачем нужна такая система?

    Владимир, а что же вы предлагаете делать системе, у которой недостаточно памяти для работы? Куда ей девать данные? Насколько мне известно, все компьютеры на сегодняшний день данные хранят в памяти и ёмкость этой памяти всегда ограничена. Или уже что-то новое придумали?

  5. Фания, абсолютно с вами согласен. Дисковое пространство не такое уж и дорогое на сегодня, чтобы пожалеть пару гигабайт на всякий случай. А что касается ОЗУ — так его никогда много не бывает, вроде :)

  6. К сожалению, и Linux может сбоить, если памяти не хватает. Ещё не придумали хорошего решения на этот случай. Но всё ж на жёстком диске, наверно, можно выделить в разы больше, чем всего физической памяти. А swap-раздел устроен так, что позволяет перекачке страниц памяти работать относительно быстро.

Комментарии запрещены.