Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Маленький script как

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

Ответ 2

Следующий 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

Ответ 3

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

sar

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

man sar

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

Ответ 4

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

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

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

Ответ 5

Вы можете добавить что-то вроде

vmstat X >> mylogfile

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

Ответ 6

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

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

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

Ответ 7

Так что я знаю, что опаздываю к этой игре, но я просто придумал этот ответ, поскольку мне нужно было это сделать, и я действительно не хотел дополнительных полей, которые 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