Ответ 1
Маленький script как
rm memory.log
while true; do free >> memory.log; sleep 1; done
Есть ли готовое к использованию решение для регистрации потребления памяти с самого начала системы? Я хотел бы записать данные в простой текстовый файл или в какую-нибудь базу данных, чтобы потом проанализировать его.
Я работаю над встроенной системой на базе Linux 2.4. Мне нужно отладить проблему, связанную с потреблением памяти. Мое приложение автоматически запускается при каждом запуске системы. Мне нужен способ получить данные с временными метками с регулярными интервалами (как можно чаще), чтобы я мог отслеживать проблемы.
Симптомы моей проблемы: при запуске системы она запустила мое основное приложение и графический интерфейс для визуализации основных параметров системы. GUI на основе GTK + (X-сервер). Если я отключу GUI и X-сервер, то мое приложение работает нормально. Если я включу GUI и X-сервер, это не сработает, если на материнской плате установлено 256 MiB или 512 Мбайт физической памяти. Если у меня установлено 1 ГБ установленной памяти, все в порядке.
Маленький script как
rm memory.log
while true; do free >> memory.log; sleep 1; done
Следующий script печатает отметки времени и заголовок.
#!/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
Там есть программа под названием
sar
on * nix. Вы можете попытаться использовать это для мониторинга использования памяти. Он измеряет через равные промежутки времени. Сделайте
man sar
для более подробной информации. Я думаю, что опция -r для измерения памяти, -i, чтобы указать желаемый интервал.
Я думаю, что добавление записи crontab будет достаточно
*/5 * * * * free -m >> some_output_file
Существуют и другие инструменты, такие как SeaLion, Новая реликвия, Плотность сервера и т.д., что почти сделает то же самое, но гораздо проще установить и настроить. Моим любимым является SeaLion, поскольку он является бесплатным, а также дает потрясающий график времени для сырых выходов общих команд Linux.
Вы можете добавить что-то вроде
vmstat X >> mylogfile
в начало script. Поскольку ваше приложение уже загружено, вы можете просто добавить эту строку в конец инициализации script, которую уже использует ваше приложение. (где X - количество секунд между сообщениями журнала)
Я большой поклонник регистрации всего, и мне полезно знать, какие процессы используют память и сколько использует каждый процесс (а также общую статистику). Следующая команда записывает верхнюю распечатку, упорядоченную по потреблению памяти каждые 0,5 секунды:
top -bd0.5 -o +%MEM > memory.log
Просто обратите внимание, что файл журнала будет расти намного быстрее, чем если бы вы сохраняли только общую статистику использования памяти, поэтому убедитесь, что у вас не осталось свободного места на диске.
Так что я знаю, что опаздываю к этой игре, но я просто придумал этот ответ, поскольку мне нужно было это сделать, и я действительно не хотел дополнительных полей, которые 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
Выполняя эту операцию, мы фильтруем буквально до номера, использованного до used
.Пользователь действительно может изменить 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