进程的峰值内存使用率


12

诸如topps之类的工具可以给我当前分配给进程的内存量,但是我有兴趣测量自创建以来或在给定时间间隔内分配给进程的最大内存量。关于如何找出任何建议?

Answers:


22

您可以在以下位置获得某个进程的峰值内存使用率:

grep VmPeak /proc/$PID/status  

(将$ PID更改为您要查找的实际进程ID)。

VmPeak是该进程自启动以来已使用的最大内存量。

为了跟踪一段时间内某个进程的内存使用情况,可以使用一个名为munin的工具进行跟踪,并向您显示一段时间内的内存使用情况的图表。

Munin附带了许多默认插件来跟踪系统资源,但是它没有附带插件来跟踪Peak内存使用情况-幸运的是,为它编写插件非常容易。

这是一个munin插件的示例,用于跟踪apache进程的VmPeak,VmRSS和VmSize内存使用情况。您可以根据需要进行更改(只需指向正确的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

在启动进程时,可以使用一些工具,这些工具可以在进程完成后为您提供内存使用情况的摘要:

当使用-v选项执行时,GNU时间还会给出峰值内存使用情况。请注意,bash还具有一个称为time的内置命令,因此在调用它时可能需要指定GNU time的完整路径,例如/ usr / bin / time -v命令。此外,请注意较早的GNU时间版本存在一个错误,该错误会将结果错误地乘以4,例如,检查以下链接:https : //bugzilla.redhat.com/show_bug.cgi?id=702826


0

如果您可以应对这种速度下降的情况,那么您可能会找到valgrind的massif工具来解决此问题,因为它可以--pages-as-heap=yes随时间推移分析堆(以及使用时的常规内存)分配。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.