5/17/2010

Файл подкачки: swap-файл и swap-раздел в Linux

Все мы знаем, что swap-файлы в Linux делаются просто и легко - настолько просто, что иногда забываем, как это делается. Прежде, чем что-то создавать, хорошо бы узнать, сколько swap-пространства у нас уже имеется в системе - для этого следует дать команду в консоли от рута:
# swapon -s
Результат будет в виде:

Filename Type Size Used Priority
/dev/hda1 partition 289128 0 -1

Описание вывода команды:
  • Filename описывает имеющиеся у вас своп-пространства и где они находятся.
  • Type указывает тип пространства: partition (раздел) или file (файл).
  • Size сообщает общий размер Swap-пространств.
  • Used говорит о том, сколько сейчас свопа задействовано.
  • Priority указан приоритет, т.е. какие пространства системе использовать вначале.
Тот же самый результат мы получим по команде cat /proc/swaps

Создание swap-файла в Linux
1. Открываем консоль\терминал и получаем полномочия root или используем sudo:
$ su
2. Думаем*, какой размер swap-файла нам нужен в мегабайтах. Подумавши, даём команду:
sudo dd if=/dev/zero of=/swapfile bs=1M count=500
или
# dd if=/dev/zero of=/swapfile bs=1M count=500
В команде dd для задания размеров можно использовать суффиксы K, M, G для килобайт, мегабайт и гигабайт соответственно. В данном примере это 500 Mегабайт файла подкачки.

* Многие задаются фундаментальными вопросами бытия вроде "каков рекомендуемый размер swap в linux"? Можно не думать, а просто создать SWAP-файл по размеру оперативной памяти, периодически посматривая на её, подкачки, использование с помощью команды top. При необходимости добавить\уменьшить своппинг системе. Можно использовать несколько файлов подкачки.

3. Поясняем системе, что созданный пустой файл это всё-таки файл подкачки для Linux:
sudo mkswap /swapfile
или
# mkswap /swapfile

4. Подключаем созданный swap-файл:
sudo swapon /swapfile
или
# swapon /swapfile
При этом в выводе команды top или команды free должно появиться упоминание, что свопинга в системе поприбавилось. Чтобы отключить файл подкачки, пишем
sudo swapoff /swapfile
или
# swapoff /swapfile
Чтобы не подключать swap-файл или swap-раздел каждый раз, полезно занести запись в /etc/fstab следующего содержания:
/swapfile none swap sw 0 0
На всякий случай отмечу, что каждый раз создавать swap-файл не нужно: просто подключаете и отключаете его с помощью swapon/swapoff. Работа со swap-разделами в Linux происходит аналогичным образом.


Приоритет SWAP-файлов
Создавать и использовать swap-файлов в Linux можно любое количество. При этом можно указать приоритет подключаемого swap-файла или раздела (хотя ядро умеет самостоятельно распределять по разделам/файлам подкачки).

Например, высший приоритет для файла подкачки задаётся так:
swapon -p 1 /opt/swapfile
Приоритет является целым числом от 0 до 32767.


Очистка swap-пространства после ресурсоёмких приложений
Командой swapoff -a, запущенной от имени root, можно отключить использование всех разделов и файлов подкачки. После ввода команды содержимое свопа за несколько минут загружается обратно в оперативную память, а сам раздел подкачки отключается.
После загрузки содержимого свопа в оперативную память включем своп обратно командой swapon -a.


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

Насчёт оптимального значения параметра
swappiness есть много разных мнений. Так, например, один из ведущих разработчиков ядра Эндрю Мортон считает, что для десктопа лучше ставить большое значение, чтобы всякое bloatware скинуть в своп и использовать оперативную память для чего-то нужного.

Чрезмерное значение здесь приведёт к интенсивному использованию swap-файла, что нежелательно. Слишком маленькое значение может привести к тому, что при заполнении памяти будет принудительно запущен OOMkiller (процесс, запускающийся при исчерпании памяти и убивающий наиболее ресурсоёмкие задачи).

Временно (до перезагрузки системы) изменить этот параметр можно с помощью команды:

echo 50 > /proc/sys/vm/swappiness

Чтобы изменить значение по умолчанию, необходимо изменить параметр vm.swappiness:

vm.swappiness=50

в файле /etc/sysctl.conf

Следует, впрочем, отметить, что со vm.swappiness сильно перегибать палку не стоит. При больших значениях система потеряет в отзывчивости (будет вытеснять память, с которой работают приложения, в своп, хотя оперативной памяти ещё много). При малых значениях система работает отзывчивей, но когда оперативная память заканчивается, система начинает активно свопиться и притормаживать.

Также можно попробовать увеличить\уменьшить объём потребляемой системой памяти за счёт изменения размеров дискового кеша. Уровень выделяемой под кеш памяти хранится в
/proc/sys/vm/vfs_cache_pressure
Значение по умолчанию: 100. Чтобы использовать меньше памяти под дисковые кеши (что вообще говоря не есть хорошая идея), ставим значение 50. Если, наоборот, хочется больше отзывчивости системы, увеличиваем размер кеша не скупясь:
echo 1000 > /proc/sys/vm/vfs_cache_pressure
и далее продолжаем играться с параметрами вплоть до полного удовлетворения. Для того, чтобы настройки стали постоянными, заносим параметр
vm.vfs_cache_pressure = 1000
в файл /etc/sysctl.conf и со следующей загрузки дисковые кеши будут смачно чавкать вашей оперативной памятью.

Ссылки
Источники вдохновения здесь, там, среди замечательных комментариев к этому посту и кое-что из Цифровой кладовки.

31 комментарий:

  1. 1ая часть статьи совсем неинтересная, а вот из 2ой почерпнул что-то новое...

    Кстати, форматирование у меня кривовато отображается:
    http://omploader.org/vNGNiNQ

    ОтветитьУдалить
  2. В этом абзаце явно что-то не то:
    "За интенсивность обращения системы к swap-файлам и swap-разделам отвечает параметр swappiness, равный по умолчанию 60 (значение параметра может быть в пределах от 0 - наименьшее использование подкачки, до 100 - подкачка используется часто). сообщения, что при большом объёме памяти (от 1Гб) оптимальным значением является 10
    Чрезмерное значение здесь приведёт к интенсивному использованию swap-файла, что нежелательно."

    ОтветитьУдалить
  3. А что всё же лучше использовать - целый раздел или файл?
    Наверное раздел будет пошустрее работать чем файл в файловой системе, хотя у файла проще изменить размер будет в дальнейшем.

    Или скорость работы практически не отличается?

    ОтветитьУдалить
  4. Уровень выделяемой под кеш памяти хранится в /proc/sys/vm/vfs_cache_pressure
    Значение по умолчанию: 100.

    А в чем это значение измеряется?
    Проценты, приоритет, размер в мегабайтах зелёные попугайчики? ;)

    По-моему линукс по-умолчанию со значением 100 всю свободную память может использовать под дисковый кеш, моментально освообождая её если она потребуется приложениям. А что будет происходить при значении 1000? И при значении 50 - 50% от свободной памяти или 50% от всей?

    И каким образом кроме "глаз-алмаз" можно проверить прирост/падение эффективности этого кеширования?

    ОтветитьУдалить
  5. В команде dd для задания размеров можно использовать суффиксы K, M, G. Получается более удобный и понятный вариант:

    dd if=/dev/zero of=/swapfile bs=1M count=500

    ОтветитьУдалить
  6. А что всё же лучше использовать - целый раздел или файл?
    Наверное раздел будет пошустрее работать чем файл в файловой системе, хотя у файла проще изменить размер будет в дальнейшем.


    А если раздел создать на LVM, то оба преимущества можно будет совместить в одном.

    ОтветитьУдалить
  7. А если раздел создать на LVM, то оба преимущества можно будет совместить в одном.
    И получить ещё одну дополнительную прослойку между винчестером и системой, которая скорее всего добавит немножко тормозов, нагрузки на проц и потенциальных багов.

    ОтветитьУдалить
  8. > A что всё же лучше использовать - целый раздел или файл?
    А если своп-файл создать в начале диска (где линейная скорость вращения цилиндров выше), то можно немного увеличить скорость чтения/записи.
    Ещё быстрее было бы использование под своп отдельного диска, расположенного на отдельном шлейфе.

    ОтветитьУдалить
  9. @Анонимный, 17.05.2010 1:59:00
    а вот из 2ой почерпнул что-то новое
    И это главное.

    Кстати, форматирование у меня кривовато отображается
    Это я накосячил :-) Исправил, спасибо!

    @Анонимный, 17.05.2010 8:31:00
    В этом абзаце явно что-то не то
    Да, что-то я тут намудрил. Пофиксено.

    @Murz, 17.05.2010 16:51:00
    А что всё же лучше использовать - целый раздел или файл?
    Оперативки прикупить :-)
    А если серьёзно, то должен быть быстрее своп-раздел вначале винчестера (нет фрагментации + скорость чтения вначале немного больше).

    хотя у файла проще изменить размер будет в дальнейшем.
    Так на то и swapon придуман: мало свопа - подключаем файл. Много свопа - отключаем файл и стираем его.

    @Murz, 17.05.2010 16:55:00
    Значение по умолчанию: 100. А в чем это значение измеряется?
    Хороший вопрос. Мне нравится вариант с зелёными попугайчиками :-)

    И каким образом кроме "глаз-алмаз" можно проверить прирост/падение эффективности этого кеширования?
    Тесты, замеры с помощью команды time например (что грубовато, но сойдёт).

    @Анонимный, 17.05.2010 17:32:00
    В команде dd для задания размеров можно использовать суффиксы K, M, G.
    О, точно, а я и забыл. Спасибо, поправил.

    @Анонимный, 17.05.2010 17:50:00
    Наверное раздел будет пошустрее работать чем файл в файловой системе,
    Поддерживаю про раздел. Про LVM не поддерживаю :-)

    @Murz, 17.05.2010 18:05:00
    И получить ещё одну дополнительную прослойку между винчестером и системой, которая скорее всего добавит немножко тормозов, нагрузки на проц и потенциальных багов.
    Во-во, Murz рубит правду-матку. Меньше прослоек - выше скорость. Жаль, что на ноутбуках с вариантами не густо.

    @lizardie, 17.05.2010 20:10:00
    Ещё быстрее было бы использование под своп отдельного диска, расположенного на отдельном шлейфе.
    Верное дело говоришь, но вот только где ж его взять, отдельный винчестер под своп? Или жаба задавит, или се-ля-ви а-ля ноутбук...

    ОтветитьУдалить
  10. Про дисковый кэш приспасибо :)

    ОтветитьУдалить
  11. Да, вторая часть статьи действительно полезней и интересней первой. С другой стороны получилась нормальная статья, охватывающая необходимые знания о своппинге.

    Параметры можно также менять с помощью sysctl, например так:

    $ sudo sysctl -w vm.vfs_cache_pressure=1000

    Ну и напоследок, как всегда, придирки:
    > Что бы изменить значение по умолчанию

    > Так же можно попробовать увеличить\уменьшить объём потребляемой системой памяти

    ОтветитьУдалить
  12. @sllxxe пишет...
    Про дисковый кэш приспасибо :)
    Пожалуйста. Я вообще думал это отдельным постом забабахать, но прикинул, что материала маловато.

    @ Minoru пишет...
    Да, вторая часть статьи действительно полезней и интересней первой.
    Дык про кеш там много не наскребёшь, а у меня память вышибает на предмет свопа - постоянно ищу в notecase в своих заметках. Ну и выкатил, наконец, сюды.

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

    Ну и напоследок, как всегда, придирки:
    Не придирки, а ценные замечания :-)
    Поименованные ляпы пофиксены, спасибо!

    ОтветитьУдалить
  13. А главную то проблему вы так и не подняли. На современных компах с большими объемами ОЗУ свап нужен только для suspend2disk. Как это реализовать в файле?

    ОтветитьУдалить
  14. А если раздел создать на LVM, то оба преимущества можно будет совместить в одном.
    Ну и зачем еще одна прослойка? Если Вы хотите что-то типа stripe RAID-массива, то проще указать одинаковый приоритет (например, swapon -p 1 ...) - ядро умеет самостоятельно распределять по разделам/файлам подкачки.

    ОтветитьУдалить
  15. @Blogger Станислав пишет...
    А главную то проблему вы так и не подняли. На современных компах с большими объемами ОЗУ
    Он есть не у всех и не всегда. Прямо сейчас я пишу с нетбука, на котором памяти, пардон, не вагон и своп ОЧЕНЬ актуален.

    свап нужен только для suspend2disk. Как это реализовать в файле?
    У меня отрицательное отношение к суспенду вообще (на мой взгляд, это бесполезная рюшечка). Так что я не в теме. Но если у вас получилось\получится это настроить - я принимаю гостевые посты, если что...


    @Анонимный, 25.05.2010 21:21:00
    Ну и зачем еще одна прослойка?
    Согласен, выше уже отписывался.

    указать одинаковый приоритет (например, swapon -p 1 ...)
    О, тов. Анонимус, вот это вы мне классно напомнили - а я в посте это и упустил. Добавил, спасибо!

    ОтветитьУдалить
  16. свап нужен только для suspend2disk. Как это реализовать в файле?

    свап нужен далеко не только для suspend2 disk. Существует огромное кол-во приложений с очень порядочным потреблением памяти, например БД Progress.

    Буквально сегодня сервер встал по причине нехватки 4ГБ свапа во время загрузки базы.

    Что касается suspend2disk, смотрите tuxonice.net, он может и в файл.

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

    Эта «дополнительная прослойка» добавляет столько вкусного... А за много лет использования я не замечал ни немножко тормозов, ни нагрузки на проц, ни багов. Три раза тьфу через левое плечо! :)

    ОтветитьУдалить
  18. не плохо бы по поводу swap и SSD что то полезное услышать, типа ext2 или с отключеным журналол ext4 (актуально у кого нетбуки на SSD)

    ОтветитьУдалить
  19. swap и ssd (ext2 или ext4-jurnal)?

    ОтветитьУдалить
  20. Можно добавить, что с vm.swappiness сильно перегибать палку не стоит. При больших значениях система потеряет в отзывчивости (будет вытеснять память, с которой работают приложения, в своп, хотя оперативной памяти ещё много.)При малых значениях система работает отзывчивей, но когда оперативная память заканчивается, начинается сущий кошмар: система начинает активно свопиться, тормозить, подвисать и вообще ведёт себя неадекватно.

    ОтветитьУдалить
  21. @А. Стрижак пишет...
    свап нужен далеко не только для suspend2 disk. Существует огромное кол-во приложений с очень порядочным потреблением памяти
    Собственно, именно с этим я и сталкиваюсь почти каждый день: обработка изображений съедает всё ОЗУ, что есть на машине (сколько не дай - все мало).

    @ Анонимный пишет...
    Эта «дополнительная прослойка» добавляет столько вкусного...
    Народ требует хлеба и зрелищ - в смысле, описаний и примеров этого самого вкусного.


    @ Анонимный пишет...
    не плохо бы по поводу swap и SSD что то полезное услышать, типа ext2 или с отключеным журналол ext4
    Это не SSD, а банальный флеш-мемори. По сообщениям "счастливых" обладателей еееППЦ тормозит оно очень даже страшненько. Настоящие SolidState Disks набраны из DDR RAM по цене от самолёта.

    @digiboxroom пишет...
    Можно добавить, что с vm.swappiness сильно перегибать палку не стоит.
    Эт точно (с) Белое солнце пустыни.
    Ещё в вашем блоге понравилось про очистку свопа - я и сам так делаю, но в посте сразу всего не упомнишь. Так что немножко утянул, поставив, естественно, ссылку :-)

    ОтветитьУдалить
  22. Это не SSD, а банальный флеш-мемори. По сообщениям "счастливых" обладателей еееППЦ тормозит оно очень даже страшненько. Настоящие SolidState Disks набраны из DDR RAM по цене от самолёта.
    ГЛУПОСТЬ!!!
    1.ееепс комплектуется дешёвым ссд :(
    2.DDR RAM технология дешевая и наверняка используют статическую память (дорогая)+какойто блок енергонезависемости - это в случае не флеш.

    ОтветитьУдалить
  23. @Анонимный Анонимный пишет...
    1.ееепс комплектуется дешёвым ссд :(
    Я в курсе. Я хочу что-то вроде вот этого, а то, что в ееППЦ стоит, просто не разговор.

    2.DDR RAM технология дешевая
    Если это i-RAM от Gigabyte, то не стоит оно того. Я говорил о больших SSD, на сотни гигабайт... Но это лишь мечты.

    ОтветитьУдалить
  24. Хотел по поводу SSD высказаться.
    не плохо бы по поводу swap и SSD что то полезное услышать, типа ext2 или с отключеным журналол ext4 (актуально у кого нетбуки на SSD)
    Вот тут неплохо написано, но безоговорочно советам следовать не стоит, а то они там местами с перегибами.
    Это не SSD, а банальный флеш-мемори.
    Очень даже SSD. Только не RAM based, а NAND based.
    По сообщениям "счастливых" обладателей еееППЦ тормозит оно очень даже страшненько.
    Как счастливый обладатель ASUS EeePC 1000 с SSD носителем сообщаю, тормозов связанных с дисковой подсистемой за полтора года использования не замечал. В основном тормозит процессор в Gimp, или при воспроизведении flash в firefox. (ubuntu 9.10 + icewm)
    Я хочу что-то вроде вот этого, а то, что в ееППЦ стоит, просто не разговор.
    Я надеюсь Вы не хотите вставить ЭТО в EeePC. :-) А то сравнение немного некорректно.

    ОтветитьУдалить
  25. На новом ноутбуке изначально стояла Kubuntu, в которой все программы жестоко тормозили и иногда вылетали. Оказалось, что нет раздела подкачки... Ни разу не урезал существующие разделы, поэтому файл подкачки пришёлся "по вкусу".

    ОтветитьУдалить
  26. телефон с linux embedded. Создаю swap файл на nand флешке файловой системы yaffs2. Все проходит замечательно до включения swap. Вылетает ошибка:

    [root@Linux /]#dd if=/dev/zero of=/swapfile bs=1M count=10
    10+0 records in
    10+0 records out
    [root@Linux /]#mkswap /mnt/SD1/swapfile
    Setting up swapspace version 1, size = 10481664 bytes
    [root@Linux /]#swapon /swapfile
    swapon: swapfile has holes
    swapon: /swapfile: Invalid argument

    Если создавать на флешке microSD то все проходит нормально. Но этот вариант мне не подходит. Проблема заключается в том , что при отмонтировании флешки, отключается swap и оперативки не хватает, вследствии чего слетают и не запускаются все qProcces.

    ОтветитьУдалить
  27. >dd if=/dev/zero of=/swapfile...
    >mkswap /mnt/SD1/swapfile
    >swapon /swapfile
    ----
    а если бы так: mkswap /swapfile

    ОтветитьУдалить
  28. А вот так можно освободить память, занятую под дисковые кеши
    echo 3 > /proc/sys/vm/drop_caches

    ОтветитьУдалить
  29. Этот комментарий был удален автором.

    ОтветитьУдалить
  30. @сисадмин комментирует...
    А вот так можно освободить память, занятую под дисковые кеши
    echo 3 > /proc/sys/vm/drop_caches


    Можно, но не стоит этого делать - оперативную память надо использовать под кэш, а не солить. Пусть работает. Кстати, надо бы это добавить в пост по /proc.

    @Роман Соломаха комментирует...
    500 Мб я понял... а что в команде означает 1М?

    bs --- block size, размер блока (1 Мегабайт в данном случае), count - счёт (количество) блоков, здесь 500. Получаем 500 Мб.

    Всегда Ваш, Оберфельдфебель Эвидэнц :-)

    ОтветитьУдалить