Пиковое использование памяти процесса

12

Такие инструменты, как top и ps, могут дать мне объем памяти, выделенный в данный момент процессу, но я заинтересован в измерении максимального объема памяти, выделенного для процесса, либо с момента его создания, либо за определенный промежуток времени. Любые предложения о том, как узнать?

davitenio
источник

Ответы:

22

Вы можете получить пиковое использование памяти определенного процесса, в:

grep VmPeak /proc/$PID/status  

(Измените $ PID на фактический идентификатор процесса, который вы ищете).

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

Чтобы отслеживать использование памяти процессом с течением времени, вы можете использовать инструмент munin для отслеживания и отображения хорошего графика использования памяти с течением времени.

Munin поставляется со многими плагинами по умолчанию для отслеживания системных ресурсов, однако он не поставляется с плагином для отслеживания пикового использования памяти - к счастью, очень просто написать плагин для него.

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

График, который он выводит, выглядит следующим образом (VmPeak и VmSize в этом примере одинаковы, поэтому вы видите только один из них):

Apache Memory Usage Graph - генерируется с помощью плагина, предложенного в этом посте

Примечание: это только контролирует основной процесс 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

davitenio
источник
0

Если вы справитесь с замедлением, вы можете найти для этого valgrindинструмент массива, так как он может профилировать --pages-as-heap=yesраспределение кучи (и общей памяти при использовании ) с течением времени.

скоро
источник