
Каждую субботу, по неизвестным мне причинам, один из моих серверов испытывает всплеск использования свопа. Это не обязательно проблема, так как свободной памяти достаточно, но я все равно хотел бы понять, что происходит.
В частности, меня озадачивает ситуация, когда swap увеличивается с 2% до 100% использования в течение примерно 20 минут. Однако, когда это происходит, похоже, что скорость swap не увеличивается. На сервере есть раздел swap размером 8 ГБ, поэтому я бы ожидал скорости выгрузки страниц в тысячи страниц в секунду, чтобы заполнить доступное пространство.
Более того, похоже, что в это время не наблюдается никаких скачков в использовании памяти, которые могли бы привести к подкачке сервера.
Может ли кто-нибудь дать объяснение наблюдаемому поведению? Сервер — RHEL 4.8 (старый, я знаю) с ядром 2.6.9. Я включил некоторые выходные данные sar ниже.
Использование свопа увеличивается с 2% до 100% примерно за 20 минут:
$ sar -r -f sa12
....
06:00:01 PM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
06:10:01 PM 4583856 11847032 72.10 79676 319804 8178056 207864 2.48 19816
06:20:01 PM 4720904 11709984 71.27 38840 225108 8178400 207520 2.47 19124
06:30:02 PM 4839160 11591728 70.55 1404 144948 1968152 6417768 76.53 6227068
06:40:02 PM 4827016 11603872 70.62 1640 145484 10232 8375688 99.88 8182968
06:50:02 PM 4836376 11594512 70.57 844 123304 60 8385860 100.00 8193044
07:00:01 PM 4825764 11605124 70.63 920 128108 4516 8381404 99.95 8188680
....
Вот статистика обмена за тот же период.
$ sar -W -f sa12
....
06:00:01 PM pswpin/s pswpout/s
06:10:01 PM 0.00 0.00
06:20:01 PM 0.00 0.00
06:30:02 PM 0.68 0.00
06:40:02 PM 1.85 0.00
06:50:02 PM 5.07 0.00
07:00:01 PM 8.62 0.00
....
решение1
Интересный факт: использование swap увеличилось с 0 до 8 ГБ... при этом ни одного байта не было записано на диск (sar pswpout/s
показывает 0). Поэтому я предполагаю, что swap был выделен/зарезервирован, но не потреблен/использован.
Я предполагаю, что ваш сервер использует vm.overcommit_memory=2
(читайvm.overcommit_memory документация,vm overcommit-accounting). В этом случае каждый выделенный байт считается использованным. [Я не проверял].
Вы также можете прочитать веткуLinux: Общий объем используемого свопа = объем свопа, используемый процессами + ??.
решение2
Это не дает прямого ответа на ваш вопрос, но следующий скрипт может быть полезен в вашем расследовании. Он позволяет узнать, сколько пространства подкачки использует каждый отдельный процесс:
Узнайте, какие процессы используют подкачку
Если у вас есть приблизительное представление о том, когда начнется подкачка, вы можете настроить cron на запуск этого скрипта примерно в это время.