เรียกใช้และติดตามการใช้หน่วยความจำของกระบวนการเดียว


14

ฉันต้องการเรียกใช้โปรแกรมใช้หน่วยความจำและติดตามการใช้หน่วยความจำเมื่อเวลาผ่านไป โปรแกรมจะสิ้นสุดในไม่กี่วินาทีหลังจากเรียกใช้

คำถามก่อนหน้านี้แนะนำแพคเกจsysstat ในขณะที่pidstatยูทิลิตี้ของมันทำสิ่งที่ฉันต้องการบางส่วน

  • ยอมรับช่วงเวลาที่น้อยที่สุด1sแต่ฉันต้องการวัดที่ความละเอียดที่สั้นกว่า ( 0.1sควรจะดี)
  • มันติดตามกระบวนการที่มีอยู่เท่านั้นในขณะที่ฉันไม่สามารถแสดงตัวคัดลอกและวาง pid ได้

มีสคริปต์ / ยูทิลิตี้ทางเลือกอื่น ๆ ในการทำงานและเรียกใช้งานได้ดีขึ้นหรือไม่?


1
เสียงเหมือนที่คุณควรจะเขียนตัวเองขึ้นเล็ก ๆ น้อย ๆ ที่เรียบง่ายหลามหรือทุบตีสคริปต์เพื่อการถ่ายโอนข้อมูลการใช้กระบวนการหน่วยความจำ (คุณก็สามารถดูจำนวนเต็มแรกใน/proc/$PID/statm) แล้วนอนหลับ 100ms และทำซ้ำ ทำไมคุณไม่ทิ้งการเชื่อมโยงของ PID statmไปเรื่อยcatๆ บางทีใช้ regex บางตัวเพื่อกรองค่าพิเศษ / ที่ไม่จำเป็นและทำ a sleep 0.01? ระบบปฏิบัติการบางระบบไม่อนุญาตให้ใช้sleepค่าวินาทีย่อยดังนั้นในกรณีนี้คุณต้องใช้เส้นทาง Python (และใช้timeห้องสมุดในตัวของ Python แทนโหมดสลีปแทน)
Breakthrough

มีหลายวิธี
munish

คำตอบ:


11

สิ่งนี้ควรทำในสิ่งที่คุณต้องการ ได้รับข้อมูลจาก/proc/$PID/statmและพิมพ์ (จากman procfs):

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              data       data + stack

บท:

#!/usr/bin/env bash 

## Print header
 echo -e "Size\tResid.\tShared\tData\t%"
 while [ 1 ]; do
    ## Get the PID of the process name given as argument 1
     pidno=`pgrep $1`
    ## If the process is running, print the memory usage
     if [ -e /proc/$pidno/statm ]; then
     ## Get the memory info
      m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
     ## Get the memory percentage
      perc=`top -bd .10 -p $pidno -n 1  | grep $pidno | gawk '{print \$10}'`
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

จากนั้นคุณสามารถเรียกใช้สคริปต์โดยให้ชื่อกระบวนการเป็นอินพุต ตัวอย่างเช่น:

$ memusage.sh firefox
Size    Resid.  Shared  Data    %
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517209  261899  9546    400731  12.8
517209  261899  9546    400731  12.8

หมายเหตุ:

  • นี่ถือว่ามีเพียงกระบวนการเดียวที่รันด้วยชื่อที่ระบุ

@ björnenขอบคุณสำหรับการแก้ไข คุณพูดถูกฉันผิดmanไปแล้วฉันไม่รู้ว่าทำไมการแก้ไขของคุณถึงถูกปฏิเสธ
terdon

1

หลังจากปีที่ฉันพบว่า valgrind (เช่น) มีเครื่องมือสำหรับการนี้:

# record memory usage

$ valgrind --tool=massif bash -c "sleep 5; echo hey";
==5281== Massif, a heap profiler
==5281== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote
==5281== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==5281== Command: bash -c sleep\ 5;\ echo\ hey
==5281==
hey
==5281==

# print the usage (5281 was the pid of bash, your filename will be different)
$ ms_print massif.out.4682

หมายเหตุ: valgrind ทำมากกว่าการสังเกต: มันจำเป็นต้องฉีดโค้ดและถ่ายภาพความทรงจำ นี่อาจเป็นอันตรายต่อความแม่นยำของสถิติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.