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


240

ฉันมีเซิร์ฟเวอร์ที่มีหน่วยความจำ 12G ส่วนของส่วนบนแสดงอยู่ด้านล่าง:

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                                                                                                      
12979 frank  20   0  206m  21m  12m S   11  0.2  26667:24 krfb                                                                                                                                                                                                                                                          
13 root      15  -5     0    0    0 S    1  0.0  36:25.04 ksoftirqd/3                                                                                                                                                                                                                                                   
59 root      15  -5     0    0    0 S    0  0.0   4:53.00 ata/2                                                                                                                                                                                                                                                         
2155 root      20   0  662m  37m 8364 S    0  0.3 338:10.25 Xorg                                                                                                                                                                                                                                                          
4560 frank  20   0  8672 1300  852 R    0  0.0   0:00.03 top                                                                                                                                                                                                                                                           
12981 frank  20   0  987m  27m  15m S    0  0.2  45:10.82 amarok                                                                                                                                                                                                                                                        
24908 frank  20   0 16648  708  548 S    0  0.0   2:08.84 wrapper                                                                                                                                                                                                                                                       
1 root      20   0  8072  608  572 S    0  0.0   0:47.36 init                                                                                                                                                                                                                                                          
2 root      15  -5     0    0    0 S    0  0.0   0:00.00 kthreadd

การfree -mแสดงต่อไปนี้:

             total       used       free     shared    buffers     cached
Mem:         12038      11676        362          0        599       9745
-/+ buffers/cache:       1331      10706
Swap:         2204        257       1946

หากฉันเข้าใจถูกต้องระบบจะมีหน่วยความจำที่พร้อมใช้งานเพียง 362 MB คำถามของฉันคือฉันจะทราบได้อย่างไรว่ากระบวนการใดที่ใช้หน่วยความจำเกือบทั้งหมด

เช่นเดียวกับข้อมูลพื้นฐาน, 64bit OpenSuse 12ระบบทำงาน


คำตอบ:


280

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

find /home -type f -name '*.mp3'
find /home -type f -name '*.aac'

และให้findอินสแตนซ์ที่สองทำงานด้วยความเร็วที่ไร้สาระ

Linux ปล่อยหน่วยความจำเพียงเล็กน้อย 'ฟรี' เพื่อจัดการกับหนามในการใช้งานหน่วยความจำโดยไม่ต้องใช้ความพยายามมากเกินไป

ประการที่สองคุณต้องการค้นหากระบวนการที่กินความทรงจำทั้งหมดของคุณ ในการtopใช้Mคำสั่งเพื่อเรียงลำดับตามการใช้หน่วยความจำ รู้สึกฟรีที่จะเพิกเฉยVIRTคอลัมน์ที่เพิ่งบอกคุณว่ามีการจัดสรรหน่วยความจำเสมือนเท่าไหร่ไม่ได้ใช้หน่วยความจำเท่าไหร่ในกระบวนการ RESรายงานว่ามีหน่วยความจำอยู่ในหน่วยความจำมากเท่าใดหรือมีหน่วยความจำอยู่ในปัจจุบัน (เมื่อเทียบกับการสลับไปยังดิสก์หรือไม่เคยจัดสรรจริงในตอนแรกแม้จะถูกร้องขอก็ตาม)

แต่เนื่องจากRESจะนับเช่น/lib/libc.so.6หน่วยความจำหนึ่งครั้งสำหรับเกือบทุกกระบวนการจึงไม่ได้เป็นการวัดที่ยอดเยี่ยมของจำนวนหน่วยความจำที่กระบวนการใช้ SHRรายงานคอลัมน์หน่วยความจำเท่าใดจะใช้ร่วมกันกับกระบวนการอื่น ๆ แต่ไม่มีการรับประกันว่ากระบวนการอื่นที่เป็นจริงร่วมกันไม่ - มันอาจจะเป็นที่แชร์ได้เพียงแค่ไม่มีใครต้องการแบ่งปัน

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


ดังนั้นถ้าเพียงแค่ "ฟรี" คอลัมน์สถิติลดลงแสดงว่าไม่มีอะไรแตกต่างกันเราสามารถสรุปหน่วยความจำที่ถูกจัดสรรโดยเคอร์เนลลินุกซ์ในการจัดเก็บสิ่งที่ไฟล์และจะให้หน่วยความจำกับกระบวนการอื่น ๆ เมื่อ nessary?
Al2O3

@ Rubby นั่นอาจเป็นจริง /proc/meminfoและ/proc/slabinfoไฟล์รายละเอียดสิ่งที่เคอร์เนลจะใช้เก็บข้อมูลสำหรับ - The slabtopโปรแกรมเป็นอย่างมากเช่นtopแต่แสดงให้เห็นว่าการจัดสรรพื้นมีการจัดสรรเท่าใดสิ่งที่อัตราส่วนของพวกเขาเป็นเหมือน ฯลฯ
sarnold

ขอบคุณสำหรับเคล็ดลับใน 'smem' - ฉันต้องการให้ Linux "เสีย" RAM บางส่วนเพื่อให้เครื่องของฉันสามารถทำงานได้อย่างรวดเร็ว หาก 'ค้นหา' ใช้เวลานานขึ้นในการผ่านรอบที่ 2 มันก็โอเค เมาส์ที่ติดอยู่และหน้าต่างที่ตรึงในขณะที่ Linux ตัดสินใจว่า RAM (ซึ่งมี hogged โดยไม่จำเป็น) จำเป็นต้องถูกล้างและจัดสรรใหม่ให้กับสิ่งที่ฉันกำลังทำอยู่ตอนนี้ - หรือแม้แต่สลับไปที่ดิสก์ - ไม่ใช่ตัวเลือก ฉันมี RAM 16 GB ในกล่องนี้และฉันคาดว่าหลาย GB จะได้รับการเก็บรักษาฟรีและพร้อมใช้งานสำหรับแอปพลิเคชันที่ใช้งาน
JosephK

@JosephK การเลื่อนเมาส์มีส่วนเกี่ยวข้องกับการจัดลำดับความสำคัญและอัลกอริธึมมากขึ้น หากการจัดสรรหน่วยความจำมีความจำเป็นในการย้ายตัวชี้เมาส์แสดงว่ามีบางอย่างผิดปกติกับซอฟต์แวร์ที่คุณใช้ :)
sarnold

2
@JosephK จริง ๆ แล้วมันใช้เวลาน้อยกว่าเคอร์เนลในการเปลี่ยนตำแหน่งหน่วยความจำจากการใช้หนึ่งไปยังอีกการใช้งานมากกว่าที่จะนำหน่วยความจำว่างไปใช้ หนึ่งต้องยอมรับและแก้ไขรายการฟรีอื่น ๆ ไม่ น่าเสียดายที่นี่เป็นคำถาม XY ปัญหาเกี่ยวข้องกับประสิทธิภาพและอาจไม่เกี่ยวข้องกับการใช้หน่วยความจำทั้งหมด (แม้จะมีหลักฐานว่าการเพิ่มหน่วยความจำฟรีช่วยได้นั่นอาจเป็นเหตุผลที่ซับซ้อนกว่าผู้ต้องสงสัย OP) แต่พวกเขาถามเกี่ยวกับการวิเคราะห์การใช้หน่วยความจำ นั่นเป็นคำตอบที่มีประโยชน์น้อยกว่าถามเกี่ยวกับปัญหาจริง
David Schwartz

321

ใช้เคล็ดลับด่วนโดยใช้คำสั่งด้านบนใน linux / unix

$ top

จากนั้นกดShift+ m(เช่นเขียนเมืองหลวงM)

จาก man top

SORTING of task window
  For compatibility, this top supports most of the former top sort keys.
  Since this is primarily a service to former top users, these commands do
  not appear on any help screen.
    command   sorted-field                  supported
      A         start time (non-display)      No
      M         %MEM                          Yes
      N         PID                           Yes
      P         %CPU                          Yes
      T         TIME+                         Yes

หรืออีกทางหนึ่ง: ตี Shift + fแล้วเลือกการแสดงผลที่สั่งซื้อโดยการใช้หน่วยความจำโดยการกดปุ่มคีย์แล้วกดn Enterคุณจะเห็นกระบวนการที่ใช้งานได้รับคำสั่งจากการใช้หน่วยความจำ


71
หรือคุณสามารถกดM( Shift+ m)
Patryk

8
@risnandar มีวิธีแสดงหน่วยความจำเป็น MB ไม่ใช่%
codecowboy

2
สวัสดี codecowboy บางทีคุณสามารถดูcommandlinefu.com/commands/view/3/…สำหรับหน่วยความจำรายละเอียดเพิ่มเติมที่ใช้ในเซิร์ฟเวอร์ของฉันฉันใช้แอพของบุคคลที่สามเช่นnewrelic.com
risnandar

6
หรือเพียงแค่ top -o mem -O cpu
skipy

ใน Ubuntu 16 ฉันต้องการtop -o RES"มิฉะนั้นจำชื่อฟิลด์ 'mem'" เป็นอย่างอื่น
AdamS


28

แรกที่คุณควรอ่านคำอธิบายเกี่ยวกับการส่งออกของ freeBottom line: คุณมีหน่วยความจำอย่างน้อย10.7 GB ที่พร้อมใช้งานโดยกระบวนการ

จากนั้นคุณควรกำหนดว่า "การใช้หน่วยความจำ" สำหรับกระบวนการใด (ไม่ใช่เรื่องง่ายหรือไม่น่าเชื่อถือเชื่อฉัน)

จากนั้นเราอาจช่วยได้มากขึ้น :-)


คุณได้รับ 10.7 จากที่ไหน จากบัฟเฟอร์ / แคช [ฟรี] หรือไม่ ขอบคุณสำหรับลิงค์ฉันจะอ่านมัน
user3111525

3
ใช่. ประเด็นคือหน่วยความจำส่วนใหญ่ถูกใช้โดยบัฟเฟอร์และแคช หน่วยความจำนี้สามารถ "ทิ้ง" ได้ทันทีหากกระบวนการใดต้องการหน่วยความจำเพิ่มเติม เมื่อคุณลบจำนวนหน่วยความจำที่ใช้สำหรับบัฟเฟอร์ / แคชจากจำนวนเงินที่ใช้หรือเพิ่มจำนวนเงินฟรีคุณจะได้รับตัวเลขในบรรทัดที่สองที่แล้ว imples ที่เพียง 1.3 กิ๊กจริงๆใช้หรือเห็นจากที่อื่น ๆ มุม, คุณมีหน่วยความจำที่พร้อมใช้งาน 10.7 กิ๊ก (เนื่องจากบัฟเฟอร์และแคชสามารถติดตั้งตามความต้องการได้)
stolsvik

21

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

ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS

7
หรือ:ps -e -orss=,args= | sort -nr | head
kenorb

17

ps aux --sort '%mem'

จากprocps 'ps (ค่าเริ่มต้นใน Ubuntu 12.04) สร้างผลลัพธ์เช่น:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
tomcat7   3658  0.1  3.3 1782792 124692 ?      Sl   10:12   0:25 /usr/lib/jvm/java-7-oracle/bin/java -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -D
root      1284  1.5  3.7 452692 142796 tty7    Ssl+ 10:11   3:19 /usr/bin/X -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
ciro      2286  0.3  3.8 1316000 143312 ?      Sl   10:11   0:49 compiz
ciro      5150  0.0  4.4 660620 168488 pts/0   Sl+  11:01   0:08 unicorn_rails worker[1] -p 3000 -E development -c config/unicorn.rb             
ciro      5147  0.0  4.5 660556 170920 pts/0   Sl+  11:01   0:08 unicorn_rails worker[0] -p 3000 -E development -c config/unicorn.rb             
ciro      5142  0.1  6.3 2581944 239408 pts/0  Sl+  11:01   0:17 sidekiq 2.17.8 gitlab [0 of 25 busy]                                                                          
ciro      2386  3.6 16.0 1752740 605372 ?      Sl   10:11   7:38 /usr/lib/firefox/firefox

ดังนั้นที่นี่ Firefox คือผู้บริโภคอันดับต้น ๆ ที่มีหน่วยความจำ 16% ของฉัน

คุณอาจสนใจ:

ps aux --sort '%cpu'

4

คุณสามารถระบุคอลัมน์ที่จะเรียงลำดับโดยทำตามขั้นตอนต่อไปนี้:

ขั้นตอน
* ด้านบน
* shift + F
* เลือกคอลัมน์จากรายการ
    เช่น n หมายถึงจัดเรียงตามหน่วยความจำ
* กดปุ่มตกลง
* ตกลง

1
คำตอบของ risnandar ซ้ำซ้อนด้านบน
benjaoming

3

คุณสามารถเห็นการใช้หน่วยความจำได้โดยรันโค้ดนี้ในเทอร์มินัลของคุณ:

$ watch -n2 free -m
$ htop

3

วิธีรวมหน่วยความจำที่ใช้หมดแล้วโดยชื่อกระบวนการ:

บางครั้งถึงกับมองหากระบวนการเดียวที่ยิ่งใหญ่ที่สุดก็ยังมีหน่วยความจำที่ใช้งานจำนวนมากซึ่งไม่ได้รับการยอมรับ ในการตรวจสอบว่ามีกระบวนการเล็ก ๆ ที่เหมือนกันจำนวนมากโดยใช้หน่วยความจำหรือไม่คุณสามารถใช้คำสั่งต่อไปนี้ซึ่งใช้ awk เพื่อรวมหน่วยความจำทั้งหมดที่ใช้โดยกระบวนการที่ใช้ชื่อเดียวกัน:

ps -e -orss=,args= |awk '{print $1 " " $2 }'| awk '{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}' | sort -n

เช่นเอาท์พุท

9344 docker 1
9948 nginx: 4
22500 /usr/sbin/NetworkManager 1
24704 sleep 69
26436 /usr/sbin/sshd 15
34828 -bash 19
39268 sshd: 10
58384 /bin/su 28
59876 /bin/ksh 29
73408 /usr/bin/python 2
78176 /usr/bin/dockerd 1
134396 /bin/sh 84
5407132 bin/naughty_small_proc 1432
28061916 /usr/local/jdk/bin/java 7

0

ในเวลานี้ที่สองมาก

ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4

ปรับปรุงอย่างต่อเนื่อง

watch -n 1 'ps -U $(whoami) -eom pid,pmem,pcpu,comm | head -n4'

ฉันยังเพิ่มสารพัดไม่กี่ที่นี่คุณอาจชื่นชม (หรือคุณอาจไม่สนใจ)

-n 1 ดูและอัปเดตทุก ๆ วินาที

-U $(whoami)เพื่อแสดงกระบวนการของคุณเท่านั้น $ (บางคำสั่ง) ประเมินผลทันที

| head -n4 หากต้องการแสดงส่วนหัวและกระบวนการ 3 รายการต่อครั้งบ่อยครั้งคุณต้องมีรายการโฆษณาที่มีการใช้งานสูง

${1-4}กล่าวว่าอาร์กิวเมนต์แรกของ$1ฉันฉันต้องการเริ่มต้นที่ 4 เว้นแต่ฉันจะให้มัน

หากคุณใช้ mac คุณอาจต้องติดตั้งนาฬิกาก่อน

brew install watch 

หรือคุณอาจใช้ฟังก์ชั่น

psm(){
    watch -n 1 "ps -eom pid,pmem,pcpu,comm | head -n ${1-4}"
    # EXAMPLES: 
    # psm 
    # psm 10
}

และคุณสามารถเรียงลำดับโดย cpu ได้อย่างง่ายดายหากคุณเปลี่ยน-mเป็น-r
jasonleonhard

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