it-swarm-ko.tech

프로세스의 최대 메모리 사용량

topps와 같은 도구는 현재 프로세스에 할당 된 메모리 양을 제공 할 수 있지만 프로세스에 할당 된 최대 메모리 양을 측정하는 데 관심이 있습니다. 생성 또는 주어진 시간 간격. 알아내는 방법에 대한 제안이 있습니까?

12
davitenio

다음에서 특정 프로세스의 최대 메모리 사용량을 확인할 수 있습니다.

grep VmPeak /proc/$PID/status  

($ PID를 찾고있는 실제 프로세스 ID로 변경하십시오).

VmPeak은 프로세스가 시작된 이후 사용한 최대 메모리 양입니다.

시간 경과에 따른 프로세스의 메모리 사용량을 추적하려면 munin 이라는 도구를 사용하여 시간 경과에 따른 메모리 사용량의 Nice 그래프를 추적하고 표시 할 수 있습니다.

Munin은 시스템 리소스를 추적하기 위해 많은 기본 플러그인을 제공하지만 Peak 메모리 사용량을 추적하는 플러그인은 제공되지 않습니다. 다행히도 플러그인을 작성하기가 매우 쉽습니다.

다음은 Apache 프로세스에 대해 VmPeak, VmRSS 및 VmSize 메모리 사용량을 추적하는 munin 플러그인의 예입니다. 필요에 맞게 변경할 수 있습니다 (오른쪽 PID 파일을 가리키고 필요에 따라 구성 요소 이름을 변경).

출력되는 그래프는 다음과 같습니다 (이 예제에서는 VmPeak 및 VmSize가 동일하므로 그중 하나만 표시됩니다).

Apache Memory Usage Graph - Generated using the plugin proposed in this post

참고 : 이것은 기본 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
22
Tom Feiner

프로세스가 완료되면 메모리 사용량에 대한 요약을 제공하는 프로세스를 시작할 때 사용할 수있는 도구가 있습니다.

GNU time 은 -v 옵션으로 실행될 때 최대 메모리 사용량을 제공합니다. bash에는 time이라는 내장 명령도 있으므로 호출 할 때 GNU time)에 대한 전체 경로를 지정해야 할 수도 있습니다. 예 : /usr/bin/time -v command . 또한 GNU time의 이전 버전에는 결과에 4를 잘못 곱하는 버그가 있습니다. 예 : 다음 링크를 확인하십시오 : https://bugzilla.redhat.com/show_bug.cgi?id=702826

3
davitenio

속도 저하에 대처할 수 있다면 시간이 지남에 따라 힙 (--pages-as-heap=yes를 사용하는 경우 일반 메모리) 할당을 프로파일 링 할 수 있으므로이 목적을 위해 valgrind의 massif 도구 를 찾을 수 있습니다.

0
Anon