จะวัดการใช้หน่วยความจำจริงของแอพพลิเคชั่นหรือกระบวนการได้อย่างไร?


712

คำถามนี้ครอบคลุมในรายละเอียดที่ดีที่นี่

คุณวัดการใช้หน่วยความจำของแอปพลิเคชั่นหรือกระบวนการใน Linux ได้อย่างไร?

จากบทความในบล็อกของใช้หน่วยความจำความเข้าใจบน Linux , psไม่ได้เป็นเครื่องมือที่ถูกต้องที่จะใช้สำหรับความตั้งใจนี้

ทำไมps"ผิด"

ขึ้นอยู่กับว่าคุณมองอย่างไรpsจะไม่รายงานการใช้หน่วยความจำจริงของกระบวนการ สิ่งที่ทำจริง ๆ คือการแสดงว่าหน่วยความจำจริงแต่ละกระบวนการจะใช้เวลาเท่าใดหากเป็นกระบวนการเดียวที่ทำงานอยู่ แน่นอนเครื่อง Linux ทั่วไปมีกระบวนการหลายโหลทำงานในเวลาใดก็ตามซึ่งหมายความว่า vsz และหมายเลข RSS รายงานโดยpsเกือบจะแน่นอนที่ไม่ถูกต้อง


6
คำถามนี้อาจเป็นของ serverfault.com แทนทุกวันนี้แม้ว่ามันจะบอกฉันว่ามัน "แก่เกินไปที่จะโยกย้าย" ไม่จริงต้องการที่จะปิดมันว่า ...
thomasrutter

อ้างถึงคำถามนี้ stackoverflow.com/questions/669438/…
Bloodmoon

2
ที่จริงแล้วpsไม่ได้แสดงให้เห็นว่า - มันแสดงหมายเลขหน่วยความจำเสมือนและหน่วยความจำถิ่นที่ซึ่งจำนวนหน่วยความจำเสมือนสูงสุดที่กระบวนการสามารถใช้ในทางทฤษฎีมันเป็นกระบวนการเดียว (ไม่เช่นนั้น), ใช้ทุกหน้าเดียวที่จัดสรร และไม่ได้แมปหรือยกเลิกการแมปหน้าใด ๆ (ไม่น่าเป็นไปได้) ในขณะที่ถิ่นที่อยู่จะแสดงจำนวนหน่วยความจำเสมือนที่ถูกแมปกับฟิสิคัลในขณะนี้ virt > usage > resอย่างไรก็ตามโดยทั่วไปแล้วในระบบ 64 บิตvirt ~= res*10มันเป็นช่วงกว้างมาก
Dima Tisnek

5
ตัดตอนมาจากบทความที่เชื่อมโยงเป็นเรื่องไร้สาระทั้งหมด RSS เป็นหน่วยความจำกายภาพที่ใช้จริงและ VSZ อาจหรืออาจแปลเป็นหน่วยความจำกายภาพไม่ได้แม้ว่าจะเป็นกระบวนการเดียวที่ทำงานอยู่ก็ตาม
David Schwartz

คำตอบ:


356

ด้วยpsเครื่องมือที่คล้ายกันคุณจะได้รับจำนวนหน้าหน่วยความจำที่จัดสรรโดยกระบวนการนั้นเท่านั้น หมายเลขนี้ถูกต้อง แต่:

  • ไม่ได้สะท้อนถึงจำนวนหน่วยความจำจริงที่ใช้โดยแอปพลิเคชันเฉพาะจำนวนหน่วยความจำที่สำรองไว้

  • อาจทำให้เข้าใจผิดหากมีการแชร์หน้าเช่นหลายเธรดหรือโดยใช้ไลบรารีที่ลิงก์แบบไดนามิก

หากคุณต้องการทราบจำนวนหน่วยความจำที่แอ็พพลิเคชันของคุณใช้จริงคุณต้องเรียกใช้ภายใน Profiler ตัวอย่างเช่นvalgrindสามารถให้ข้อมูลเชิงลึกเกี่ยวกับจำนวนหน่วยความจำที่ใช้และที่สำคัญเกี่ยวกับหน่วยความจำรั่วในโปรแกรมของคุณ เครื่องมือตัวสร้างโปรไฟล์ของ valgrind เรียกว่า 'massif':

Massif เป็นผู้สร้างโปรไฟล์กอง มันทำการทำโปรไฟล์ฮีปอย่างละเอียดโดยถ่ายสแนปชอตปกติของฮีปของโปรแกรม มันสร้างกราฟแสดงการใช้ฮีปเมื่อเวลาผ่านไปรวมถึงข้อมูลเกี่ยวกับส่วนของโปรแกรมที่รับผิดชอบการจัดสรรหน่วยความจำส่วนใหญ่ กราฟเสริมด้วยไฟล์ข้อความหรือ HTML ที่มีข้อมูลเพิ่มเติมเพื่อพิจารณาว่าหน่วยความจำส่วนใหญ่ถูกจัดสรรไว้ที่ใด Massif รันโปรแกรมประมาณ 20x ช้ากว่าปกติ

ตามที่อธิบายไว้ในเอกสาร valgrindคุณจะต้องเรียกใช้โปรแกรมผ่าน valgrind:

valgrind --tool=massif <executable> <arguments>

Massif เขียนดัมพ์ของสแน็ปช็อตการใช้หน่วยความจำ (เช่นmassif.out.12345) สิ่งเหล่านี้จะให้ (1) ระยะเวลาของการใช้หน่วยความจำ (2) สำหรับแต่ละสแน็ปช็อตซึ่งเป็นข้อมูลที่จัดสรรไว้ในหน่วยความจำโปรแกรมของคุณ เครื่องมือแบบกราฟิกที่ยอดเยี่ยมสำหรับการวิเคราะห์ไฟล์เหล่านี้เป็นเทือกเขา-Visualizer แต่ฉันพบว่าms_printเป็นเครื่องมือที่ใช้ข้อความอย่างง่ายที่มาพร้อมกับ valgrind ซึ่งเป็นประโยชน์อย่างมากแล้ว

ในการค้นหาหน่วยความจำรั่วให้ใช้memcheckเครื่องมือ(ค่าเริ่มต้น) ของ valgrind


44
ในการตีความผลลัพธ์ที่สร้างโดย valgrind ฉันสามารถแนะนำ alleyoop ไม่แฟนซีเกินไปและบอกสิ่งที่คุณต้องรู้เพื่อค้นหาแหล่งที่มาของการรั่วไหล สาธารณูปโภคที่ดี
ด่าน

6
รายการ (a) ถูกต้อง มีความแตกต่างระหว่างหน้าที่ใช้งานและหน่วยความจำที่จัดสรรโดยแอปพลิเคชันผ่านการเรียกไปยัง malloc () ใหม่และอื่น ๆ การใช้งานในที่อยู่อาศัยนั้นแสดงให้เห็นว่าหน่วยความจำเพจมีจำนวนเท่าใดใน RAM
jcoffland

63
สิ่งนี้ไม่ได้บอกวิธีการใช้งานหน่วยความจำโดยใช้ valgrind จริงหรือ
แมทช่างไม้

11
เครื่องมือ valgrind ที่เป็นค่าเริ่มต้น memcheck มีประโยชน์สำหรับการตรวจจับการรั่วไหลของหน่วยความจำ แต่ไม่ใช่ตัวสร้างโปรไฟล์หน่วยความจำ สำหรับสิ่งนั้นคุณต้องการ valgrind --tool = massif
ทอดด์อิสระ

3
@DavidSchwartz ฉันไม่เห็นว่าคำสั่งของคุณขัดแย้งกับฉันอย่างไร ฉันมีความรู้สึกว่าคุณเป็นกังวลมากเกินไปในจุดที่ฉันเป็น "ผิด" มากกว่าอ่านสิ่งที่ฉันพูด จุดทั้งหมดของฉันที่นี่คือ RSS เป็นตัววัดที่ไม่เหมาะสมสำหรับการใช้หน่วยความจำจริงของแอปพลิเคชันและคุณกำลังสร้างจุดเดียวกันในสองประโยคสุดท้ายของคุณ จริงๆแล้วคุณคิดว่าอะไรคือเหตุผลที่ทำให้ฉันต้องมีการหดตัว RSS ตั้งแต่แรก? เพื่อให้คุณสะกดมันกลับมาหาฉันเพื่อพิสูจน์ว่าฉัน "ผิด" โดยสิ่งที่ฉันหมายถึง? ทัศนคติของคุณที่มีต่อฉันช่างน่าเบื่อ
ypnos

280

ลองใช้คำสั่งpmap :

sudo pmap -x <process pid>

45
ทำงานด้วย sudo หรือไม่ให้ข้อผิดพลาดและไม่แสดงหน่วยความจำที่ใช้ไป
Matt

22
ไม่มีอยู่ใน OSX (สำหรับทุกคนที่มาที่นี่จาก google)
jcollum

3
นั่นคือคำตอบสำหรับคำถาม! PS ในเปลือกของฉัน pmap สามารถอ่านกระบวนการโดยไม่ต้อง sudo
MasterControlProgram

7
Re OS X (ดูเหมือนจะไม่ใช่ข้อกังวลของ OP) คุณสามารถดูข้อมูลที่คล้ายกันโดยใช้ vmmap (1)
jrg

หมายเหตุ: ให้คำตอบที่แตกต่างอย่างสิ้นเชิงจากgnome-system-monitor
ribamar

190

ยากที่จะบอกแน่นอน แต่นี่เป็นสองสิ่ง "ปิด" ที่สามารถช่วยได้

$ ps aux 

จะทำให้คุณมีขนาดเสมือนจริง (VSZ)

นอกจากนี้คุณยังสามารถรับสถิติรายละเอียดจาก / proc ระบบไฟล์โดยไปที่ /proc/$pid/status

ที่สำคัญที่สุดคือ VmSize ซึ่งควรใกล้เคียงกับที่ps auxให้ไว้

/ proc / 19420 $ cat สถานะ
ชื่อ: firefox
รัฐ: S (นอนหลับ)
Tgid: 19420
Pid: 19420
PPid: 1
TracerPid: 0
โพสต์: 1000 1,000 1,000 1,000
Gid: 1,000 1,000 1,000 1,000
FDSize: 256
กลุ่ม: 4 6 20 24 25 29 30 44 46 107 109 115 124 1,000 
VmPeak: 222956 kB
VmSize: 212520 kB
VmLck: 0 kB
VmHWM: 127912 kB
VmRSS: 118768 kB
VmData: 170180 kB
VmStk: 228 kB
VmExe: 28 kB
VmLib: 35424 kB
VmPTE: 184 kB
หัวข้อ: 8
SigQ: 0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000020001000
SigCgt: 000000018000442f
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
Cpus_allowed: 03
Mems_allowed: 1
voluntary_ctxt_switches: 63422
nonvoluntary_ctxt_switches: 7171


21
ฉันพลาดอะไรไปรึเปล่า? คำถามที่ถามถึงวิธีการวัดการใช้หน่วยความจำที่ดีกว่าโดยกระบวนการที่ VSZ และ RSS รายงานใน ps ทำให้เข้าใจผิด คำตอบของคุณมีรายละเอียดวิธีค้นหา VSZ - ค่าเดียวกันกับที่กล่าวถึงว่าทำให้เข้าใจผิด
thomasrutter

16
@thomasrutter ใช่คุณไม่มีคำถามดั้งเดิม (ฉบับที่ 1) มีการแก้ไขหลายครั้งและค่อนข้างเก่า (2008) คำถามเดิมเพิ่งถามถึงวิธีการวัดการใช้หน่วยความจำของกระบวนการ คุณสามารถแก้ไขคำถามและคำตอบได้ฟรีหากสิ่งต่างๆล้าสมัย :)
DustinB

1
หมายเหตุ: ให้คำตอบที่แตกต่างอย่างสิ้นเชิงจากgnome-system-monitor
ribamar

131

ใน linux เวอร์ชันล่าสุดให้ใช้ระบบย่อยsmaps ตัวอย่างเช่นสำหรับกระบวนการที่มี PID 1234:

cat /proc/1234/smaps

มันจะบอกคุณว่าหน่วยความจำที่ใช้ในเวลานั้นเท่าไหร่ ที่สำคัญกว่านั้นจะแบ่งหน่วยความจำออกเป็นส่วนตัวและแบ่งใช้ดังนั้นคุณสามารถบอกได้ว่าหน่วยความจำอินสแตนซ์ของโปรแกรมของคุณกำลังใช้งานอยู่เท่าใดโดยไม่รวมหน่วยความจำที่แบ่งใช้ระหว่างโปรแกรมหลายอินสแตนซ์


ฉันเดาว่าpmapเป็นอินเทอร์เฟซที่เรียบง่ายกว่าไป
ribamar

126

ไม่มีวิธีง่ายๆในการคำนวณนี้ แต่บางคนพยายามที่จะรับคำตอบที่ดี:


ผลที่ออกมาดีคือรายการของหน่วยความจำและกระบวนการที่
สะอาด

ดีมากพร้อมการจัดกลุ่มที่ค่อนข้างชาญฉลาด
Rohmer

Yeap ค่อนข้างดีแน่นอน ฉันค้นหาps_memและsmemมีประโยชน์มากสำหรับการวัดผลผู้ใช้ขณะที่เช่น pmapเอาต์พุตที่มีรายละเอียดมากนั้นมุ่งเน้นไปที่ devs ... อนุญาตให้ดึงการใช้งานหน่วยความจำของ Firefox สำหรับแต่ละฟอนต์, แอดออน, และ libs สำหรับอดีต ขอขอบคุณทุกท่าน @Bash, @thomasruther
tuk0z

อันนี้เป็นคนเดียวที่จับคู่ผลลัพธ์ของgnome-system-monitor
ribamar

110

ใช้smemซึ่งเป็นทางเลือกสำหรับpsซึ่งคำนวณ USS และ PSS ต่อกระบวนการ สิ่งที่คุณต้องการน่าจะเป็น PSS

  • USS - ขนาดชุดที่ไม่ซ้ำกัน นี่คือจำนวนหน่วยความจำที่ไม่ใช้งานร่วมที่ไม่ซ้ำกับกระบวนการนั้น (คิดว่าเป็นUสำหรับหน่วยความจำที่ไม่ซ้ำกัน ) มันไม่รวมถึงหน่วยความจำที่ใช้ร่วมกัน ดังนั้นสิ่งนี้จะอยู่ภายใต้ -รายงานจำนวนหน่วยความจำที่กระบวนการใช้ แต่มีประโยชน์เมื่อคุณต้องการละเว้นหน่วยความจำที่แชร์

  • PSS - ขนาดชุดสัดส่วน นี่คือสิ่งที่คุณต้องการ มันเพิ่มหน่วยความจำที่ไม่ซ้ำกัน (USS) พร้อมกับสัดส่วนของหน่วยความจำที่ใช้ร่วมกันหารด้วยจำนวนกระบวนการที่แชร์หน่วยความจำนั้น ดังนั้นมันจะให้การแสดงที่ถูกต้องถึงจำนวนหน่วยความจำฟิสิคัลที่ใช้จริงต่อกระบวนการ คิดว่าPเป็นหน่วยความจำกายภาพ

วิธีนี้เปรียบเทียบกับ RSS ตามที่รายงานโดยpsและการใช้งานอื่น ๆ :

  • RSS - ขนาดชุดที่อยู่อาศัย นี่คือจำนวนหน่วยความจำที่ใช้ร่วมกันรวมถึงหน่วยความจำที่ไม่แชร์ที่ใช้โดยแต่ละกระบวนการ หากกระบวนการใดใช้หน่วยความจำร่วมกันสิ่งนี้จะเกินจำนวนหน่วยความจำที่ใช้จริงเพราะหน่วยความจำที่ใช้ร่วมกันจะถูกนับมากกว่าหนึ่งครั้ง - จะปรากฏขึ้นอีกครั้งในแต่ละกระบวนการอื่น ๆ ที่ใช้หน่วยความจำร่วมกัน ดังนั้นจึงไม่น่าเชื่อถือพอสมควรโดยเฉพาะอย่างยิ่งเมื่อกระบวนการที่มีหน่วยความจำสูงมีส้อมจำนวนมาก - ซึ่งเป็นเรื่องปกติในเซิร์ฟเวอร์โดยมีกระบวนการต่าง ๆ เช่น Apache หรือ PHP (fastcgi / FPM)

แจ้งให้ทราบล่วงหน้า: smem ยังสามารถ (เป็นทางเลือก) กราฟแสดงผลเช่นแผนภูมิวงกลมและสิ่งที่คล้ายกัน IMO คุณไม่ต้องการสิ่งใดเลย หากคุณเพียงต้องการใช้จากบรรทัดคำสั่งเช่นคุณอาจใช้ ps -A v คุณไม่จำเป็นต้องติดตั้ง python-matplotlib ที่แนะนำให้พึ่งพา


2
จุดสำคัญอย่างหนึ่งเกี่ยวกับ RSS คือแอพพลิเคชั่นส่วนใหญ่ทุกวันนี้แบ่งปันโค้ดเพจจำนวนมาก ทุกไลบรารีที่แบ่งใช้ (เช่น libc และ libstdc ++) จะถูกนับสำหรับทุกกระบวนการที่ใช้ และถ้ามีหลายอินสแตนซ์ของกระบวนการทำงานรหัสทั้งหมดนั้นจะถูกนับเป็นสองเท่า
ดาวิดซี

1
แม่นยำซึ่งเป็นเหตุผลที่ RSS รายงานมากเกินไปในแง่ของหน่วยความจำกายภาพจริงต่อกระบวนการ
thomasrutter

3
smem คือสิ่งที่ฉันต้องการ ด้วยการรันด้วย -t ทุกครั้งที่ฉันเริ่มอินสแตนซ์กระบวนการใหม่ฉันสามารถดูหน่วยความจำที่แต่ละอินสแตนซ์สิ้นเปลือง สำหรับ chrome: smem -t -P '/ opt / google / chrome'
xtian

ฉันประสบปัญหาในการค้นหาเอกสารสำหรับ smem .. มันจะแสดงผลเป็นไบต์กิโลไบต์หรือเมกะไบต์เป็นค่าเริ่มต้นใช่หรือไม่
ZN13

4
TL; DR: USS = จำนวนหน่วยความจำกายภาพที่จะถูกปล่อยให้ว่างหากกระบวนการถูกทำลาย PSS = จำนวนหน่วยความจำกายภาพที่กระบวนการนี้ต้องการจากระบบหากไม่มีกระบวนการที่มีอยู่จะถูกฆ่าตาย RSS = จำนวนหน่วยความจำกายภาพที่สามารถเข้าถึงได้โดย กระบวนการนี้ (แต่ไม่ใช่การเข้าถึงแบบเอกสิทธิ์เสมอไป)
Mikko Rantalainen

95
ps -eo size,pid,user,command --sort -size | \
    awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |\
    cut -d "" -f2 | cut -d "-" -f1

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

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

     0.00 Mb COMMAND 
  1288.57 Mb /usr/lib/firefox
   821.68 Mb /usr/lib/chromium/chromium 
   762.82 Mb /usr/lib/chromium/chromium 
   588.36 Mb /usr/sbin/mysqld 
   547.55 Mb /usr/lib/chromium/chromium 
   523.92 Mb /usr/lib/tracker/tracker
   476.59 Mb /usr/lib/chromium/chromium 
   446.41 Mb /usr/bin/gnome
   421.62 Mb /usr/sbin/libvirtd 
   405.11 Mb /usr/lib/chromium/chromium 
   302.60 Mb /usr/lib/chromium/chromium 
   291.46 Mb /usr/lib/chromium/chromium 
   284.56 Mb /usr/lib/chromium/chromium 
   238.93 Mb /usr/lib/tracker/tracker
   223.21 Mb /usr/lib/chromium/chromium 
   197.99 Mb /usr/lib/chromium/chromium 
   194.07 Mb conky 
   191.92 Mb /usr/lib/chromium/chromium 
   190.72 Mb /usr/bin/mongod 
   169.06 Mb /usr/lib/chromium/chromium 
   155.11 Mb /usr/bin/gnome
   136.02 Mb /usr/lib/chromium/chromium 
   125.98 Mb /usr/lib/chromium/chromium 
   103.98 Mb /usr/lib/chromium/chromium 
    93.22 Mb /usr/lib/tracker/tracker
    89.21 Mb /usr/lib/gnome
    80.61 Mb /usr/bin/gnome
    77.73 Mb /usr/lib/evolution/evolution
    76.09 Mb /usr/lib/evolution/evolution
    72.21 Mb /usr/lib/gnome
    69.40 Mb /usr/lib/evolution/evolution
    68.84 Mb nautilus
    68.08 Mb zeitgeist
    60.97 Mb /usr/lib/tracker/tracker
    59.65 Mb /usr/lib/evolution/evolution
    57.68 Mb apt
    55.23 Mb /usr/lib/gnome
    53.61 Mb /usr/lib/evolution/evolution
    53.07 Mb /usr/lib/gnome
    52.83 Mb /usr/lib/gnome
    51.02 Mb /usr/lib/udisks2/udisksd 
    50.77 Mb /usr/lib/evolution/evolution
    50.53 Mb /usr/lib/gnome
    50.45 Mb /usr/lib/gvfs/gvfs
    50.36 Mb /usr/lib/packagekit/packagekitd 
    50.14 Mb /usr/lib/gvfs/gvfs
    48.95 Mb /usr/bin/Xwayland :1024 
    46.21 Mb /usr/bin/gnome
    42.43 Mb /usr/bin/zeitgeist
    42.29 Mb /usr/lib/gnome
    41.97 Mb /usr/lib/gnome
    41.64 Mb /usr/lib/gvfs/gvfsd
    41.63 Mb /usr/lib/gvfs/gvfsd
    41.55 Mb /usr/lib/gvfs/gvfsd
    41.48 Mb /usr/lib/gvfs/gvfsd
    39.87 Mb /usr/bin/python /usr/bin/chrome
    37.45 Mb /usr/lib/xorg/Xorg vt2 
    36.62 Mb /usr/sbin/NetworkManager 
    35.63 Mb /usr/lib/caribou/caribou 
    34.79 Mb /usr/lib/tracker/tracker
    33.88 Mb /usr/sbin/ModemManager 
    33.77 Mb /usr/lib/gnome
    33.61 Mb /usr/lib/upower/upowerd 
    33.53 Mb /usr/sbin/gdm3 
    33.37 Mb /usr/lib/gvfs/gvfsd
    33.36 Mb /usr/lib/gvfs/gvfs
    33.23 Mb /usr/lib/gvfs/gvfs
    33.15 Mb /usr/lib/at
    33.15 Mb /usr/lib/at
    30.03 Mb /usr/lib/colord/colord 
    29.62 Mb /usr/lib/apt/methods/https 
    28.06 Mb /usr/lib/zeitgeist/zeitgeist
    27.29 Mb /usr/lib/policykit
    25.55 Mb /usr/lib/gvfs/gvfs
    25.55 Mb /usr/lib/gvfs/gvfs
    25.23 Mb /usr/lib/accountsservice/accounts
    25.18 Mb /usr/lib/gvfs/gvfsd 
    25.15 Mb /usr/lib/gvfs/gvfs
    25.15 Mb /usr/lib/gvfs/gvfs
    25.12 Mb /usr/lib/gvfs/gvfs
    25.10 Mb /usr/lib/gnome
    25.10 Mb /usr/lib/gnome
    25.07 Mb /usr/lib/gvfs/gvfsd 
    24.99 Mb /usr/lib/gvfs/gvfs
    23.26 Mb /usr/lib/chromium/chromium 
    22.09 Mb /usr/bin/pulseaudio 
    19.01 Mb /usr/bin/pulseaudio 
    18.62 Mb (sd
    18.46 Mb (sd
    18.30 Mb /sbin/init 
    18.17 Mb /usr/sbin/rsyslogd 
    17.50 Mb gdm
    17.42 Mb gdm
    17.09 Mb /usr/lib/dconf/dconf
    17.09 Mb /usr/lib/at
    17.06 Mb /usr/lib/gvfs/gvfsd
    16.98 Mb /usr/lib/at
    16.91 Mb /usr/lib/gdm3/gdm
    16.86 Mb /usr/lib/gvfs/gvfsd
    16.86 Mb /usr/lib/gdm3/gdm
    16.85 Mb /usr/lib/dconf/dconf
    16.85 Mb /usr/lib/dconf/dconf
    16.73 Mb /usr/lib/rtkit/rtkit
    16.69 Mb /lib/systemd/systemd
    13.13 Mb /usr/lib/chromium/chromium 
    13.13 Mb /usr/lib/chromium/chromium 
    10.92 Mb anydesk 
     8.54 Mb /sbin/lvmetad 
     7.43 Mb /usr/sbin/apache2 
     6.82 Mb /usr/sbin/apache2 
     6.77 Mb /usr/sbin/apache2 
     6.73 Mb /usr/sbin/apache2 
     6.66 Mb /usr/sbin/apache2 
     6.64 Mb /usr/sbin/apache2 
     6.63 Mb /usr/sbin/apache2 
     6.62 Mb /usr/sbin/apache2 
     6.51 Mb /usr/sbin/apache2 
     6.25 Mb /usr/sbin/apache2 
     6.22 Mb /usr/sbin/apache2 
     3.92 Mb bash 
     3.14 Mb bash 
     2.97 Mb bash 
     2.95 Mb bash 
     2.93 Mb bash 
     2.91 Mb bash 
     2.86 Mb bash 
     2.86 Mb bash 
     2.86 Mb bash 
     2.84 Mb bash 
     2.84 Mb bash 
     2.45 Mb /lib/systemd/systemd
     2.30 Mb (sd
     2.28 Mb /usr/bin/dbus
     1.84 Mb /usr/bin/dbus
     1.46 Mb ps 
     1.21 Mb openvpn hackthebox.ovpn 
     1.16 Mb /sbin/dhclient 
     1.16 Mb /sbin/dhclient 
     1.09 Mb /lib/systemd/systemd 
     0.98 Mb /sbin/mount.ntfs /dev/sda3 /media/n0bit4/Data 
     0.97 Mb /lib/systemd/systemd 
     0.96 Mb /lib/systemd/systemd 
     0.89 Mb /usr/sbin/smartd 
     0.77 Mb /usr/bin/dbus
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.76 Mb su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.75 Mb sudo su 
     0.74 Mb /usr/bin/dbus
     0.71 Mb /usr/lib/apt/methods/http 
     0.68 Mb /bin/bash /usr/bin/mysqld_safe 
     0.68 Mb /sbin/wpa_supplicant 
     0.66 Mb /usr/bin/dbus
     0.61 Mb /lib/systemd/systemd
     0.54 Mb /usr/bin/dbus
     0.46 Mb /usr/sbin/cron 
     0.45 Mb /usr/sbin/irqbalance 
     0.43 Mb logger 
     0.41 Mb awk { hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" } 
     0.40 Mb /usr/bin/ssh
     0.34 Mb /usr/lib/chromium/chrome
     0.32 Mb cut 
     0.32 Mb cut 
     0.00 Mb [kthreadd] 
     0.00 Mb [ksoftirqd/0] 
     0.00 Mb [kworker/0:0H] 
     0.00 Mb [rcu_sched] 
     0.00 Mb [rcu_bh] 
     0.00 Mb [migration/0] 
     0.00 Mb [lru
     0.00 Mb [watchdog/0] 
     0.00 Mb [cpuhp/0] 
     0.00 Mb [cpuhp/1] 
     0.00 Mb [watchdog/1] 
     0.00 Mb [migration/1] 
     0.00 Mb [ksoftirqd/1] 
     0.00 Mb [kworker/1:0H] 
     0.00 Mb [cpuhp/2] 
     0.00 Mb [watchdog/2] 
     0.00 Mb [migration/2] 
     0.00 Mb [ksoftirqd/2] 
     0.00 Mb [kworker/2:0H] 
     0.00 Mb [cpuhp/3] 
     0.00 Mb [watchdog/3] 
     0.00 Mb [migration/3] 
     0.00 Mb [ksoftirqd/3] 
     0.00 Mb [kworker/3:0H] 
     0.00 Mb [kdevtmpfs] 
     0.00 Mb [netns] 
     0.00 Mb [khungtaskd] 
     0.00 Mb [oom_reaper] 
     0.00 Mb [writeback] 
     0.00 Mb [kcompactd0] 
     0.00 Mb [ksmd] 
     0.00 Mb [khugepaged] 
     0.00 Mb [crypto] 
     0.00 Mb [kintegrityd] 
     0.00 Mb [bioset] 
     0.00 Mb [kblockd] 
     0.00 Mb [devfreq_wq] 
     0.00 Mb [watchdogd] 
     0.00 Mb [kswapd0] 
     0.00 Mb [vmstat] 
     0.00 Mb [kthrotld] 
     0.00 Mb [ipv6_addrconf] 
     0.00 Mb [acpi_thermal_pm] 
     0.00 Mb [ata_sff] 
     0.00 Mb [scsi_eh_0] 
     0.00 Mb [scsi_tmf_0] 
     0.00 Mb [scsi_eh_1] 
     0.00 Mb [scsi_tmf_1] 
     0.00 Mb [scsi_eh_2] 
     0.00 Mb [scsi_tmf_2] 
     0.00 Mb [scsi_eh_3] 
     0.00 Mb [scsi_tmf_3] 
     0.00 Mb [scsi_eh_4] 
     0.00 Mb [scsi_tmf_4] 
     0.00 Mb [scsi_eh_5] 
     0.00 Mb [scsi_tmf_5] 
     0.00 Mb [bioset] 
     0.00 Mb [kworker/1:1H] 
     0.00 Mb [kworker/3:1H] 
     0.00 Mb [kworker/0:1H] 
     0.00 Mb [kdmflush] 
     0.00 Mb [bioset] 
     0.00 Mb [kdmflush] 
     0.00 Mb [bioset] 
     0.00 Mb [jbd2/sda5
     0.00 Mb [ext4
     0.00 Mb [kworker/2:1H] 
     0.00 Mb [kauditd] 
     0.00 Mb [bioset] 
     0.00 Mb [drbd
     0.00 Mb [irq/27
     0.00 Mb [i915/signal:0] 
     0.00 Mb [i915/signal:1] 
     0.00 Mb [i915/signal:2] 
     0.00 Mb [ttm_swap] 
     0.00 Mb [cfg80211] 
     0.00 Mb [kworker/u17:0] 
     0.00 Mb [hci0] 
     0.00 Mb [hci0] 
     0.00 Mb [kworker/u17:1] 
     0.00 Mb [iprt
     0.00 Mb [iprt
     0.00 Mb [kworker/1:0] 
     0.00 Mb [kworker/3:0] 
     0.00 Mb [kworker/0:0] 
     0.00 Mb [kworker/2:0] 
     0.00 Mb [kworker/u16:0] 
     0.00 Mb [kworker/u16:2] 
     0.00 Mb [kworker/3:2] 
     0.00 Mb [kworker/2:1] 
     0.00 Mb [kworker/1:2] 
     0.00 Mb [kworker/0:2] 
     0.00 Mb [kworker/2:2] 
     0.00 Mb [kworker/0:1] 
     0.00 Mb [scsi_eh_6] 
     0.00 Mb [scsi_tmf_6] 
     0.00 Mb [usb
     0.00 Mb [bioset] 
     0.00 Mb [kworker/3:1] 
     0.00 Mb [kworker/u16:1] 

1
วิธีใดในการกรองรายการเพื่อให้มีเพียงกระบวนการที่ใช้มากกว่า 25% ของหน่วยความจำสำหรับการพูดในยุค 30? ฉันพยายามที่จะเห็นกระบวนการที่กำลังวิ่งหนีเช่นเบราว์เซอร์ Chrome เมื่อใช้ดีบักเกอร์ PHPEclipse
Stephane

ตัวกรองนั้นน่ากลัว
aleix

1
ฉันจะโพสต์สิ่งนั้นโดยเร็วที่สุด
Lokendra Singh Rawat

2
ที่ดี! แต่การวนซ้ำควรเริ่มจากx=2ไปยังเอาต์พุต pid และผู้ใช้
Boris Brodski

70

เกี่ยวกับtimeอะไร

ไม่ได้ทุบตีในตัวtimeแต่อย่างหนึ่งที่คุณสามารถหาได้ด้วยwhich timeยกตัวอย่างเช่น/usr/bin/time

นี่คือสิ่งที่ครอบคลุมโดยง่ายls:

$ /usr/bin/time --verbose ls
(...)
Command being timed: "ls"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
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): 2372
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 1
Minor (reclaiming a frame) page faults: 121
Voluntary context switches: 2
Involuntary context switches: 9
Swaps: 0
File system inputs: 256
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

ฉันด้วย. มันเป็นวิธีที่ผมใช้งานโปรไฟล์ใน powercron.eu :)
Moonchild

5
brew install gnu-timeจากนั้นใช้gtimeถ้าคุณใช้ macOS
Nobu

4
ข้อเสียเปรียบ: จะไม่ได้รับผลลัพธ์จนกว่ากระบวนการจะเสร็จสิ้นการดำเนินการ ไม่สามารถใช้สำหรับการตรวจสอบกระบวนการทำงานแบบเรียลไทม์
Makesh

/ usr / bin / time -f '% M'
infomaniac

1
นอกจากนี้คุณยังสามารถเรียกใช้งานได้โดยใช้ \ time (พร้อมแบ็กสแลชเพื่อป้องกันการใช้เวลาภายในของเชลล์)
Raúl Salinas-Monteagudo

39

นี่เป็นบทสรุปที่ยอดเยี่ยมเกี่ยวกับเครื่องมือและปัญหา: ลิงค์ archive.org

ฉันจะพูดมันเพื่อให้ devs มากขึ้นจะอ่านจริง

หากคุณต้องการวิเคราะห์การใช้งานหน่วยความจำของทั้งระบบหรือวิเคราะห์การใช้งานหน่วยความจำของแอปพลิเคชั่นเดียวให้ละเอียด (ไม่ใช่เพียงแค่การใช้ฮีป) ให้ใช้ exmap exmapสำหรับการวิเคราะห์ระบบทั้งหมดค้นหากระบวนการที่มีการใช้งานอย่างมีประสิทธิภาพสูงสุดพวกเขาใช้หน่วยความจำมากที่สุดในทางปฏิบัติค้นหากระบวนการที่มีการใช้งานเขียนได้สูงสุดพวกเขาสร้างข้อมูลมากที่สุด (และอาจรั่วไหล เลือกแอปพลิเคชันดังกล่าวและวิเคราะห์การแมปในมุมมองที่สอง ดูส่วน exmap สำหรับรายละเอียดเพิ่มเติม ใช้xrestopเพื่อตรวจสอบการใช้ทรัพยากร X โดยเฉพาะอย่างยิ่งหากกระบวนการของเซิร์ฟเวอร์ X ใช้หน่วยความจำจำนวนมาก ดูส่วน xrestop สำหรับรายละเอียด

หากคุณต้องการตรวจหารอยรั่วใช้ valgrindหรืออาจจะเป็นkmtrace

หากคุณต้องการวิเคราะห์การใช้ heap (malloc เป็นต้น) ของแอปพลิเคชันให้รันในmemprofหรือด้วยkmtraceโปรไฟล์แอปพลิเคชันและค้นหาแผนผังการเรียกใช้ฟังก์ชันเพื่อการจัดสรรที่ใหญ่ที่สุด ดูส่วนของพวกเขาสำหรับรายละเอียดเพิ่มเติม


28

นอกเหนือจากวิธีแก้ไขปัญหาที่แสดงในคำตอบของเจ้าคุณสามารถใช้คำสั่ง Linux "top"; มันให้มุมมองเรียลไทม์แบบไดนามิกของระบบที่กำลังทำงานมันให้การใช้งาน CPU และหน่วยความจำสำหรับทั้งระบบพร้อมกับสำหรับทุกโปรแกรมเป็นเปอร์เซ็นต์:

top

เพื่อกรองโดยโปรแกรม pid:

top -p <PID>

เพื่อกรองตามชื่อโปรแกรม:

top | grep <PROCESS NAME>

"top" ยังมีบางฟิลด์เช่น:

VIRT - Virtual Image (kb): จำนวนหน่วยความจำเสมือนทั้งหมดที่ใช้โดยงาน

RES - ขนาดที่อยู่อาศัย (kb): หน่วยความจำฟิสิคัลที่ไม่มีการสลับที่งานได้ใช้ RES = รหัส + ข้อมูล

ข้อมูล - ขนาดข้อมูล + สแต็ก (kb): จำนวนหน่วยความจำฟิสิคัลที่รองรับที่นอกเหนือจากรหัสที่เรียกใช้งานได้ซึ่งรู้จักกันว่าขนาด 'ชุดข้อมูลที่อยู่อาศัย' หรือ DRS

SHR - ขนาดหน่วยความจำที่แชร์ (kb): จำนวนหน่วยความจำที่ใช้ร่วมกันที่ใช้โดยงาน มันสะท้อนถึงหน่วยความจำที่สามารถแชร์กับกระบวนการอื่นได้

อ้างอิงที่นี่


20

ไม่มีคำตอบเดียวสำหรับเรื่องนี้เพราะคุณไม่สามารถระบุจำนวนหน่วยความจำที่กระบวนการใช้ กระบวนการส่วนใหญ่ภายใต้ linux ใช้ shared library ตัวอย่างเช่นสมมติว่าคุณต้องการคำนวณการใช้หน่วยความจำสำหรับกระบวนการ 'ls' คุณนับเฉพาะหน่วยความจำที่ใช้โดย 'ls' ที่เรียกใช้งานได้ (ถ้าคุณสามารถแยกได้)? วิธีการเกี่ยวกับ libc หรือ libs อื่น ๆ ทั้งหมดที่จำเป็นต้องเรียกใช้ 'ls'

linux-gate.so.1 =>  (0x00ccb000)
librt.so.1 => /lib/librt.so.1 (0x06bc7000)
libacl.so.1 => /lib/libacl.so.1 (0x00230000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00162000)
libc.so.6 => /lib/libc.so.6 (0x00b40000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00cb4000)
/lib/ld-linux.so.2 (0x00b1d000)
libattr.so.1 => /lib/libattr.so.1 (0x00229000)
libdl.so.2 => /lib/libdl.so.2 (0x00cae000)
libsepol.so.1 => /lib/libsepol.so.1 (0x0011a000)

คุณสามารถยืนยันว่ากระบวนการเหล่านี้ใช้ร่วมกันโดยกระบวนการอื่น แต่ 'ls' ไม่สามารถรันบนระบบได้หากไม่มีการโหลด

นอกจากนี้หากคุณจำเป็นต้องรู้ว่าหน่วยความจำกระบวนการต้องใช้หน่วยความจำเท่าใดในการวางแผนความจุคุณต้องคำนวณจำนวนสำเนาเพิ่มเติมของกระบวนการที่ใช้ ฉันคิดว่า / proc / PID / สถานะอาจให้ข้อมูลการใช้หน่วยความจำเพียงพอในเวลาเดียว ในทางกลับกัน valgrind จะให้โปรไฟล์การใช้หน่วยความจำที่ดีขึ้นตลอดอายุการใช้งานของโปรแกรม


ฉันพยายามค้นหาจำนวนหน่วยความจำที่กระบวนการใช้บน VM และต้องการใช้การตั้งค่าขีด จำกัด หน่วยความจำใน kubernetes ฉันเห็นด้วยกับคำตอบนี้ดังนั้นจะใช้หน่วยความจำที่แสดงโดยpmap
Deepak Deore

16

หากรหัสของคุณอยู่ใน C หรือ C ++ คุณอาจสามารถใช้getrusage()ซึ่งคืนค่าสถิติต่าง ๆ เกี่ยวกับหน่วยความจำและการใช้เวลาของกระบวนการของคุณ

ไม่ใช่ทุกแพลตฟอร์มที่รองรับสิ่งนี้และจะส่งคืนค่า 0 สำหรับตัวเลือกการใช้หน่วยความจำ

แต่คุณสามารถดูไฟล์เสมือนที่สร้างขึ้นใน/proc/[pid]/statm(ซึ่ง[pid]จะถูกแทนที่ด้วย id กระบวนการของคุณคุณสามารถได้รับจากgetpid())

ไฟล์นี้จะดูเหมือนไฟล์ข้อความที่มีจำนวนเต็ม 7 ตัว คุณอาจสนใจหมายเลขแรก (ใช้หน่วยความจำทั้งหมด) และหมายเลขหก (ใช้หน่วยความจำข้อมูล) ในไฟล์นี้


โปรดทราบว่านี่ไม่รองรับทุกแพลตฟอร์ม
CashCow

ตามหน้า man Linux ( linux.die.net/man/2/getrusage ), getrusage เป็นส่วนหนึ่งของข้อกำหนด SVr4, 4.3BSD และ POSIX.1-2001 (สังเกตว่า POSIX ระบุเขตข้อมูล utime และ stime เท่านั้น) I จะไม่คาดหวังให้การทำงานบนแพลตฟอร์มที่ไม่ใช่ยูนิกซ์ (ยกเว้นบางทีผ่านสภาพแวดล้อมเช่น Cygwin ที่ให้ความสามารถในการ UNIX สำหรับแพลตฟอร์มอื่น ๆ .)
เดวิดซี

@DavidC OP กำลังถามเกี่ยวกับ Linux
Alexis Wilke

@CashCow คุณหมายถึงgetpid()เพราะฉันไม่ทราบถึงgetprocessid()ฟังก์ชั่นใน C / C ++ ภายใต้ Linux
Alexis Wilke

12

Valgrindสามารถแสดงข้อมูลโดยละเอียด แต่มันทำให้แอปพลิเคชันเป้าหมายช้าลงอย่างเห็นได้ชัดและส่วนใหญ่จะเปลี่ยนพฤติกรรมของแอป
Exmapเป็นสิ่งที่ฉันยังไม่รู้ แต่ดูเหมือนว่าคุณต้องการเคอร์เนลโมดูลเพื่อรับข้อมูลซึ่งอาจเป็นอุปสรรค

ฉันถือว่าสิ่งที่ทุกคนต้องการทราบ WRT "การใช้หน่วยความจำ" มีดังต่อไปนี้ ...
ใน linux จำนวนหน่วยความจำกายภาพที่กระบวนการเดียวอาจใช้สามารถแบ่งออกเป็นหมวดหมู่ดังต่อไปนี้

  • หน่วยความจำแมปที่ไม่ระบุชื่อ Ma

    • .p ส่วนตัว
      • .d dirty == malloc / mmapped heap และ stack ที่จัดสรรและเขียนหน่วยความจำ
      • .c clean == heap malloc / mmapped heap และหน่วยความจำสแต็กเมื่อจัดสรรเขียนแล้วเป็นอิสระ แต่ยังไม่ได้เรียกคืน
    • .s ที่แชร์
      • .d dirty == malloc / mmaped heap สามารถรับ copy-on-write และแบ่งใช้ระหว่างกระบวนการ (แก้ไข)
      • .c clean == heap malloc / mmaped สามารถรับ copy-on-write และแบ่งใช้ระหว่างกระบวนการ (แก้ไข)
  • Mn ชื่อหน่วยความจำที่แมป

    • .p ส่วนตัว
      • .dirty == ไฟล์หน่วยความจำที่เขียน mmapped ส่วนตัว
      • .c clean == แมปข้อความโปรแกรม / ไลบรารีที่แมปส่วนตัว
    • .s ที่แชร์
      • .d dirty == ไฟล์หน่วยความจำที่เขียนเป็นไฟล์ที่แบ่งใช้
      • .c clean == การแมปข้อความไลบรารีที่แมปไว้

ยูทิลิตี้ที่รวมอยู่ใน Android เรียกว่าshowmapค่อนข้างมีประโยชน์

virtual                    shared   shared   private  private
size     RSS      PSS      clean    dirty    clean    dirty    object
-------- -------- -------- -------- -------- -------- -------- ------------------------------
       4        0        0        0        0        0        0 0:00 0                  [vsyscall]
       4        4        0        4        0        0        0                         [vdso]
      88       28       28        0        0        4       24                         [stack]
      12       12       12        0        0        0       12 7909                    /lib/ld-2.11.1.so
      12        4        4        0        0        0        4 89529                   /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION
      28        0        0        0        0        0        0 86661                   /usr/lib/gconv/gconv-modules.cache
       4        0        0        0        0        0        0 87660                   /usr/lib/locale/en_US.utf8/LC_MEASUREMENT
       4        0        0        0        0        0        0 89528                   /usr/lib/locale/en_US.utf8/LC_TELEPHONE
       4        0        0        0        0        0        0 89527                   /usr/lib/locale/en_US.utf8/LC_ADDRESS
       4        0        0        0        0        0        0 87717                   /usr/lib/locale/en_US.utf8/LC_NAME
       4        0        0        0        0        0        0 87873                   /usr/lib/locale/en_US.utf8/LC_PAPER
       4        0        0        0        0        0        0 13879                   /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES
       4        0        0        0        0        0        0 89526                   /usr/lib/locale/en_US.utf8/LC_MONETARY
       4        0        0        0        0        0        0 89525                   /usr/lib/locale/en_US.utf8/LC_TIME
       4        0        0        0        0        0        0 11378                   /usr/lib/locale/en_US.utf8/LC_NUMERIC
    1156        8        8        0        0        4        4 11372                   /usr/lib/locale/en_US.utf8/LC_COLLATE
     252        0        0        0        0        0        0 11321                   /usr/lib/locale/en_US.utf8/LC_CTYPE
     128       52        1       52        0        0        0 7909                    /lib/ld-2.11.1.so
    2316       32       11       24        0        0        8 7986                    /lib/libncurses.so.5.7
    2064        8        4        4        0        0        4 7947                    /lib/libdl-2.11.1.so
    3596      472       46      440        0        4       28 7933                    /lib/libc-2.11.1.so
    2084        4        0        4        0        0        0 7995                    /lib/libnss_compat-2.11.1.so
    2152        4        0        4        0        0        0 7993                    /lib/libnsl-2.11.1.so
    2092        0        0        0        0        0        0 8009                    /lib/libnss_nis-2.11.1.so
    2100        0        0        0        0        0        0 7999                    /lib/libnss_files-2.11.1.so
    3752     2736     2736        0        0      864     1872                         [heap]
      24       24       24        0        0        0       24 [anon]
     916      616      131      584        0        0       32                         /bin/bash
-------- -------- -------- -------- -------- -------- -------- ------------------------------
   22816     4004     3005     1116        0      876     2012 TOTAL

10

ลองอีกสามวิธี:

  1. ps aux --sort pmem
    %MEMมันจะเรียงลำดับการส่งออกโดย
  2. ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
    มันเรียงลำดับโดยใช้ท่อ
  3. top -a
    มันเริ่มเรียงลำดับตาม %MEM

(สกัดจากที่นี่ )


2
topและอาจเป็นไปได้ว่าคนอื่นไม่ได้ให้การแสดงที่ถูกต้องของหน่วยความจำที่ใช้จริงโดยกระบวนการ ตัวอย่างเช่นฉันมี RAM 64GiB และฉันมี 10 postgresกระบวนการแต่ละการรายงาน 16GiB RES และ 25% MEM แน่นอนว่าพวกเขาไม่สามารถใช้ 25% ได้ ... แต่ละคนมี 15GiB SHR และดูเหมือนว่าพวกเขากำลังแบ่งปันสิ่งนั้น
sudo

8
#!/bin/ksh
#
# Returns total memory used by process $1 in kb.
#
# See /proc/NNNN/smaps if you want to do something
# more interesting.
#

IFS=$'\n'

for line in $(</proc/$1/smaps)
do
   [[ $line =~ ^Size:\s+(\S+) ]] && ((kb += ${.sh.match[1]}))
done

print $kb

5
ksh เป็นเปลือกมาตรฐาน อาจไม่ได้รับการติดตั้งตามค่าเริ่มต้นบนlinux distros สำหรับผู้ใช้เดสก์ท็อปหรือเพื่อวัตถุประสงค์ที่เรียบง่าย แต่มีเพียงคำสั่งเดียวในเกือบทุกระบบปฏิบัติการ unix- / linux (เช่นใน BSD ทั้งหมดใน UNIX จริงทั้งหมดใน RHEL บน SLES บน Debian บน Ubuntu บน OSX)
Florian Heigl

โดยค่าเริ่มต้นไฟล์นี้สามารถเข้าถึงได้โดยผู้ใช้รูทเท่านั้น
Dmitry Ginzburg

ต่อไปนี้เป็นเพียงการเขียนใหม่ข้างต้นsed | awkและทำงานใน Busybox v1.23.2: sed -n 's/^Size:\s\+\(\S\+\) .*/\1/p' /proc/$1/smaps | awk '{s+=$1} END {print s}'
JánSáreník

1
@Catskul - มาตรฐาน POSIX ระบุเชลล์มาตรฐานเป็นชุดย่อยที่เข้มงวดของ Korn เชลล์ซึ่งเป็นเวอร์ชันขั้นสูงของเชลล์ Bourne
ceph3us

8

ฉันกำลังใช้htop; มันเป็นโปรแกรมคอนโซลที่ดีมากเหมือนกับ Windows Task Manager


ฉันใช้htopและดีกว่าด้านบน แต่ก็ยังจะแสดงเธรดทั้งหมดจากแอพที่แตกต่างกันโดยไม่ต้องจัดกลุ่มพวกเขาทำให้มันเกือบจะไร้ประโยชน์เหมือนด้านบน
sorin

1
$ htop -p $ (pgrep <ชื่อกระบวนการของคุณ> | xargs | tr '' ',')
AAAfarmclub

6

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

gcore <pid>

ตรวจสอบขนาดของไฟล์คอร์ที่สร้างขึ้นเพื่อให้ได้ความคิดที่ดีว่ามีหน่วยความจำเท่าไหร่ที่กระบวนการเฉพาะกำลังใช้งานอยู่

สิ่งนี้จะทำงานได้ไม่ดีนักหากกระบวนการใช้หลายร้อยเมกะไบต์หรือกิ๊กเนื่องจากการสร้างคอร์อาจใช้เวลาหลายวินาทีหรือหลายนาทีในการสร้างขึ้นอยู่กับประสิทธิภาพของ I / O ในระหว่างการสร้างหลักกระบวนการจะหยุดทำงาน (หรือ "ตรึง") เพื่อป้องกันการเปลี่ยนแปลงหน่วยความจำ ดังนั้นระวัง

ตรวจสอบให้แน่ใจว่าจุดเชื่อมต่อที่สร้างแกนมีพื้นที่ว่างในดิสก์มากมายและระบบจะไม่ตอบสนองเชิงลบต่อไฟล์แกนที่สร้างในไดเรกทอรีนั้น


6

ฉันใช้ Arch Linux และมีแพ็คเกจที่ยอดเยี่ยมที่เรียกว่า ps_mem

ps_mem -p <pid>

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

$ ps_mem -S -p $(pgrep firefox)

Private   +   Shared  =  RAM used   Swap used   Program

355.0 MiB +  38.7 MiB = 393.7 MiB    35.9 MiB   firefox
---------------------------------------------
                        393.7 MiB    35.9 MiB
=============================================

5

บรรทัดคำสั่งด้านล่างจะให้หน่วยความจำทั้งหมดที่คุณใช้โดยกระบวนการต่างๆที่ทำงานบนเครื่อง Linux เป็น MB

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | awk '{total=total + $1} END {print total}'

5

การทดสอบที่ดีของการใช้ "โลกแห่งความเป็นจริง" ที่มากขึ้นคือการเปิดแอปพลิเคชันจากนั้นเรียกใช้vmstat -sและตรวจสอบสถิติ "หน่วยความจำที่ใช้งานอยู่" ปิดแอปพลิเคชันรอสักครู่แล้วรันvmstat -sอีกครั้ง อย่างไรก็ตามหน่วยความจำที่แอคทีฟจำนวนมากถูกปล่อยให้ใช้งานโดยแอป


3
มันจะดีกว่า ps อย่างไร มันมาพร้อมกับข้อ จำกัด ทั้งหมดของ ps และไม่แม่นยำยิ่งขึ้น ...
Lester Cheung

ระบบ Unix ทั่วไปมีกระบวนการเริ่มต้นและสิ้นสุดตลอดเวลา คุณไม่สามารถทำนาย RAM ว่างของคุณได้
Raúl Salinas-Monteagudo

4

รับ valgrind ให้โปรแกรมของคุณทำงานและมันจะบอกคุณมากมายเกี่ยวกับการใช้หน่วยความจำ

สิ่งนี้จะใช้กับกรณีของโปรแกรมที่รันในบางเวลาและหยุด ฉันไม่รู้ว่า valgrind สามารถรับมือกับกระบวนการที่รันอยู่แล้วหรือไม่ควรหยุดกระบวนการเช่น daemons


ไม่ไม่สามารถ "แนบ" valgrind กับกระบวนการทำงานได้ นั่นคือจากการออกแบบ
Dima Tisnek

3

แก้ไข: งานได้ดี 100% เมื่อการใช้หน่วยความจำเพิ่มขึ้นเท่านั้น

หากคุณต้องการตรวจสอบการใช้งานหน่วยความจำตามกระบวนการที่กำหนด (หรือกลุ่มของชื่อสามัญที่ใช้ร่วมกันที่ผ่านการประมวลผลเช่นgoogle-chromeคุณสามารถใช้ bash-script ของฉัน:

while true; do ps aux | awk ‚{print $5, $11}’ | grep chrome | sort -n > /tmp/a.txt; sleep 1; diff /tmp/{b,a}.txt; mv /tmp/{a,b}.txt; done;

สิ่งนี้จะค้นหาการเปลี่ยนแปลงและพิมพ์อย่างต่อเนื่อง

ป้อนคำอธิบายรูปภาพที่นี่


3

ถ้าคุณต้องการบางสิ่งบางอย่างได้เร็วกว่า profiling กับ Valgrind และเคอร์เนลของคุณเป็นรุ่นเก่าและคุณไม่สามารถใช้ smaps เป็น PS มีตัวเลือกในการแสดงชุดที่มีถิ่นที่อยู่ของกระบวนการ (กับps -o rss,command) สามารถให้คุณได้อย่างรวดเร็วและเหมาะสม_aproximation_ของจำนวนเงินที่แท้จริงของ หน่วยความจำที่ไม่ใช้การสลับ


3

ฉันอยากจะแนะนำให้คุณใช้บนยอดเขา คุณสามารถพบทุกสิ่งเกี่ยวกับมันในหน้านี้ มีความสามารถในการให้ KPI ที่จำเป็นทั้งหมดสำหรับกระบวนการของคุณและยังสามารถจับภาพไปยังไฟล์


2
ในการแสดง PSIZE ["ขนาดหน่วยความจำแบบสัดส่วนของกระบวนการนี้ (หรือผู้ใช้)] เปิดใช้งานโดยใช้atop -Rเพื่อแสดงการสรุปแบบต่อผู้ใช้pเพื่อเรียงตามการใช้งานหน่วยความจำแบบกด 'M' จากภายใน atop สิ่งนี้ให้ตัวเลขที่คล้ายกัน
Markus Strauss


1

โหวตอีกครั้งสำหรับ ที่นี่ แต่ฉันต้องการเพิ่มว่าคุณสามารถใช้เครื่องมือเช่นAlleyoopเพื่อช่วยคุณตีความผลลัพธ์ที่สร้างขึ้นโดย valgrind

ฉันใช้เครื่องมือทั้งสองตลอดเวลาและมักจะมีรหัสที่ไม่มีการรั่วไหลเพื่อแสดงให้เห็นอย่างภูมิใจ;)


1

ในขณะที่คำถามนี้ดูเหมือนจะเกี่ยวกับการตรวจสอบกระบวนการที่กำลังทำงานอยู่ผมต้องการเห็นหน่วยความจำสูงสุดที่แอปพลิเคชันใช้ตั้งแต่ต้นจนจบ นอกจาก valgrind คุณสามารถใช้tstimeซึ่งง่ายกว่ามาก มันวัดการใช้หน่วยความจำ "highwater" (RSS และเสมือน) จากคำตอบนี้


แอปพลิเคชั่นส่วนใหญ่ - นั่นคือแอปพลิเคชันที่ใช้ไลบรารีหน่วยความจำ malloc () และเหมือน malloc - จะไม่ส่งคืนหน้าไปยังระบบปฏิบัติการจนกว่าจะสิ้นสุดกระบวนการ ดังนั้นจำนวนเงินที่คุณเห็นด้วย PS (หรือเครื่องมืออื่น ๆ ที่ไม่ได้ขุดลงในกองของกระบวนการ) จะเป็นเครื่องหมายที่มีค่าสูง
David C.

0

ขึ้นอยู่กับคำตอบที่เกี่ยวข้องกับคำถาม

คุณอาจใช้ SNMP เพื่อรับหน่วยความจำและการใช้ cpu ของกระบวนการในอุปกรณ์เฉพาะในเครือข่าย :)

ที่ต้องการ:

  • อุปกรณ์ที่ใช้กระบวนการควรมี snmp ติดตั้งและใช้งานอยู่
  • snmp ควรได้รับการกำหนดค่าให้รับคำขอจากที่คุณจะเรียกใช้สคริปต์ด้านล่าง (อาจถูกกำหนดค่าใน snmpd.conf)
  • คุณควรทราบรหัสกระบวนการ (pid) ของกระบวนการที่คุณต้องการตรวจสอบ

หมายเหตุ:

  • HOST-RESOURCES-MIB :: hrSWRunPerfCPUคือจำนวน centi-seconds ของทรัพยากร CPU ทั้งหมดของระบบที่ใช้โดยกระบวนการนี้ โปรดทราบว่าในระบบมัลติโปรเซสเซอร์ค่านี้อาจเพิ่มขึ้นมากกว่าหนึ่งเซ็นติเมตรในเวลาหนึ่งเซ็นติเมตรของนาฬิกาเรียลไทม์ (นาฬิกาแขวนผนัง)

  • HOST-RESOURCES-MIB :: hrSWRunPerfMemคือจำนวนหน่วยความจำระบบจริงทั้งหมดที่จัดสรรให้กับกระบวนการนี้

**

สคริปต์การตรวจสอบกระบวนการ:

**

echo "IP: "
read ip
echo "specfiy pid: "
read pid
echo "interval in seconds:"
read interval

while [ 1 ]
do
    date
    snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfCPU.$pid
    snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfMem.$pid
    sleep $interval;
done

0

/ prox / xxx / numa_maps ให้ข้อมูลบางอย่างที่นั่น: N0 = ??? N1 = ??? แต่ผลลัพธ์นี้อาจต่ำกว่าผลลัพธ์จริงเนื่องจากจะนับเฉพาะสิ่งที่ได้สัมผัส


-1

ใช้เครื่องมือ GUI ในตัว ' ตรวจสอบระบบ ' เครื่องมือที่มีอยู่ใน Ubuntu


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