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

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

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

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

Ответы [ 2 ]

8 голосов
/ 20 марта 2011

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

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

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

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

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

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

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

5 голосов
/ 08 января 2010

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/

...