Как записать потребление памяти в 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