2009-12-08 3 views
26

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

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

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

+0

Это выглядит похоже на этот вопрос: http://stackoverflow.com/questions/131303/linux-how-to-measure-actual-memory-usage-of-an-application-or-process – monksy

+0

ли ваше приложение, по крайней мере, работает некоторое время перед сбоем? –

+0

Да, предыдущие версии работают нормально в той же системе. Теперь мы разрабатываем новую версию и начинаем сталкиваться с этой проблемой. – bialix

ответ

23

Небольшой сценарий, как

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

действительно, это очень близко к тому, что мне нужно. Я могу добавить временные метки. – bialix

+9

'free -s 1> memory.log'; это не связано с затратами на запуск нового процесса каждую секунду.Тем не менее, у него нет метки времени. (Я знаю, что это старый пост, но я искал то же самое, и другие будут). –

+1

В некоторых версиях бесплатно необходимо указать количество раз, которое вы хотите распечатать, с -c из-за ошибки. В противном случае он показывает ошибку: секунда аргумента '1 'не удалась – Sputnik

2

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

vmstat X >> mylogfile 

в сценарий запуска. Поскольку ваше приложение уже загружено, вы можете просто добавить эту строку в конец скрипта инициализации, которое уже использует ваше приложение. (где Х # секунд между логах)

+0

Спасибо за подсказку, хотя мне нужно чаще регистрировать данные, а затем каждую секунду. – bialix

3

Там это программа под названием

sar 

на * NIX систем. Вы можете попытаться использовать это для мониторинга использования памяти. Он измеряет через равные промежутки времени. Do a

man sar 

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

+1

Определенно более мощный, чем другие предлагаемые решения, хотя и немного более громоздкие для настройки. – Ale

4

Я думаю, добавив запись кронтаб будет достаточно

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

Есть другие инструменты, такие как SeaLion, New Relic, Server Density и т.д., которые будут почти сделать то же самое, но гораздо проще в установке и настройке. Моим любимым является SeaLion, поскольку он является бесплатным, а также дает потрясающий график времени для сырых выходов общих команд Linux.

+0

+1 для Sealion, самая быстрая регистрация/настройка EVER. Все, что я думаю, заняло у меня около 6 секунд - я набрал свой адрес электронной почты, пароль. Вложив одну команду в ssh и boom, появилась моя статистика. – rgvcorley

17

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

#!/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 
Смежные вопросы