У нас есть довольно сложный стек LAMP, на котором работает множество веб-сайтов, использующих Litespeed вместо Apache на Centos 5.
После того, как все запущено и работает, использование памяти системой становится достаточно стабильным - большая часть памяти занята кешами MySQL, а остальная часть используется для Litespeed (веб-сервер и lsphp5) и операций, связанных с ОС.
Время от времени мы наблюдаем огромное сокращение памяти, потребляемой процессами (около 3:55 и 9:25 на скриншоте ниже).
Все продолжает работать нормально - фактически, производительность увеличивается. Я проверил убийцу OOM и не вижу, чтобы какие-либо процессы были убиты, а кеши MySQL появиться чтобы оставаться неповрежденным (например, без отклонений в частоте попаданий MyISAM или InnoDB).
Итак, мой вопрос: «Как мы можем определить, какая память освобождается (например, каким процессам она принадлежит)?»
Обратите внимание: идеально, если мы можем провести этот анализ задним числом (например, на исторических данных). Однако я также был бы рад найти решение, которое мы можем предложить для отслеживания будущего использования памяти.
Вы можете попробовать использовать smem
. Он должен быть довольно простым для компиляции и использования, если он не был предварительно упакован для вашей ОС.
Вы можете собирать статистику по процессам с помощью smemcap
утилита и обрабатывать их где-то еще, или напрямую сообщать вашему решению для мониторинга, анализируя данные.
Также есть старый добрый SNMP. В ХОСТ-РЕСУРСЫ-МИБ есть таблица, которая может быть полезна.
hrSWRunPerfMem OBJECT-TYPE
SYNTAX KBytes
ACCESS read-only
STATUS mandatory
DESCRIPTION
"The total amount of real system memory allocated
to this process."
::= { hrSWRunPerfEntry 2 }
Однако сложнее всего сделать с предоставленными данными корреляцию.
Проверьте этот пример использования zabbix
.