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


376

มีเครื่องมือที่จะรันบรรทัดคำสั่งและรายงานยอดการใช้ RAM ทั้งหมดหรือไม่

ฉันจินตนาการถึงสิ่งที่คล้ายคลึงกับ / usr / bin / time

คำตอบ:


28

ต่อไปนี้เป็นหนึ่งในสายการบินที่ไม่ต้องใช้สคริปต์หรือยูทิลิตี้ภายนอกและไม่ต้องการให้คุณเริ่มกระบวนการผ่านโปรแกรมอื่นเช่น Valgrind หรือเวลาดังนั้นคุณสามารถใช้มันสำหรับกระบวนการใด ๆ ที่ทำงานอยู่แล้ว:

grep VmPeak /proc/$PID/status

(แทนที่$PIDด้วย PID ของกระบวนการที่คุณสนใจ)


4
ถ้าฉันไม่รู้ PID ล่ะ ตัวอย่างเช่นในกรณีที่โปรแกรมรันเวลาเล็กน้อย (<1 วินาที)
diralik

4
"VmHWM: ขนาดชุดที่อยู่อาศัยสูงสุด" อาจใช้งานได้มากขึ้นในการวัดการใช้ RAM (แทน VmPeak ที่มีสิ่งอื่น ๆ มากมาย)
jfs

@jfs มันขึ้นอยู่กับสิ่งที่คุณต้องการค้นหา IIRC VmPeak เป็นการใช้หน่วยความจำรวมสูงสุดรวมถึงหน่วยความจำเสมือนในขณะที่ VmHWM เป็นการใช้งาน RAM สูงสุด ดังนั้นหากคุณต้องการทราบจำนวนหน่วยความจำทั้งหมดที่โปรแกรมของคุณขอใช้ VmPeak ถ้าคุณต้องการทราบจำนวน RAM ที่แท้จริงของคุณที่เคยใช้ในเวลาที่กำหนดให้ใช้ VmHWM
erobertc

1
@diralik หากคุณกำลังตรวจสอบโปรแกรมที่เขียนด้วยตัวเองคุณสามารถฝังบรรทัดของรหัสเพื่อค้นหาเป็นไฟล์ "/ proc / self / status"
Fileland

404

[ แก้ไข : ใช้งานได้กับ Ubuntu 14.04: /usr/bin/time -v command ตรวจสอบให้แน่ใจว่าใช้เส้นทางแบบเต็ม]

ดูเหมือนว่า/usr/bin/timeจะให้ข้อมูลแก่คุณถ้าคุณผ่าน-v(นี่คือ Ubuntu 8.10) ดูเช่นMaximum resident set sizeด้านล่าง:

$ / usr / bin / time -v ls /
....
        คำสั่งถูกหมดเวลา: "ls /"
        เวลาผู้ใช้ (วินาที): 0.00
        เวลาระบบ (วินาที): 0.01
        เปอร์เซ็นต์ของ CPU ที่งานนี้ได้รับ: 250%
        เวลาที่ผ่านไป (นาฬิกาแขวนผนัง) (h: mm: ss หรือ m: ss): 0: 00.00
        ขนาดข้อความที่แชร์โดยเฉลี่ย (kbytes): 0
        ขนาดข้อมูลที่ไม่แชร์โดยเฉลี่ย (kbytes): 0
        ขนาดสแต็กเฉลี่ย (kbytes): 0
        ขนาดโดยรวมเฉลี่ย (kbytes): 0
        ขนาดชุดที่อยู่อาศัยสูงสุด (kbytes): 0
        ขนาดชุดที่อยู่อาศัยโดยเฉลี่ย (kbytes): 0
        ข้อบกพร่องของหน้าส่วนใหญ่ (ต้องการ I / O): 0
        ข้อผิดพลาดของหน้ารอง (เรียกคืนเฟรม): 315
        การสลับบริบทโดยสมัครใจ: 2
        การสลับบริบทโดยไม่สมัครใจ: 0
        สัญญาแลกเปลี่ยน: 0
        อินพุตระบบไฟล์: 0
        เอาต์พุตระบบไฟล์: 0
        ส่งข้อความซ็อกเก็ตแล้ว: 0
        ได้รับข้อความซ็อกเก็ต: 0
        ส่งสัญญาณ: 0
        ขนาดหน้า (ไบต์): 4096
        สถานะการออก: 0

4
อาจเป็น 0 เสมอเพราะ ls ไม่ได้ทำอะไรมาก ลองใช้คำสั่ง CPU ที่เข้มข้นขึ้น
Jon Ericson

17
จากหน้า man: ข้อมูลส่วนใหญ่ที่แสดงตามเวลามาจากการเรียกระบบ wait3 (2) ตัวเลขนั้นดีเท่ากับที่ส่งคืนโดยรอ 3 (2) บนระบบที่ไม่มีการเรียก wait3 (2) ที่ส่งคืนข้อมูลสถานะการโทรครั้งที่ (2) ระบบจะถูกใช้แทน อย่างไรก็ตามมันให้ข้อมูลน้อยกว่า wait3 (2) ดังนั้นในระบบเหล่านั้นเวลารายงานส่วนใหญ่ของทรัพยากรเป็นศูนย์
lothar

79
"bash: -v: ไม่พบคำสั่ง" หมายถึง bash intercepts เวลาที่ใช้เป็นของตัวเอง /bin/time -vแก้มัน
gcb

3
มันจะคุ้มค่าที่จะทำการตรวจสอบอย่างรวดเร็วเพื่อให้แน่ใจว่าผลลัพธ์ที่เหมาะสม เวลา Gnu มีข้อผิดพลาดที่จะรายงานการใช้งานหน่วยความจำจริง 4x เท่า: stackoverflow.com/questions/10035232/…
เอียน

24
@skalee ลองtime -lบน MacOS ให้ผลลัพธ์ที่คล้ายกัน
Volker Stolz

96

(นี่เป็นคำถามเก่าที่ตอบแล้ว แต่สำหรับบันทึก :)

ผมได้รับแรงบันดาลใจจากสคริปต์ยางของและมาพร้อมกับเครื่องมือขนาดเล็กนี้ชื่อmemusg ฉันเพียงเพิ่มอัตราการสุ่มตัวอย่างเป็น 0.1 เพื่อจัดการกับกระบวนการชีวิตสั้น แทนที่จะติดตามกระบวนการเดียวฉันทำให้มันวัดค่า rss sum ของกลุ่มกระบวนการ (ใช่ฉันเขียนโปรแกรมแยกต่างหากมากมายที่ทำงานร่วมกัน) มันทำงานบน Mac OS X และ Linux การใช้งานจะต้องเหมือนกับของtime:

memusg ls -alR /> / dev / null

มันแสดงให้เห็นถึงจุดสูงสุดในขณะนี้ แต่ฉันสนใจที่จะขยายเล็กน้อยเพื่อบันทึกสถิติอื่น ๆ (หยาบ)

เป็นเรื่องดีที่มีเครื่องมือง่าย ๆ เพียงแค่ดูก่อนที่เราจะเริ่มการทำโปรไฟล์ที่จริงจัง


1
ทั้งหมดที่ยังคงใช้ PS และเป็นสิ่งที่ดีในการกำหนดหน่วยความจำสูงสุดที่สังเกตได้ ไม่ใช่หน่วยความจำบนสุดจริง คุณสามารถพลาดบางสิ่งบางอย่างระหว่างช่วงเวลาหนึ่งกับช่วงเวลาอื่น
gcb

6
หน่วยสำหรับเอาต์พุตของสคริปต์ memusg มีอะไรบ้าง ไบต์? กิโลไบต์?
Daniel Standage

1
@DanielStandage: อาจเป็นกิโลไบต์ เพียงแค่ดูค่าที่แสดงโดยps -o rss=ที่ rss คือขนาดหน่วยความจำจริง (ชุดที่พักอาศัย) ของกระบวนการ (ในหน่วย 1024 ไบต์)จากหน้า man ของ BSD ของฉัน
netj

3
@gcb แล้วนั่นคือสิ่งที่คุณจะได้รับเมื่อคุณวัดตัวอย่าง
Volker Stolz

2
ลิงก์ไปยังบันทึกช่วยจำที่ให้ไว้ในคำตอบดูเหมือนว่าจะใช้งานไม่ได้ อย่างไรก็ตาม / usr / bin / time ทำได้ดีมาก
Tom Cornebize

65

Valgrind หนึ่งซับ:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

หมายเหตุการใช้ --pages-as-heap เพื่อวัดหน่วยความจำทั้งหมดในกระบวนการ ข้อมูลเพิ่มเติมที่นี่: http://valgrind.org/docs/manual/ms-manual.html


14
timeฉันจะทิ้งคุณไป
jbeard4

1
สคริปต์ที่มีประโยชน์ แต่ฉันต้องการ sort -g ในระบบ Slackware ของฉัน (ฉันคิดว่าคุณกำลังมองหาค่าสูงสุด)
Nick Coleman

3
+1 valgrind --massifสำหรับ นอกจากนี้คุณยังสามารถใช้ms_printเครื่องมือที่มาพร้อมกับมันเพื่อให้ได้ผลลัพธ์ที่สะดวก (รวมถึงแผนภูมิการใช้งาน ASCII เมื่อเวลาผ่านไป)
Eli Bendersky

7
เทือกเขามีค่าใช้จ่ายสูงกว่าtimeแต่สละเวลาอย่างน้อย 10 lsครั้งเพิ่มเติมเกี่ยวกับคำสั่งเช่น
Timothy Gu

8
มันใหญ่เกินไปจริงๆ คำตอบนี้ควรพูดถึงช้าลง คำสั่งที่ฉันต้องการวัดโดยปกติจะใช้เวลา 35 วินาทีจึงจะเสร็จสมบูรณ์ ฉันรันคำสั่ง valgrind นี้เพื่อวัดมันเกินกว่าครึ่งชั่วโมงที่ผ่านมาและมันยังไม่เสร็จ ...
unagi

35

บน Linux:

ใช้/usr/bin/time -v <program> <args>และมองหา " ขนาดชุดที่อยู่อาศัยสูงสุด "

(เพื่อไม่ให้สับสนกับทุบตีtimeในตัวคำสั่งดังนั้นใช้เส้นทางแบบเต็ม , /usr/bin/time)

ตัวอย่างเช่น:

> /usr/bin/time -v ./myapp
        User time (seconds): 0.00
        . . .
        Maximum resident set size (kbytes): 2792
        . . .

ใน BSD, MacOS:

ใช้/usr/bin/time -l <program> <args>มองหา " ขนาดชุดผู้พักอาศัยสูงสุด ":

>/usr/bin/time -l ./myapp
        0.01 real         0.00 user         0.00 sys
      1440  maximum resident set size
      . . .

sudo apt-get install time
Rolf


34

บางที (gnu) เวลา (1)ทำสิ่งที่คุณต้องการอยู่แล้ว ตัวอย่างเช่น

$ /usr/bin/time -f "%P %M" command
43% 821248

แต่เครื่องมือทำโปรไฟล์อื่น ๆ อาจให้ผลลัพธ์ที่แม่นยำมากขึ้นโดยขึ้นอยู่กับสิ่งที่คุณกำลังมองหา


ฉันดูเหมือนจะเคยได้รับศูนย์กับเรื่องนี้แม้สำหรับคำสั่งที่มีขนาดใหญ่
jes5199

ฉันได้รับผลลัพธ์ที่แปรผันเช่น 400% 0 และ 0% 0 ในโปรแกรมเดียวกัน .. บางทีอาจจะต้องใช้เวลานานกว่านี้แน่นอน
Liran Orevi

ฉันไม่รู้จะแนะนำอะไรดี รหัสข้างต้นเป็นสิ่งที่ฉันเรียกใช้คำสั่ง latex ที่เกิดขึ้นในประวัติศาสตร์ ดังที่ฉันพูดผลลัพธ์ที่แม่นยำยิ่งขึ้นสามารถรับได้ด้วยเครื่องมืออื่น ๆ
Jon Ericson

2
สิ่งนี้ใช้ได้กับ CentOS อย่างน้อย (และฉันก็เดิมพันด้วยเช่นกันกับระบบ RHEL) % P ให้สถิติที่ไม่เกี่ยวข้อง (% CPU) ซึ่งขึ้นอยู่กับตัวกำหนดตารางเวลาและจึงค่อนข้างแปรผัน
Blaisorblade

2
@Deleteman: ถูกสร้างขึ้นในคำสั่งเมื่อใช้time cshหากคุณใช้เส้นทางที่แน่นอนมันจะช่วยให้คุณสามารถเรียกใช้คำสั่งภายนอก เท่าที่ฉันรู้เพียงรุ่น GNU รองรับตัวเลือกรูปแบบ
Jon Ericson

18

/ usr / bin / time อาจทำในสิ่งที่คุณต้องการจริง ๆ แล้ว สิ่งที่ต้องการ.

 / usr / bin / time --format = '(% Xtext +% Ddata% Mmax)'

ดูเวลา (1) เพื่อดูรายละเอียด ...


1
ฉันดูเหมือนจะเคยได้รับศูนย์กับเรื่องนี้แม้สำหรับคำสั่งที่มีขนาดใหญ่
jes5199

jes5199, Liran มองที่ความเห็นข้างต้นดูเหมือนว่าเวลา (1) อาจจะเสียสำหรับการรายงานหน่วยความจำบน Linuxes บางอย่าง ...
simon

บน Ubuntu 16.04 ข้อความและข้อมูลเป็นศูนย์ แต่ค่าสูงสุดไม่ใช่ศูนย์และสร้างคุณค่าที่มีความหมาย ฉันมีความสุขกับมัน
Stéphane Gourichon

ฉันหวังว่า Mmax จะมีความหมายว่าสิ่งที่เราต้องการให้หมายถึง .... หน้าคนเป็นเรื่องย่อเล็ก ๆ น้อย ๆ เกี่ยวกับเรื่องนี้
matanster

17

ในการใช้งาน MacOS Sierra:

/usr/bin/time -l commandToMeasure

คุณสามารถใช้grepสิ่งที่คุณต้องการอาจจะ


5
นี้! ฉันใช้เวลาหนึ่งชั่วโมงในการลองใช้ Instruments.app และ dtrace เพื่อให้โปรไฟล์หน่วยความจำแก่ฉันโดยที่ความสมบูรณ์ของระบบเปิดอยู่ (ไม่สามารถปิดได้) ในขณะที่ฉันต้องการเพียงแค่คำสั่งง่ายๆนี้ บันทึกย่อขนาดเล็กคุณสามารถใช้command time -lแทน/usr/bin/time -lซึ่งจะทำให้เชลล์ของคุณเรียกไบนารีที่เรียกว่าtimeแทนที่จะเป็นฟังก์ชัน builtin (ใช่commandไม่ใช่ตัวยึดตำแหน่งcommand timeแตกต่างจาก Just time)
Jakub Arnold

16

หากกระบวนการทำงานเป็นเวลาอย่างน้อยสองสามวินาทีจากนั้นคุณสามารถใช้สคริปต์ทุบตีต่อไปนี้ซึ่งจะเรียกใช้บรรทัดคำสั่งที่กำหนดจากนั้นพิมพ์ไปที่ stderr RSS สูงสุด (แทนrssแอตทริบิวต์อื่น ๆ ที่คุณสนใจ) มันค่อนข้างเบาและใช้งานได้ดีสำหรับผมที่psรวมอยู่ใน Ubuntu 9.04 (ซึ่งผมพูดไม่ได้time)

#!/usr/bin/env bash
"$@" & # Run the given command line in the background.
pid=$! peak=0
while true; do
  sleep 1
  sample="$(ps -o rss= $pid 2> /dev/null)" || break
  let peak='sample > peak ? sample : peak'
done
echo "Peak: $peak" 1>&2

1
ข้อเสียเปรียบหลักของวิธีนี้คือหากกระบวนการจัดสรรหน่วยความจำมากในช่วงเวลาสั้น ๆ (เช่นใกล้ถึงจุดสิ้นสุด) อาจไม่สามารถตรวจพบสิ่งนี้ได้ การลดเวลานอนอาจช่วยสักหน่อย
vinc17


8

ดีถ้าคุณต้องการที่จะแสดงให้เห็นจุดสูงสุดหน่วยความจำและเพิ่มเติมบางส่วนสถิติในเชิงลึกฉันขอแนะนำให้ใช้ Profiler เช่นvalgrind ดี valgrind front-end เป็นalleyoop



5

นี่คือ (ขึ้นอยู่กับคำตอบอื่น ๆ ) สคริปต์ที่ง่ายมากที่เฝ้าดูกระบวนการทำงานอยู่แล้ว คุณเรียกใช้ด้วย pid ของกระบวนการที่คุณต้องการดูเป็นอาร์กิวเมนต์:

#!/usr/bin/env bash

pid=$1

while ps $pid >/dev/null
do
    ps -o vsz= ${pid}
    sleep 1
done | sort -n | tail -n1

ตัวอย่างการใช้งาน:

max_mem_usage.sh 23423


1

Heaptrackเป็นเครื่องมือของ KDE ที่มี GUI และส่วนต่อประสานข้อความ ฉันคิดว่ามันเหมาะสมกว่า valgrind เพื่อทำความเข้าใจการใช้งานหน่วยความจำของกระบวนการเพราะมันให้รายละเอียดเพิ่มเติมและกราฟิค นอกจากนี้ยังเร็วกว่าเพราะจะตรวจสอบ valgrind น้อย และให้การใช้งานหน่วยความจำสูงสุด

อย่างไรก็ตามการติดตาม RSS และ VSS memusgเป็นความเข้าใจผิดเพราะหน้าสามารถใช้ร่วมกันว่าทำไมว่า สิ่งที่คุณควรทำคือการติดตามผลรวมของPssในหรือการใช้งาน/proc/[pid]/smaps ระบบตรวจสอบของ GNOMEเคยทำมาแล้ว แต่มันแพงเกินไปpmap


1

การประดิษฐ์วงล้อขึ้นอีกครั้งด้วยสคริปต์ทุบตีที่ทำด้วยมือ รวดเร็วและสะอาด

กรณีการใช้งานของฉัน:ฉันต้องการตรวจสอบเครื่อง linux ที่มี RAM น้อยและต้องการถ่ายภาพต่อการใช้คอนเทนเนอร์เมื่อมันทำงานภายใต้การใช้งานหนัก

#!/usr/bin/env bash

threshold=$1

echo "$(date '+%Y-%m-%d %H:%M:%S'): Running free memory monitor with threshold $threshold%.."

while(true)
    freePercent=`free -m | grep Mem: | awk '{print ($7/$2)*100}'`    
  do

  if (( $(awk 'BEGIN {print ("'$freePercent'" < "'$threshold'")}') ))
  then
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Free memory $freePercent% is less than $threshold%"
       free -m
       docker stats --no-stream
       sleep 60  
       echo ""  
  else
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Sufficient free memory available: $freePercent%"
  fi
  sleep 30

done

ตัวอย่างผลลัพธ์:

2017-10-12 13:29:33: การเรียกใช้จอภาพหน่วยความจำฟรีที่มีขีด จำกัด 30% ..

2017-10-12 13:29:33: หน่วยความจำว่างที่เพียงพอ: 69.4567%

2017-10-12 13:30:03: มีหน่วยความจำว่างเพียงพอ: 69.4567%

2017-10-12 16:47:02: หน่วยความจำฟรี 18.9387% น้อยกว่า 30%

เอาต์พุตคำสั่งที่กำหนดเองของคุณ


1

บน macOS คุณสามารถใช้ DTrace แทน แอป "เครื่องมือ" เป็น GUI ที่ดีสำหรับสิ่งนั้นมันมาพร้อมกับ XCode afaik


0

'htop' เป็นคำสั่งที่ดีที่สุดในการดูว่ากระบวนการใดใช้ RAM เท่าใด .....

สำหรับรายละเอียดเพิ่มเติม http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html


3
htop ไม่แสดงรายการการใช้ PEAK การใช้งานในปัจจุบันเท่านั้น (เว้นแต่คุณจะรู้บางสิ่งบางอย่างที่ฉันทำไม่ได้อย่างที่ฉันได้ดูเมื่อวานนี้ในฮ็อพสำหรับสถานการณ์ที่แน่นอนนี้)
Katastic Voyage

-2

โปรดตอบคำถาม ให้รายละเอียดและแบ่งปันงานวิจัยของคุณ!

ขออภัยฉันมาที่นี่เป็นครั้งแรกและสามารถถามคำถามเท่านั้น ...

แนะนำให้ใช้:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

แล้ว:

grep mem_heap_B massif.out
...
mem_heap_B=1150976
mem_heap_B=1150976
...

สิ่งนี้แตกต่างจากtopคำสั่งที่แสดงในเวลาเดียวกัน:

14673 gu27mox   20   0 3280404 468380  19176 R 100.0  2.9   6:08.84 pwanew_3pic_com

หน่วยวัดจาก Valgrind คืออะไร?

คำ/usr/bin/time -v ./test.shตอบที่ไม่เคยตอบ - คุณต้องป้อนฟีดที่สามารถเรียกใช้งานได้โดยตรง/usr/bin/timeเช่น:

/usr/bin/time -v  pwanew_3pic_compass_2008florian3_dfunc.static  card_0.100-0.141_31212_resubmit1.dat_1.140_1.180   1.140 1.180 31212


    Command being timed: "pwanew_3pic_compass_2008florian3_dfunc.static card_0.100-0.141_31212_resubmit1.dat_1.140_1.180 1.140 1.180 31212"

    User time (seconds): 1468.44
    System time (seconds): 7.37
    Percent of CPU this job got: 99%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 24:37.14
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 574844
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 74
    Minor (reclaiming a frame) page faults: 468880
    Voluntary context switches: 1190
    Involuntary context switches: 20534
    Swaps: 0
    File system inputs: 81128
    File system outputs: 1264
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.