Как записать потребление памяти в Linux?

Есть ли готовое решение для регистрации потребления памяти с момента запуска системы? Я хотел бы записать данные в простой текстовый файл или в какую-либо базу данных, чтобы потом проанализировать их.

Я работаю над встроенной системой Linux 2.4. Мне нужно отладить проблему, связанную с потреблением памяти. Мое приложение автоматически запускается при каждом запуске системы. Мне нужен способ получать данные с метками времени через регулярные интервалы (как можно чаще), чтобы я мог отследить проблему.

Симптомы моей проблемы: при запуске системы запускаются мое основное приложение и графический интерфейс для визуализации основных параметров системы. Графический интерфейс на основе GTK+ (X-сервер). Если я отключаю GUI и X-сервер, тогда мое приложение работает нормально. Если я включаю GUI и X-сервер, он не работает, если на материнской плате установлено 256 МБ или 512 МБ физической памяти. Если у меня установлен 1 ГиБ памяти, то все в порядке.

8 ответов

Решение

Маленький скрипт вроде

rm memory.log
while true; do free >> memory.log; sleep 1; done

Следующий скрипт печатает метки времени и заголовок.

#!/bin/bash -e

echo "      date     time $(free -m | grep total | sed -E 's/^    (.*)/\1/g')"
while true; do
    echo "$(date '+%Y-%m-%d %H:%M:%S') $(free -m | grep Mem: | sed 's/Mem://g')"
    sleep 1
done

Вывод выглядит так (проверено на Ubuntu 15.04, 64-битная версия).

      date     time          total       used       free     shared    buffers     cached
2015-08-01 13:57:27          24002      13283      10718        522        693       2308
2015-08-01 13:57:28          24002      13321      10680        522        693       2308
2015-08-01 13:57:29          24002      13355      10646        522        693       2308
2015-08-01 13:57:30          24002      13353      10648        522        693       2308

Я большой поклонник регистрации всего, и мне полезно знать, какие процессы используют память и сколько использует каждый процесс (а также общую статистику). Следующая команда записывает верхнюю распечатку, упорядоченную по потреблению памяти каждые 0,5 секунды:

top -bd0.5 -o +%MEM > memory.log

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

Там программа называется

sar

в *nix системах. Вы можете попытаться использовать это для мониторинга использования памяти. Измерения проводятся через равные промежутки времени. Сделать

man sar

Больше подробностей. Я думаю, что опция -r для измерения памяти, -i указать желаемый интервал.

Я думаю, что добавления записи в crontab будет достаточно

*/5 *  *  *  *  free -m >> some_output_file

Существуют и другие инструменты, такие как SeaLion, New Relic, Server Density и т. Д., Которые будут почти такими же, но гораздо проще в установке и настройке. Мой фаворит - SeaLion, так как он бесплатный, а также дает потрясающий вид на временную шкалу необработанных выводов общих команд linux.

Вы могли бы поставить что-то вроде

vmstat X >> mylogfile

в сценарий запуска. Поскольку ваше приложение уже запущено, вы можете просто добавить эту строку в конец сценария инициализации, который ваше приложение уже использует. (где X - количество секунд между сообщениями журнала)

Чтобы периодически эффективно регистрировать использование памяти, я объединил здесь другой ответ с методом, позволяющим сохранять только процессы, использующие память из топ-K.

top -bd 1.5 -o +%MEM | grep "load average" -A 9 > memory_usage.log

Эта команда будет записывать каждые 1,5 секунды информацию о верхнем заголовке и 3 процесса, потребляющих наибольшее количество памяти (для информации заголовка существует 6-строчное смещение). Это экономит много места на диске при записи. topИнформация для каждого процесса.

Итак, я знаю, что опаздываю на эту игру, но я только что придумал этот ответ, так как мне нужно было это сделать, и мне действительно не нужны дополнительные поля, которые vmstat, free и т.д... все будет выводиться без лишней фильтрации. Итак, вот ответ, который я придумал:

top -bd 0.1 | grep 'KiB Mem' | cut -d' ' -f10 > memory.txt

ИЛИ:

top -bd 0.1 | grep 'KiB Mem' | cut -d' ' -f10 | tee memory.txt

стандартный вывод из top когда grep общаясь с Kib Mem является:

KiB Mem : 16047368 total,  8708172 free,  6015720 used,  1323476 buff/cache

Выполняя этот сквозной разрез, мы фильтруем буквально только число до использования

Пользователь действительно может изменить 0.1 на другой номер, чтобы использовать разные частоты дискретизации захвата. В моем случае я хотел использоватьtop также потому, что вы можете запускать статистику памяти быстрее, чем 1 секунда за захват, как вы можете видеть здесь, я хотел собирать статистику каждые 1/10 секунды.

ПРИМЕЧАНИЯ. Оказывается, что проводка черезcut вызывают МАССИВНУЮ задержку передачи чего-либо в файл. Как мы позже выяснили, гораздо быстрее исключитьcut во время сбора данных, а затем выполните команду вырезания для выходного файла позже. Кроме того, в наших тестах не было необходимости в отметках времени.

Таким образом, это выглядит следующим образом:

Начать ведение журнала:

top -bd 0.1 | grep 'KiB Mem' | tee memory_raw.txt

Выйти из журнала:

ctrl-z (to exit logging)

Фильтр:

2 уровня отсечения (фильтрации) сначала по запятой, затем по пробелу. Это связано с выравниваниемtop и обеспечивает более чистый вывод:

cut memory_raw -d',' -f3 | tee memory_used_withlabel.txt
cut memory_used_withlabel.txt -d' ' -f3 | tee memory_used.txt
Другие вопросы по тегам