การใช้หน่วยความจำสูงสุดของกระบวนการ


12

เครื่องมือเช่นtopและpsสามารถให้ฉันจำนวนหน่วยความจำที่จัดสรรให้กับกระบวนการในขณะนี้ แต่ฉันสนใจที่จะวัดจำนวนหน่วยความจำสูงสุดที่จัดสรรให้กับกระบวนการอย่างใดอย่างหนึ่งตั้งแต่การสร้างหรือในช่วงเวลาที่กำหนด ข้อเสนอแนะเกี่ยวกับวิธีการหา?

คำตอบ:


22

คุณสามารถรับการใช้งานหน่วยความจำสูงสุดของกระบวนการบางอย่างได้ที่:

grep VmPeak /proc/$PID/status  

(เปลี่ยน $ PID เป็นรหัสกระบวนการจริงที่คุณต้องการ)

VmPeak คือจำนวนหน่วยความจำสูงสุดที่กระบวนการใช้นับตั้งแต่เริ่มทำงาน

ในการติดตามการใช้หน่วยความจำของกระบวนการในช่วงเวลาหนึ่งคุณสามารถใช้เครื่องมือที่เรียกว่าmuninเพื่อติดตามและแสดงกราฟการใช้หน่วยความจำที่ดีตลอดเวลา

Munin มาพร้อมกับปลั๊กอินเริ่มต้นจำนวนมากเพื่อติดตามทรัพยากรระบบอย่างไรก็ตามมันไม่ได้มาพร้อมกับปลั๊กอินในการติดตามการใช้งานหน่วยความจำสูงสุด - โชคดีที่มันง่ายมากที่จะเขียนปลั๊กอินสำหรับมัน

นี่คือตัวอย่างของปลั๊กอิน munin เพื่อติดตามการใช้งานหน่วยความจำ VmPeak, VmRSS และ VmSize สำหรับกระบวนการ apache คุณสามารถเปลี่ยนสิ่งนี้ให้เหมาะกับความต้องการของคุณ (เพียงชี้ไปที่ไฟล์ PID ที่ถูกต้องและเปลี่ยนชื่อส่วนประกอบตามต้องการ)

กราฟที่แสดงผลลัพธ์เป็นแบบนี้ (VmPeak และ VmSize เหมือนกันในตัวอย่างนี้ดังนั้นคุณจะเห็นเพียงหนึ่งในนั้น):

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 โปรดทราบว่าทุบตีนอกจากนี้ยังมีในตัวคำสั่งที่เรียกว่าเวลาดังนั้นคุณอาจจำเป็นต้องระบุเส้นทางแบบเต็มเวลา GNU เมื่อกล่าวอ้างนั้นเช่นคำสั่ง / usr / bin / เวลา -v นอกจากนี้ระวังว่าเวลา GNU รุ่นเก่ามีข้อผิดพลาดที่ผลลัพธ์ถูกคูณด้วย 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.