Szczytowe użycie pamięci przez proces

12

Narzędzia takie jak top i ps mogą dać mi ilość pamięci aktualnie przydzielonej procesowi, ale jestem zainteresowany mierzeniem maksymalnej ilości pamięci przydzielonej procesowi od momentu jego utworzenia lub w określonym przedziale czasu. Wszelkie sugestie, jak się dowiedzieć?

davitenio
źródło

Odpowiedzi:

22

Maksymalne wykorzystanie pamięci dla określonego procesu można uzyskać pod adresem:

grep VmPeak /proc/$PID/status  

(Zmień $ PID na rzeczywisty identyfikator procesu, którego szukasz).

VmPeak to maksymalna ilość pamięci, którą proces zużył od momentu uruchomienia.

Aby śledzić zużycie pamięci przez proces w czasie, możesz użyć narzędzia o nazwie munin, aby śledzić i wyświetlać ładny wykres zużycia pamięci w czasie.

Munin jest wyposażony w wiele domyślnych wtyczek do śledzenia zasobów systemowych, jednak nie ma wtyczki do śledzenia maksymalnego wykorzystania pamięci - na szczęście bardzo łatwo jest napisać dla niej wtyczkę.

Oto przykład wtyczki Munin do śledzenia zużycia pamięci VmPeak, VmRSS i VmSize dla procesu apache. Możesz to zmienić w zależności od potrzeb (po prostu wskaż odpowiedni plik PID i zmień nazwę komponentu w razie potrzeby).

Wykres, który wyprowadza, wygląda następująco (VmPeak i VmSize są takie same w tym przykładzie, więc widzisz tylko jeden z nich):

Wykres wykorzystania pamięci Apache - generowany przy użyciu wtyczki zaproponowanej w tym poście

Uwaga: monitoruje to tylko główny proces Apache i nie pokazuje wykorzystania pamięci przez procesy potomne.

#!/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
Tom Feiner
źródło
3

Istnieją narzędzia, których można użyć podczas uruchamiania procesu, które dają podsumowanie zużycia pamięci po zakończeniu procesu:

Czas GNU daje również szczytowe użycie pamięci, gdy jest wykonywane z opcją -v. Zauważ, że bash ma również wbudowaną komendę o nazwie czas, więc może być konieczne podanie pełnej ścieżki do czasu GNU podczas jej wywoływania, np . Komenda / usr / bin / time -v . Ponadto uważaj, aby starsze wersje czasu GNU miały błąd, w którym wyniki są niepoprawnie pomnożone przez 4, np. Sprawdź następujący link: https://bugzilla.redhat.com/show_bug.cgi?id=702826

davitenio
źródło
0

Jeśli poradzisz sobie ze spowolnieniem, możesz znaleźć valgrindnarzędzie masywne do tego celu, ponieważ może ono profilować stertę (i ogólną pamięć podczas używania --pages-as-heap=yes) alokacji w czasie.

Zaraz
źródło