Пік використання пам'яті процесу


12

Такі інструменти, як top та ps, можуть дати мені обсяг пам’яті, який зараз виділяється на процес, але мені цікаво виміряти максимальний обсяг пам’яті, виділений для процесу, з моменту його створення або через певний часовий інтервал. Будь-які пропозиції, як дізнатися?

Відповіді:


22

Пікове використання пам'яті для певного процесу можна отримати за адресою:

grep VmPeak /proc/$PID/status  

(Змініть $ PID на фактичний ідентифікатор процесу, який ви шукаєте).

VmPeak - це максимальний об'єм пам'яті, який процес використовував з моменту його запуску.

Для того, щоб відслідковувати використання пам'яті процесу в часі, ви можете скористатися інструментом під назвою munin для відстеження та показати гарний графік використання пам'яті за часом.

Munin оснащений багатьма плагінами за замовчуванням для відстеження системних ресурсів, однак він не постачається з плагіном для відстеження пікового використання пам'яті - на щастя, надзвичайно просто написати плагін для нього.

Ось приклад плагін munin для відстеження використання VmPeak, VmRSS та VmSize пам'яті для процесу apache. Ви можете змінити це відповідно до ваших потреб (просто вкажіть на правий PID-файл та змініть ім'я компонента за потребою).

Виведений ним графік виглядає приблизно так (VmPeak і VmSize однакові в цьому прикладі, тому ви бачите лише один з них):

Графік використання пам'яті Apache - Створений за допомогою плагіна, запропонованого в цій публікації

Примітка. Це лише стежить за основним процесом 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

3

Є інструменти, якими ви можете скористатися під час запуску процесу, які дають підсумок використання пам'яті, коли процес закінчується:

Час GNU також дає пікове використання пам'яті при виконанні з опцією -v. Зауважте, що bash також має вбудовану команду під назвою time, тому вам може знадобитися вказати повний шлях до часу GNU при виклику на нього, наприклад, команда / usr / bin / time -v . Більше того, будьте уважні, що у старих версіях часу GNU є помилка, коли результати неправильно множать на 4, наприклад, перевірте наступне посилання: https://bugzilla.redhat.com/show_bug.cgi?id=702826


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.