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

StackOverflow https://stackoverflow.com/questions/2029015

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Если вы установите swappiness равным 100, это даст anon модификатор 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/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top