Відповіді:
Пікове використання пам'яті для певного процесу можна отримати за адресою:
grep VmPeak /proc/$PID/status
(Змініть $ PID на фактичний ідентифікатор процесу, який ви шукаєте).
VmPeak - це максимальний об'єм пам'яті, який процес використовував з моменту його запуску.
Для того, щоб відслідковувати використання пам'яті процесу в часі, ви можете скористатися інструментом під назвою munin для відстеження та показати гарний графік використання пам'яті за часом.
Munin оснащений багатьма плагінами за замовчуванням для відстеження системних ресурсів, однак він не постачається з плагіном для відстеження пікового використання пам'яті - на щастя, надзвичайно просто написати плагін для нього.
Ось приклад плагін munin для відстеження використання VmPeak, VmRSS та VmSize пам'яті для процесу apache. Ви можете змінити це відповідно до ваших потреб (просто вкажіть на правий PID-файл та змініть ім'я компонента за потребою).
Виведений ним графік виглядає приблизно так (VmPeak і VmSize однакові в цьому прикладі, тому ви бачите лише один з них):
Примітка. Це лише стежить за основним процесом apache і не показує використання пам'яті його дочірніх процесів.
#!/bin/bash
#
# Parameters:
#
# config (required)
# autoconf (optional - used by munin-config)
#
COMPONENT_NAME="Apache"
COMPONENT_PID_FILE="/var/run/apache2.pid"
if [ "$1" = "autoconf" ]; then
if [ -r /proc/stat ]; then
echo yes
exit 0
else
echo "no (/proc/stat not readable)"
exit 1
fi
fi
if [ "$1" = "config" ]; then
echo "graph_title $COMPONENT_NAME memory usage"
echo 'graph_vlabel'
echo "graph_category Processes"
echo "graph_info This graph shows the amount of memory used by the $COMPONENT_NAME processes"
echo "${COMPONENT_NAME}_vmpeak.label $COMPONENT_NAME VmPeak"
echo "${COMPONENT_NAME}_vmsize.label $COMPONENT_NAME VmSize"
echo "${COMPONENT_NAME}_vmrss.label $COMPONENT_NAME VmRSS"
echo 'graph_args --base 1024'
exit 0
fi
check_memory ()
# $1 - PID location
# $2 - process_label
{
pid_location=$1
process_label=$2
read pid < $pid_location
procpath="/proc/$pid/status"
if [ ! -e $procpath ] || [ -z $pid ]
then
echo "${process_label}_vmpeak.value 0"
echo "${process_label}_vmsize.value 0"
echo "${process_label}_vmrss.value 0"
exit 0
fi
VmPeak=`grep VmPeak /proc/$pid/status|awk '{print $2}'`
VmSize=`grep VmSize /proc/$pid/status|awk '{print $2}'`
VmRSS=`grep VmRSS /proc/$pid/status|awk '{print $2}'`
echo "${process_label}_vmpeak.value $(( $VmPeak * 1024 ))"
echo "${process_label}_vmsize.value $(( $VmSize * 1024 ))"
echo "${process_label}_vmrss.value $(( $VmRSS * 1024 ))"
}
check_memory $COMPONENT_PID_FILE $COMPONENT_NAME
Є інструменти, якими ви можете скористатися під час запуску процесу, які дають підсумок використання пам'яті, коли процес закінчується:
Час GNU також дає пікове використання пам'яті при виконанні з опцією -v. Зауважте, що bash також має вбудовану команду під назвою time, тому вам може знадобитися вказати повний шлях до часу GNU при виклику на нього, наприклад, команда / usr / bin / time -v . Більше того, будьте уважні, що у старих версіях часу GNU є помилка, коли результати неправильно множать на 4, наприклад, перевірте наступне посилання: https://bugzilla.redhat.com/show_bug.cgi?id=702826
Якщо ви зможете впоратися з уповільненням, ви можете знайти для цього valgrind
інструмент масиву масиву, який може з часом профілювати кучу (і загальну пам'ять при використанні --pages-as-heap=yes
).