Сегодня я заметил, что нашел следующую вещь:
Как вы видите, ОЗУ почти наполовину свободно, а использование пространства подкачки очень высоко. Исходя из моих знаний из учебника, я думал, что ОС Linux пытается максимально эффективно использовать ОЗУ, и когда ОЗУ становится мало, она перемещает некоторые из наименее используемых страниц из ОЗУ в пространство подкачки.
Может ли кто-нибудь объяснить мне, если мои теоретические знания неверны, и объяснить, как это на самом деле работает в мире Linux.
решение1
Хотя верно, что ядро использует swap, даже если память может быть еще осталась, использование более двух третей может быть показателем того, что исторически сервер мог исчерпать память, и именно поэтому он начал подкачку. Я бы сопоставил использование swap с использованием памяти в отчетах sar, чтобы определить, достаточно ли оперативной памяти в системе. Я бы также проверил dmesg или логи, чтобы определить, действительно ли сервер исчерпал память и включился oom-killer.
решение2
Ядро Linux начинает выгружать страницы памяти, даже если у вас много свободной оперативной памяти. Вы можете настроить это поведение, установив пользовательскую подкачку.
http://en.wikipedia.org/wiki/Обмен
Для серверов я бы рекомендовал установить swappiness на 1, если у вас всегда достаточно памяти для вашей рабочей нагрузки. Для рабочих станций я бы рекомендовал использовать значение по умолчанию 60.
# check the current value
cat /proc/sys/vm/swappiness
60
# swappiness = 1 (swap only if necessary)
echo 1 > /proc/sys/vm/swappiness
# or use sysctl
sysctl -w vm.swappiness=1
Сделайте настройку постоянной в /etc/sysctl.conf, установив
vm.swappiness=1
и перезагрузите его с помощью
sysctl -w
решение3
Некоторые приложения, к сожалению, напрямую забивают swap, намеренно пропуская RAM. Посмотрим на тебя, Chrome (и в какой-то момент Photoshop). Единственный способ заставить эти приложения не использовать swap — запустить их без раздела swap. Даже swappiness 0 IIRC все равно предоставит им доступ, поскольку они явно требуют этого.
Изменение swappiness, как указано выше, будет работать для всего остального. Я бы предложил значение 10-20 вместо 1.