Назад | Перейти на главную страницу

Как определить, какая память была освобождена

У нас есть довольно сложный стек 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.