プロセスのピークメモリ使用量


12

toppsなどのツールを使用すると、現在プロセスに割り当てられているメモリの量を取得できますが、プロセスの作成時または特定の時間間隔でプロセスに割り当てられたメモリの最大量を測定することに興味があります。見つける方法に関する提案はありますか?

回答:


22

特定のプロセスのピークメモリ使用量は、次の場所で取得できます。

grep VmPeak /proc/$PID/status  

($ PIDを実際のプロセスIDに変更します)。

VmPeakは、プロセスが開始されてから使用したメモリの最大量です。

プロセスのメモリ使用量を経時的に追跡するには、muninと呼ばれるツールを使用して追跡し、経時的なメモリ使用量のグラフを表示できます。

Muninにはシステムリソースを追跡するための多くのデフォルトプラグインが付属していますが、ピークメモリ使用量を追跡するプラグインは付属していません。幸いなことに、プラグインを非常に簡単に作成できます。

これは、ApacheプロセスのVmPeak、VmRSS、およびVmSizeのメモリ使用量を追跡するmuninプラグインの例です。これをニーズに合わせて変更できます(正しいPIDファイルをポイントし、必要に応じてコンポーネント名を変更します)。

出力されるグラフは次のようになります(この例ではVmPeakとVmSizeは同じなので、そのうちの1つだけが表示されます)。

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 timeを呼び出すときには、/ usr / bin / time -v commandのように、GNU timeへのフルパスを指定する必要がある場合があります。さらに、GNU timeの古いバージョンには、結果が誤って4倍になるバグがあることに注意してください。たとえば、次のリンクを確認してください。https//bugzilla.redhat.com/show_bug.cgi?id = 702826


0

スローダウンに対処できる場合は、時間の経過とともにヒープ(および使用時の一般的なメモリ)割り当てをプロファイルできるため、この目的valgrindためののmassifツールを見つけることができます--pages-as-heap=yes

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.