Bir işlemin en yüksek bellek kullanımı


12

Top ve ps gibi araçlar bana şu anda bir işleme ayrılan bellek miktarını verebilir, ancak bir işlem için ya da oluşturulmasından bu yana ayrılan maksimum bellek miktarını ölçmekle ilgileniyorum. Nasıl bulacağınız konusunda herhangi bir öneriniz var mı?

Yanıtlar:


22

Belirli bir işlemin en yüksek bellek kullanımını şu adresten alabilirsiniz:

grep VmPeak /proc/$PID/status  

($ PID'yi aradığınız gerçek işlem kimliğiyle değiştirin).

VmPeak, işlemin başlatıldığından beri kullandığı maksimum bellek miktarıdır.

Bir işlemin zaman içindeki bellek kullanımını izlemek için, izlemek için munin adlı bir araç kullanabilir ve zaman içinde bellek kullanımının güzel bir grafiğini gösterebilirsiniz.

Munin, sistem kaynaklarını izlemek için birçok varsayılan eklenti ile birlikte gelir, ancak Peak bellek kullanımını izlemek için bir eklenti ile birlikte gelmez - neyse ki, bunun için bir eklenti yazmak son derece kolaydır.

Apache işlemi için VmPeak, VmRSS ve VmSize bellek kullanımını izlemek için bir munin eklentisi örneği. Bunu ihtiyaçlarınıza göre değiştirebilirsiniz (sadece doğru PID dosyasını işaret edin ve bileşen adını gerektiği gibi değiştirin).

Çıkardığı grafik şöyle görünür (VmPeak ve VmSize bu örnekte aynıdır, bu nedenle bunlardan yalnızca birini görürsünüz):

Apache Bellek Kullanım Grafiği - Bu yayında önerilen eklenti kullanılarak oluşturulur

Not: Bu yalnızca ana apache işlemini izler ve alt süreçlerinin bellek kullanımını göstermez.

#!/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

Bir işlemi başlatırken, işlem bittiğinde size bellek kullanımının bir özetini veren araçlar vardır:

GNU süresi ayrıca -v seçeneği ile yürütüldüğünde en yüksek bellek kullanımını sağlar. Bash'ın ayrıca time adında yerleşik bir komutu olduğunu unutmayın, bu nedenle çağırırken GNU saatinin tam yolunu belirtmeniz gerekebilir, örn. / Usr / bin / time -v komutu . Dahası, GNU süresinin eski sürümlerinde sonuçların 4 ile yanlış çarpıldığı bir hata olduğunu unutmayın, örneğin, aşağıdaki bağlantıyı kontrol edin: https://bugzilla.redhat.com/show_bug.cgi?id=702826


0

Yavaşlama ile başa çıkabiliyorsanız, zaman içinde yığın (ve kullanırken genel bellek ) profilini oluşturabildiği için bu amaç için valgrindmasif aracını bulabilirsiniz --pages-as-heap=yes.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.