Shtsh 15.09.2010 21:10

ПереводыВсё о подкачке в Linux.

Оригинал
Переведено при помощи сервиса translated.by инициативной группой переводчиков welinux при участии пользователей Shtsh, settler, zereal.

Linux делит физическую память (RAM, random access memory, память с произвольным доступом) на участки, называемые страницами. Свопинг - это процесс, когда страницы памяти копируются на заранее определённое место на жёстком диске, называемое областью подкачки (swap). Совместно физическая память и область подкачки составляют виртуальную память.

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

Однако, у свопинга есть и отрицательная сторона. В сравнении с оперативной памятью, диски очень медленные. Время доступа к памяти измеряется в наносекундах, тогда как к дискам -- в миллисекундах, так что диски в десятки тысяч раз медленнее. В результате, чем чаще происходит свопинг, тем медленнее будет ваша система. Иногда излишний свопинг (trashing) возникает в случаях, когда страница выгружается, а затем очень быстро опять помещается в память и так происходит постоянно. В таких случаях система борется за свободную память и не даёт приложениям возможность работать одновременно. Единственная возможность помочь - добавить оперативной памяти.

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

Для того, чтобы посмотреть, какие области подкачки есть в системе, используйте команду swapon. Вывод будет примерно таким:
1
2
3
Filename Type Size Used Priority

/dev/sda5 partition 859436 0 -1



Каждая линия отображает отдельную область подкачки, используемую системой. Здесь поле "Type" отображает, что используется раздел, а не файл (подразумевается именно своп-файл, ведь раздел -- это тоже файл -- прим. перев.), в поле "Filename" мы видим, что что это /dev/sda5. Поле "Size" показывает размер в килобайтах, а поле "Used" отображает, сколько килобайтов используется системой (в данном случае 0). "Priority" указывает Linux, какую область подкачки использовать в первую очередь. Замечательной особенностью подсистемы подкачки Linux является то, что вы можете монтировать две (или больше) области подкачки (предпочтительно на разных устройствах) с одинаковым приоритетом, Linux разделит активность подкачки между ними, что может значительно ускорить быстродействие свопинга.

Раздел подкачки

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

1
fdisk -l /dev/hdb



Замените /dev/hdb тем разделом на жёстком диске, который вы собираетесь использовать как своп. Вывод должен быть похож на это:
1
2
3
Device Boot Start End Blocks Id System

/dev/hdb1 2328 2434 859446 82 Linux swap / Solaris



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

После того, как разделы помечены как swap, вам нужно подготовить их, используя команду mkswap (make swap) с правами суперпользователя.

1
mkswap /dev/hdb1



Если вы не увидите ошибок, значит область подкачки готова к использованию. Чтобы немедленно её активировать, введите

1
swapon /dev/hdb1



Вы можете проверить, что она используется, выполнив swapon -s. Чтобы область подкачки автоматически монтировалась при загрузке, нужно добавить запись в файле /etc/fstab, который содержит список файловых систем и областей подкачки, которые монтируются во время загрузке системы.

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

1
/dev/hdb1 none swap sw 0 0



где /dev/hdb1 - своп-раздел. У него нету точки монтирования, поэтому стоит "none". Тип раздела "swap" с опциями "sw", последние два параметра в данном случае не используются, поэтому стоит 0.

Чтобы проверить, примонтируется ли область подкачки автоматически, не перезагружаясь, можно выполнить swapoff -a (которая отключит все области подкачки) и затем swapon -a (которая примонтирует все области подкачки, описанные в /etc/fstab). После этого можно проверить при помощи swapon -s.

Файл подкачки

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

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

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



/swapfile это имя файла подкачки, а число 1048576 - размер файла в килобайтах (равно 1 Гб).

Подготовьте файл подкачки, используя команду mkswap так же, как и при работе с разделом, но в этом случае используйте имя файла подкачки.

1
mkswap /swapfile



И так же примонтируйте его используя команду swapon:
1
swapon /swapfile



Запись в файле /etc/fstab будет выглядеть так:

1
/swapfile none swap sw 0 0



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

Можно запустить Linux и без области подкачки, и система нормально запустится если у вас много памяти -- но если у вас закончится физическая память, то система упадет, так как больше ничего не сможет сделать, поэтому рекомендуется иметь область подкачки, особенно ввиду того, что дисковое пространство достаточно дешевое.

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

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

В ядре версии 2.6 добавлен новый параметр, называемый swappiness, позволяющий администратору настраивать, как происходит свопинг в Linux. Это число от 1 до 100. Чем больше значение, тем больше страниц свопится, а чем меньше, тем меньше страниц попадает в область подкачки, даже если они простаивают. Разработчик ядра Эндрю Мортон сказал, что он запускает свой компьютер со значением 100, заявив: "Я считаю, что уменьшение свопинга ядра неправильно. Вы же не хотите, чтобы на машине были сотни мегабайт неиспользуемой памяти. Пускай убирается на диск, а память используется для чего-нибудь полезного."

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

Значение по-умолчанию 60. Вы можете временно (до перезагрузки) изменить его, введя с правами рута:

1
echo 50 > /proc/sys/vm/swappiness



Если вы хотите изменить это навсегда, тогда задайте значение параметра vm.swappiness в файле /etc/sysctl.conf.

Заключение

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


Тэги: ram swap память перевод подкачка ядро
+ 14 -
Похожие Поделиться

time2die 15.09.2010 21:46 #
В ядре версии 2.6 добавлен новый параметр, называемый swappiness, позволяющий администратору настраивать, как происходит свопинг в Linux. Это число от 1 до 100. Чем больше значение, тем больше страниц свопится, а чем меньше, тем меньше страниц попадает в область подкачки, даже если они простаивают. Разработчик ядра Эндрю Мортон сказал, что он запускает свой компьютер со значением 100, заявив: "Я считаю, что уменьшение свопинга ядра неправильно. Вы же не хотите, чтобы на машине были сотни мегабайт неиспользуемой памяти. Пускай убирается на диск, а память используется для чего-нибудь полезного."

у меня на ноутбуке 1024 mb оперативки, сейчас с оперой занято 316, вопрос есть ли мне смысл изощратся со значением ?
thebeetlebum 15.09.2010 22:28 #
Если Вы особо не пользуетесь приложениями, которые едят оперативку, то можете поставить процентов 10.

Скажем, у меня нетбук с 2 гб оперативки. Сразу докупил, т.к. она быстрее свопа и отн. дешевая (1к.руб). Своп у меня 2.5Гб. Такой размер свопа нужен чтобы при саспендах нормально хранились данные из оперативки. На деле же никогда выше 600 метров не поднимается практически.

Вообщем, старайтесь избегать свопа, но если без него никак, но снизьте вероятность его использования.
thebeetlebum 15.09.2010 22:29 #
*Ушел читать учебник по русскому языку*
IamCrazy 16.09.2010 10:08 #
Для обычных пользователей вариант по умолчанию всегда более предпочтительнее.
Ответ: нет.
dmd2live 15.09.2010 21:59 #
А что насчет спящего режима? Нужен, не нужен раздел подкачки. Я так разобраться внятно не смог.
andreas 15.09.2010 22:54 #
Нужен. Должно работать и с файлом подкачки, я даже как-то разобрался как, но работало почемуто через раз и только с бубном. Так что если используешь hibernate, делай swap-раздел, сэкономишь кучу нервов.
dmd2live 15.09.2010 23:04 #
А если например в данный момент используется полностью оперативная память и часть файла подкачки, как система поступает при переходе в hibernate? И используется ли своп при ждущем режиме?
settler 15.09.2010 23:19 #
для этого надо чтоб размер подкачки был больше размера памяти (какраз для таких случаев когда кроме оперативки занято еще и немного из подкачки). Только там наверно уже как повезет - смотря сколько занято.
dmd2live 15.09.2010 23:23 #
Мне и четырёх гигов под своп (сколько оперативки) жаба душит, если честно, куда уж больше.
andreas 15.09.2010 23:20 #
я сейчас точно не помню, курс "Операционные системы" был давно, но вроде бы посылается запрос всем приложения освободить как можно больше памяти. Кто-то реагирует на это, кто-то нет. Потом оперативная память скидывается в swap, нужый адрес (c которого потом стартовать) сохраняется и всё, poweroff. Если места не хватит, то hibernate обрывается и соответсвенно сейчас невозможен.
В standby память сохраняет все данные, т.е. остаётся под напряжением, проходит refresh. Процессор и остальная переферия выключены.
dmd2live 15.09.2010 23:22 #
Примерно ясно, спасибо.
cyrus 15.09.2010 22:20 #
Может переводы сделать только для подписавшихся на блог?
exelens 15.09.2010 23:20 #
А почему? Разве не интересно?
cyrus 15.09.2010 23:43 #
Лично мне нет. Одно дело когда рассказывают о своём экспириенсе. Там можно и вопрос задать, и дискуссию поднять. В перевод только текст. За ним ничего не стоит.. переводчики не являются тем у кого можно спросить по теме текста.

Может быть тогда сделать функционал типа "не показывать для меня блог БЛАБЛАБЛ". Просто получается функционал блогов не поддерживается в полной мере.И подписка мало на что влияет. Те кому интересно, могут подписаться на "переводы" и пусть он для них отображается, но те кому это неинтересно, не могут убрать этот контент для себя..
dementiy 16.09.2010 00:49 #
Зря Вы так, у нас люди не часто пишут технические статьи, так пускай хотя бы переводы будут, но конечно они не должны превосходить количество статей написанных пользователями (иначе welinux превратится в сборник переводов).
А вот сами переводы думаю следует выкладывать не в блоге "Переводы", а в соответствующем тематике статьи блоге, чтобы их потом было проще найти.
ZogG 16.09.2010 04:06 #
для этого есть таги, мелкие статьи возможно, большие технические тексты лучше всего будут себя чувствовать в блоге переводов =)
dmd2live 15.09.2010 23:25 #
Зачем? Смысл же не только в самом факте перевода. Новая статья рождает дискуссии.
cyrus 15.09.2010 23:44 #
вот там выше затронул тему дискуссии..

хз кто минусы вам обоим влепил и непонятно за что.. ща плюсану :)

эти - с + что-то тоже поднадоели))
2Exelens нужен ребрендинг :D
Q2W 15.09.2010 22:52 #
Можно запустить Linux и без области подкачки, и система нормально запустится если у вас много памяти -- но если у вас закончится физическая память, то система упадет, так как больше ничего не сможет сделать

Система не упадёт, а откажет процессу в запросе на выделение памяти.
Многие программы адекватно реагируют на такую ситуацию и не падают.
Например, mysql не сдохнет, а откажется выполнить запрос выбросив исключение на клиенте. на которое клиентская программа может среагировать.
greynix 15.09.2010 23:25 #
Другими словами , если я все правильно понял. Swappiness - это уровень свободной памяти, при котором система начнет активно сбрасывать память в своп. swappiness=100 - система отправляет данные в своп, swappiness=0 - система хранит данные в оперативе и в своп ничего не идет (или идет в том случае когда забита оперативка). Если оперативы много то значение надо выбирать ближе к 0, если мало то ближе к 100. Поправьте меня если я неправильно понял (время позднее мог и напутать), т.е. если мы ставим значение на пример 20... , то когда память будет заполнена на 80%, данные сверх 80 % буду записываться в своп, а 20 % останутся нетронутыми, для использования программами?
andreas 15.09.2010 23:49 #
Вы же не хотите, чтобы на машине были сотни мегабайт неиспользуемой памяти. Пускай убирается на диск, а память используется для чего-нибудь полезного

Этот "жжж" неспроста (c). Память действительно можно использовать полезнее, чем держать в ней открытый pdf который ты читал месяц назад, но забыл закрыть. Например для кэша дисковых данных, которые сейчас нужнее (видео, музыка) или записываются. Т.е. даже если оперативы много, это не значит, что своп плохо.

На счёт swappiness, не совсем, но похоже: прото есть два варианта: мы начинаем свапить только когда нам действительно дальше некуда (1) или мы начитаем свапить заранее, например как-только страницу не запрашивали несколько секунд она идёт в свап (100). Ну и между этими двумя крайнястями это как-то раскидывается (по времени таймаута и свободной памяти).
f_evgeny 16.09.2010 10:05 #
> Память действительно можно использовать полезнее, чем держать в ней открытый pdf
> который ты читал месяц назад, но забыл закрыть.

Вот! Это одна из важных причин, по которы нужен своп. С ПДФ-ом, конечно ясно. Но и на серверах та же картина. Даже в исполняемых файлах есть страницы памяти, которые используются, например только при запуске. Они давно отработали и не нужны до следующего запуска программы, а память занимают. В нагруженном сервере все такие страницы потихоньку, в моменты пиковых нагрузок мигрируют в своп и система потихоньку подстроится таким образом, чтобы максимально эффективно использовать оперативную память.
TiGR 16.09.2010 03:53 #
Странно, что в статье с таким громким названием нет ни слова про hibernate.
Zereal 16.09.2010 07:26 #
про hibernate будет отдельный перевод.
IamCrazy 16.09.2010 10:06 #
Надо руководствоваться следующим:
1) для настольных систем, используйте область подкачки с удвоенным размером физической памяти

Насколько я знаю, при 2Гб и более это уже нерационально, да можно сказать неправильно. Данные немного устарели. Кстати, практически на каждом форуме с линуксовой тематикой данный вопрос поднимался много-много раз.
А выбор скорее происходит на основе того, чем собираешься заниматься.
Extender 16.09.2010 20:19 #
Соглашусь, у меня 2 Гб памяти и вообще нет свопа, и ни разу за два года не было ситуации когда память кончилась.
ZED 16.09.2010 18:11 #
Если в системе несколько физических дисков, откусываете от каждого по паре гигов и объединяете в софт рейд 0, а потом его под свап. Как мне рассказывали, эффект потрясающий.
yuretsz 16.09.2010 19:21 #
Отключил тормозной своп к чертям собачим, задолбался ждать когда при случайном клике на жирную программу, которая давно не использовалась ждешь по 10-15 минут диких торомозов, что даже мышь еле бегает. А если еще торренты на полную, то по пол часа можно курить.