Каковы точные условия, на основе которых Linux подменяет процесс (ы) памяти из ОЗУ в файл подкачки?

Мой сервер имеет 8 Гб оперативной памяти и 8 Гб, настроенные для файла подкачки. У меня запущены приложения с интенсивным использованием памяти. Эти приложения имеют пиковые нагрузки, во время которых мы находим увеличение использования свопа. Примерно 1 ГБ свопа используется.

У меня есть другой сервер с 4 гигабайтами оперативной памяти и 8 гигабайтами подкачки и аналогичными приложениями, интенсивно использующими память. Но здесь использование свопа очень незначительно. Около 100 МБ.

Мне было интересно, каковы точные условия или грубая формула, на основе которой Linux будет делать обмен памяти процесса в оперативной памяти на файл подкачки. Я знаю, что это основано на факторе подкачки. На чем еще это основано? Размер файла подкачки? Любые указатели на документацию ядра Linux / исходный код, объясняющие это, будут великолепны.

2 ответа

Решение

Я видел много людей, которые публиковали субъективные объяснения того, что это делает. Вот, надеюсь, более полный ответ.

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

Так, например, в системе, где не осталось свободной памяти - значение имеющейся у вас памяти измеряется на основе того, какой объем памяти указан как "Активный", и частоты, с которой страницы переводятся в активные после попадание в неактивный список.

LRU с большим количеством продвижений / понижения страниц между активным и неактивным широко используется.

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

Что делает подкачка, так это изменяет это значение, вычитая номер подкачки, который вы дали (по умолчанию 60), в файловую память и добавляя значение подкачки, которое вы дали в качестве множителя, в память. Таким образом, замена по умолчанию оставляет анонимную память в 80 раз ценнее файловой памяти (200-60 для файла, 0+60 для anon). Таким образом, в типичной системе Linux, которая израсходовала всю свою память, кеш страниц должен быть в 80 раз активнее анонимной памяти, чтобы анонимная память могла быть заменена на кеш страниц.

Если вы установите swappiness на 100, это дает модификатору 100 и файловой памяти модификатор 100 (200 - 100), оставляя оба LRU одинаково взвешенными. Таким образом, в файловой системе, требующей кэширования страниц, предоставляющей анонную память, она не так активна, как кеш страниц, тогда аноновая память будет перенесена на диск, чтобы освободить место для дополнительного кэша страниц.

Linux (или любая другая ОС) делит память на страницы (обычно 4 КБ). Каждая из этих страниц представляет кусок памяти. Сохраняется информация об использовании этих страниц, которая в основном содержит информацию о том, свободна ли страница или используется (часть какого-либо процесса), был ли к ней доступ недавно, какие данные она содержит (данные процесса, исполняемый код и т. Д.).), владелец страницы и т. д. Эти страницы можно также широко разделить на две категории - страницы файловой системы или кэш страниц (в котором находятся все данные, считываемые / записываемые в вашу файловую систему) и страницы, принадлежащие процессам.

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

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

Установив swappiness = 0, вы говорите ядру linux не обмениваться страницами, принадлежащими процессам. Если вместо этого установить swappiness = 100, вы указываете ядру более агрессивно менять страницы, принадлежащие процессам. Чтобы настроить вашу систему, попробуйте изменить параметр swappiness с шагом 10, отслеживая производительность и подкачку страниц при каждой настройке с помощью команды "vmstat". Сохраняйте настройку, которая дает вам лучшие результаты. Не забудьте сделать это тестирование в часы максимальной нагрузки.:)

Для приложений базы данных обычно рекомендуется swappiness = 0. (Даже в этом случае проверьте различные параметры в своих системах, чтобы получить хорошее значение).

Рекомендации:
http://www.linuxvox.com/2009/10/what-is-the-linux-kernel-parameter-vm-swappiness/
http://www.pythian.com/news/1913/

Другие вопросы по тегам