Север
2008-04-02
В ОС Linux оперативная память (ОЗУ, RAM, random access memory) делится на разделы, называемые страницами (pages). Swapping (”подкачка”, своппинг) - это процесс во время которого страницы памяти копируются на специально сконфигурированный для этого раздел диска, называемый swap space (раздел подкачки, может быть как и файлом, так и разделом жесткого диска), для освобождения ОЗУ. Совокупные размеры физической памяти и раздела подкачки - это объем имеющейся виртуальной памяти.
Своппинг необходим по следующим причинам. Во-первых, когда системе необходимо больше памяти (т.е. приложение или процесс запрашивает у системы больше памяти) чем сейчас свободно в ОЗУ, ядро разгружает (”откачивает”) наименее используемые страницы и освобожденную память выделяет текущему приложению или процессу. А во-вторых, значительное количество страниц используемых программами на стадии запуска, используются только при инициализации и никогда более. Соответственно система может засвапить эти страницы, тем самым освобождая (разгружая) ОЗУ.
Тем не менее, у своппинга есть и недостатки. По сравнению с ОЗУ, работа с жестким диском осуществляется намного медленнее. Для оценки временных затрат на чтение/запись в ОЗУ используются наносекунды, в то время, как для жесткого диска используются миллисекунды, т.е. одни и теже операции на жестком диске занимают в десятки тысяч больше времени чем в ОЗУ. Следовательно, чем больше страниц спаппится, тем медленнее работает ваша система. Иногда могут возникать такие проблемы, когда страница откачивается из ОЗУ, и через очень короткий промежуток времени закачивается обратно, и т.д., это приводит к сильному затормаживанию вашей системы. В таких ситуациях выход один - увеличить объем ОЗУ.
В Linux есть две формы своппа: раздел подкачки и файл подкачки. Раздел подкачки - это отдельный раздел на жестком диске, используемый только для своппинга, никакие другие файлы не могут там располагаться. Файл подкачки - это специальный файл в файловой системе.
(Кстати в Windows тоже есть файл подкачки, его даже иногда есть смысл переносить на отдельный диск, т.к. тогда он не будет фрагментироваться. Но это не будет тем же самым, как Linux своп раздел, т.к. в Linux работа с этим разделом происходит на низком уровне.)
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 проверьте, какие сповы примонтировались.
Для начала создайте файл, например размером один гигабайт:
dd if=/dev/zero of=/swapfile bs=1024 count=1048576Затем подготавливаем своп:
mkswap /swapfileТ.е. все аналогично: swapon /swapfile Осталось только добавить строку в файл /etc/fstab:
/swapfile none swap sw 0 0
Ключевым остается вопрос “Сколько?”. Старые версииUNIX-подобных операционных систем (Sun OS, Ultrix) официально требовали своп в два или три раза больше чем ОЗУ. Современные системы, например Linux, уже не требуют такого объема, но вы всегда можете сконфигурировать и больше. Со временем выработались некоторые негласные правила:
В ядре Linux версии 2.6 добавился новый параметр свопа - swappiness. Он принимает значения от 0 до 100. Т.е. грубо говоря - это эффективность своппинга, чем выше значение, тем больше страниц приложения стараются выгрузить в своп. Один из главных майнтенеров ядра Andrew Morton сказал, что он на своем домашнем ПК использует swappiness=100. Он считает, что это не правильно, уменьшать возможности ядра к своппингу.
Но как было сказано в начале, если время между выгрузкой и загрузкой страниц больше, чем время которое нужно программе, то это лишнии потери времени. По умолчанию swappiness равен 60. Вы можете временно (до следующей перезагрузки системы) изменить это следующей командой:
echo 50 > /proc/sys/vm/swappinessДля того что бы изменить значение по умолчанию необходимо изменить параметр vm.swappiness в файле /etc/sysctl.conf.