вторник, 3 февраля 2009 г.

Все о Linux swap space

1. Если ваш компьютер пытается запустить программу, которая требует больше оперативной памяти, чем доступно, большинство современных операционных систем, для решения этой задачи, используют технологию swapping (”подкачка”).
Суть этой технологии заключается в том, что некоторый объем данных (который не “помещается” в оперативную память) временно хранится на жестком диске, в то время как другая часть данных обрабатывается.

В этой статье мы рассмотрим несколько вариантов управления своп-разделами в Linux для повышения производительности вашей системы.

В ОС Linux оперативная память (ОЗУ, RAM, random access memory) делится на разделы, называемые страницами (pages). Swapping (”подкачка”, своппинг) - это процесс во время которого страницы памяти копируются на специально сконфигурированный для этого раздел диска, называемый swap space (раздел подкачки, может быть как и файлом, так и разделом жесткого диска), для освобождения ОЗУ. Совокупные размеры физической памяти и раздела подкачки - это объем имеющийся виртуальной памяти.

Своппинг необходим по следующим причинам. Во-первых, когда системе необходимо больше памяти (т.е. приложение или процесс запрашивает у системы больше памяти) чем сейчас свободно в ОЗУ, ядро разгружает (”откачивает”) наименее используемые страницы и освобожденную память выделяет текущему приложению или процессу. А во-вторых, значительное количество страниц используемых программами на стадии запуска, используются только при инициализации и никогда более. Соответственно система может засвапить эти страницы, тем самым освобождая (разгружая) ОЗУ.

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

В Linux есть две формы своппа: раздел подкачки и файл подкачки. Раздел подкачки - это отдельный раздел на жестком диске, используемый только для своппинга, никакие другие файлы не могут там располагаться. Файл подкачки - это специальный файл в файловой системе.

(Кстати в Windows тоже есть файл подкачки, его даже иногда есть смысл переносить на отдельный диск, т.к. тогда он не будет фрагментироваться. Но это не будет тем же самым, как Linux своп раздел, т.к. в Linux работа с этим разделом происходит на низком уровне.)

2. Swap partition, своп-раздел

Для того что бы в Linux посмотреть какие своп пространства у вас имеются, используйте команду swapon -s.

Filename Type Size Used Priority
/dev/sda5 partition 859436 0 -1


Каждая строчка в этом списке описывает имеющиеся у вас своп пространства. В поле “Type” указывается тип пространства: partition (раздел) или file (файл). Поле “Filename” показывает местоположение свопа. Далее идет общий размер свопа и сколько сейчас используется. В последнем поле указан приоритет, т.е. какие пространства системе использовать вначале. Стоит отметить, что если примонтировать несколько своп-простанств расположенных на разных жестких дисках, и выставить им одинаковый приоритет, то Linux будет равномерно распределять страницы памяти по ним, что приведет к существенному увеличению производительности системы.

Перед тем как добавить новый своп-раздел, необходимо приготовить для него место. Для начала убедитесь в том, что раздел помечен как swap.
Для этого используйте следующую команду:

fdisk -l /dev/hdb


Замените /dev/hdb на на путь к устройству где будет расположен своп. Результат должен выглядеть примерно так:

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


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

Как только раздел помечен как своп, необходимо подготовить, для этого используется следующая команда:

mkswap /dev/hdb1


Если никаких ошибок нет, то можно подключать своп-раздел:

swapon /dev/hdb1


Проверить результат можно вышеупомянутойкомандой - swapon -s.

Для того что бы новый своп автоматически монтировался при старте системы, необходимо внести некоторые изменения в файл /etc/fstab, в котором содержатся все файловые системы и свопы, монтирующиеся при старте. Формат файла следующий:



Таким образом, swap-space - это специальный тип файловой системы. Для добавления нового свопа добавьте следующую строку:

/dev/hdb1 none swap sw 0 0


Для того что бы проверить примонтируется ли новый своп-раздел при старте, отключите все свопы командой swapoff -a.
Затем командой swapon -a, включите свопы, загрузятся те, которые перечислены в файле /etc/fstab.
Ну и наконец командой swapon -s проверьте, какие сповы примонтировались.

3. Swap file, своп-файл

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

Для начала создайте файл, например размером один гигабайт:

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


Затем подготавливаем своп:

mkswap /swapfile

Т.е. все аналогично:

swapon /swapfile


Осталось только добавить строку в файл /etc/fstab:

/swapfile none swap sw 0 0


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

Вообще своп не необходим, если у вас много ОЗУ и все работает хорошо, но как только система запросит больше памяти, то вероятней всего она рухнет. Так что лучше всего иметь своп, тем более, что диски сейчас не такие уж и дорогие.

Ключевым остается вопрос “Сколько?”.
Старые версииUNIX-подобных операционных систем (Sun OS, Ultrix) официально требовали своп в два или три раза больше чем ОЗУ.
Современные системы, например Linux, уже не требуют такого объема, но вы всегда можете сконфигурировать и больше.

Со временем выработались некоторые негласные правила:

1. для настольных ПК: swap = 2 * ОЗУ
2. для сервера: swap = 1/2 * ОЗУ
3. для старых машин с малым объемом ОЗУ: можно сделать гигабайт и больше

В ядре Linux версии 2.6 добавился новый параметр свопа - swappiness. Он принимает значения от 0 до 100. Т.е. грубо говоря - это эффективность своппинга, чем выше значение, тем больше страниц приложения стараются выгрузить в своп. Один из главных майнтенеров ядра Andrew Morton сказал, что он на своем домашнем ПК использует swappiness=100. Он считает, что это не правильно, уменьшать возможности ядра к своппингу.

Но как было сказано в начале, если время между выгрузкой и загрузкой страниц больше, чем время которое нужно программе, то это лишнии потери времени. По умолчанию swappiness равен 60.
Вы можете временно (до следующей перезагрузки системы) изменить это следующей командой:

echo 50 > /proc/sys/vm/swappiness


Для того что бы изменить значение по умолчанию необходимо изменить параметр vm.swappiness в файле:

/etc/sysctl.conf


5. Вывод

Изменение параметров своппинга - это привелегия системного администратора (стоит заметить, что операции по управлению свопами может делать только root).
При хорошем планировании можно добиться существенного прироста производительности системы.

Комментариев нет:

Отправить комментарий