Linux: ค้นหาว่ากระบวนการใดที่ใช้ RAM ทั้งหมด?


127

ก่อนถามจริง ๆ ต้องชัดเจน: ใช่ฉันรู้เกี่ยวกับแคชดิสก์และไม่ใช่มันไม่ใช่กรณีของฉัน :) ขออภัยสำหรับคำนำนี้ :)

ฉันใช้ CentOS 5 ทุกแอปพลิเคชันในระบบมีการแลกเปลี่ยนอย่างหนักและระบบช้ามาก เมื่อฉันทำfree -mนี่คือสิ่งที่ฉันได้รับ:

             total       used       free     shared    buffers     cached
Mem:          3952       3929         22          0          1         18
-/+ buffers/cache:       3909         42
Swap:        16383         46      16337

ดังนั้นฉันมีเพียง 42 Mb ใช้จริง! เท่าที่ฉันเข้าใจ-/+ buffers/cacheจริง ๆ แล้วไม่ได้นับแคชดิสก์ดังนั้นฉันมีเพียง 42 Mb เท่านั้นใช่ไหม ฉันคิดว่าฉันอาจผิดฉันจึงพยายามปิดการแคชดิสก์และไม่มีผลใด ๆ - ภาพยังคงเหมือนเดิม

ดังนั้นฉันตัดสินใจว่าใครใช้ RAM ทั้งหมดของฉันและฉันใช้topมัน แต่เห็นได้ชัดว่ามันรายงานว่าไม่มีกระบวนการใดใช้ RAM ของฉัน กระบวนการเดียวที่อยู่บนสุดของฉันคือ MySQL แต่ใช้ 0.1% ของ RAM และ 400Mb ของการแลกเปลี่ยน รูปภาพเดียวกันเมื่อฉันพยายามเรียกใช้บริการหรือแอปพลิเคชันอื่น - ทั้งหมดไปใน swap topแสดงว่า MEM ไม่ได้ใช้ (สูงสุด 0.1% สำหรับกระบวนการใด ๆ )

top - 15:09:00 up  2:09,  2 users,  load average: 0.02, 0.16, 0.11
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4046868k total,  4001368k used,    45500k free,      748k buffers
Swap: 16777208k total,    68840k used, 16708368k free,    16632k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP COMMAND
 3214 ntp       15   0 23412 5044 3916 S  0.0  0.1   0:00.00  17m ntpd
 2319 root       5 -10 12648 4460 3184 S  0.0  0.1   0:00.00 8188 iscsid
 2168 root      RT   0 22120 3692 2848 S  0.0  0.1   0:00.00  17m multipathd
 5113 mysql     18   0  474m 2356  856 S  0.0  0.1   0:00.11 472m mysqld
 4106 root      34  19  251m 1944 1360 S  0.0  0.0   0:00.11 249m yum-updatesd
 4109 root      15   0 90152 1904 1772 S  0.0  0.0   0:00.18  86m sshd
 5175 root      15   0 90156 1896 1772 S  0.0  0.0   0:00.02  86m sshd

เริ่มต้นใหม่ไม่ได้ช่วยและโดยวิธีพวกเขาช้ามากซึ่งปกติฉันจะไม่คาดหวังในเครื่องนี้ (4 คอร์, 4Gb RAM, RAID1)

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

ดังนั้นในที่สุดคำถามคือ - ถ้ามีคนมีความคิดวิธีการหากระบวนการที่ใช้หน่วยความจำอย่างหนักจริง ๆ ?


1
คุณเคยพบคำตอบนี้หรือไม่?
Hackeron

@Hackeron: OP ยอมรับคำตอบนี้ ฉันรู้ว่าคำตอบไม่ได้อยู่ที่คำถามของคุณแม้ว่า ฉันสามารถทำซ้ำปัญหาของคุณบนเซิร์ฟเวอร์ของฉันและตอนนี้ฉันกำลังค้นคว้าว่ามีวิธีการแก้ไขปัญหา
Deltik

@Deltik Ah ตกลง ขอบคุณ :) - ฉันมีเซิร์ฟเวอร์ 2 เครื่องที่นี่ซึ่งมีหน่วยความจำรั่วในพื้นที่ประมาณ 12 ชั่วโมงแจ้งให้เราทราบหากมีสิ่งใดที่ฉันสามารถทำได้เพื่อช่วยวินิจฉัยปัญหานี้ ฉันสามารถเข้าถึงได้ในฐานะชื่อเล่น "แฮ็กเกอร์" ใน IRC (irc.freenode.org)
Hackeron

@Hackeron: ผมไม่สามารถที่จะหาว่าคุณเป็น "hackeron" irc.freenode.orgบน ฉันไม่ได้สร้างห้องสนทนาสำหรับการสนทนาต่อเนื่องได้ที่นี่
Deltik

มูลค่า noting ที่ ZFS ARC ในหน่วยความจำ (และ / หรือ L2ARC) แคชไม่แสดงในแต่ขนาดของมันสามารถสอบถามเกี่ยวกับลินุกซ์ด้วยfree -m cat /proc/spl/kstat/zfs/arcstats | grep data_size
kqr

คำตอบ:


112

บน Linux ในtopกระบวนการคุณสามารถกด<ปุ่มเพื่อเลื่อนเรียงลำดับการแสดงผลทางซ้าย โดยค่าเริ่มต้นมันจะถูกจัดเรียงตาม%CPUดังนั้นหากคุณกดปุ่ม 4 ครั้งคุณจะเรียงลำดับตามVIRTขนาดหน่วยความจำเสมือนที่ให้คำตอบของคุณ

อีกวิธีในการทำเช่นนี้คือ:

ps -e -o pid,vsz,comm= | sort -n -k 2

ควรให้ผลลัพธ์ที่เรียงลำดับตามขนาดเสมือนจริงของคุณ

นี่คือรุ่นยาว:

ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2

นั่นให้ฉันWarning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.htmlบนเซิร์ฟเวอร์ Ubuntu 11.10
Der Hochstapler

1
@OliverSalzburg ปัญหาคือ-oตัวเลือก RHEL4 ใช้งานได้ RHEL5: ps -e -o pid,vsz,comm= | sort -n -k 2ใช้ได้ ฉันจะลองคืนนี้ 11.10 ภายหลัง แต่ถ้าคุณพบตัวเลือกการเรียงลำดับที่ถูกต้องก่อนโปรดแจ้งให้เราทราบ ps -e -o pid,vsz,comm | sort -n -k 2อาจใช้ได้ แต่ฉันไม่มีที่ให้ยืนยันในขณะนี้
Karlson

2
ฉันไม่คุ้นเคยกับ-efตัวเลือก แต่สิ่งนี้ดูเหมือนว่าจะสร้างผลลัพธ์ที่สมเหตุสมผล:sudo ps axo pid,vsz,comm=|sort -n -k 2
Der Hochstapler

1
Ty ฉันชอบคำแนะนำยอดนิยมของ<ฉันไม่ทราบว่าเป็นไปได้ fedora
SSH

2
เวอร์ชั่นที่ได้รับการแก้ไขเล็กน้อยเพื่อรับกระบวนการที่ใช้RAMและแสดงคำสั่งทั้งหมด:ps -e --format=pid,rss,args | sort --numeric-sort --key=2
sengs

71

แสดงหน่วยความจำกระบวนการเป็นเมกะไบต์และเส้นทางกระบวนการ

ps aux  | awk '{print $6/1024 " MB\t\t" $11}'  | sort -n

8
ยินดีต้อนรับสู่ Super User คุณสามารถขยายคำตอบของคุณเพื่ออธิบายว่าโค้ดนี้ทำอะไรได้บ้างและแก้ไขปัญหาได้อย่างไร? โค้ดที่ไม่ได้อธิบายนั้นไม่ได้รับการสนับสนุนเนื่องจากไม่ได้สอนวิธีแก้ปัญหา ขอบคุณ
fixer1234

9
ฉันประหลาดใจที่คำตอบนี้ downvoted และมีความคิดเห็นขอให้อธิบาย .. มันสั้นพอที่มันควรจะชัดเจนว่ามันทำอะไร (ท่อ ps aux เข้า awk แล้วเรียงลำดับ) และในบริบทของคำถามมันแสดงให้เห็น กระบวนการใดที่ใช้ RAM ส่วนใหญ่ ฉันคิดว่ามันเป็นคำตอบที่ดี
จอห์น

14

แค่ข้อความด้านบนเซิร์ฟเวอร์ที่แสดงอาการเดียวกัน แต่ยังคงแสดงหน่วยความจำหมด สิ่งที่พบคือ sysctl.conf จากกล่องที่มี RAM ขนาด 32 GB และตั้งค่าสำหรับ DB ที่มีเพจขนาดใหญ่ที่กำหนดค่าไว้ที่ 12000 กล่องนี้มี RAM เพียง 2 GB เท่านั้นดังนั้นจึงกำหนด RAM ฟรีทั้งหมดให้กับเพจขนาดใหญ่ (เท่านั้น 960 ของพวกเขา) การตั้งค่าหน้าเว็บขนาดใหญ่เป็น 10 เนื่องจากไม่มีผู้ใช้คนใดเลยทำให้หน่วยความจำทั้งหมดเป็นอิสระ

การตรวจสอบอย่างรวดเร็วของ / proc / meminfo เพื่อค้นหาการตั้งค่า HugePages_ อาจเป็นการเริ่มต้นที่ดีในการแก้ไขปัญหาอย่างน้อยหนึ่งหน่วยความจำที่ไม่คาดคิด


2
ฉันเพิ่งมีเซิร์ฟเวอร์อื่นที่เป็นปัญหา หากองค์กรของคุณมีพนักงานของอดีต Oracle อยู่การตั้งค่านี้อาจเป็นสาเหตุของคุณ
เขตข้อมูล

5

ในกรณีของฉันปัญหาคือเซิร์ฟเวอร์เป็นเซิร์ฟเวอร์เสมือนของ VMware ที่vmw_balloonเปิดใช้งานโมดูล:

$ lsmod | grep vmw_balloon
vmw_balloon            20480  0
vmw_vmci               65536  2 vmw_vsock_vmci_transport,vmw_balloon

วิ่ง:

$ vmware-toolbox-cmd stat balloon
5189 MB

ดังนั้นหน่วยความจำประมาณ 5 GB จึงได้รับการเรียกคืนโดยโฮสต์ ดังนั้นแม้จะมี 8 GB ถึง VM ของฉัน "เป็นทางการ" แต่ในทางปฏิบัติมันน้อยกว่ามาก:

$ free
              total        used        free      shared  buff/cache   available
Mem:        8174716     5609592       53200       27480     2511924     2458432
Swap:       8386556        6740     8379816

2

คุณยังสามารถใช้คำสั่ง ps เพื่อรับข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการ

ps aux | less

จากความอยากรู้วิธีที่ถูกต้องในการหลบหนีคำสั่งนี้คืออะไร? มันแสดงให้เห็นว่าเมื่อฉันไปถึงบรรทัดสุดท้ายมันไม่ได้ฆ่ากระบวนการเมื่อฉัน Ctrl + C มัน
KingsInnerSoul

1
@KingsInnerSoul กด 'q'
enobayram

2

ฉันอ้างถึงสิ่งนี้และหน่วยความจำทั้งหมดที่ใช้โดยกระบวนการ Python? - Stack Overflowนั่นคือคำตอบของฉัน ตอนนี้ฉันได้รับเครื่องมือนับเฉพาะ (python)

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

แนบรายการกระบวนการของฉัน

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

การอ้างอิง


1

สร้างสคริปต์ที่show-memory-usage.shมีเนื้อหา:

#!/bin/sh
ps -eo rss,pid,user,command | sort -rn | head -10 | awk '{ hr[1024**2]="GB"; hr[1024]="MB";
 for (x=1024**3; x>=1024; x/=1024) {
 if ($1>=x) { printf ("%-6.2f %s ", $1/x, hr[x]); break }
 } } { printf ("%-6s %-10s ", $2, $3) }
 { for ( x=4 ; x<=NF ; x++ ) { printf ("%s ",$x) } print ("\n") }
 '

6
ทำไม? สิ่งนี้ทำอะไร มันทำงานยังไง? อย่าบอกให้คนอื่นใช้รหัสสุ่ม อธิบายวัตถุประสงค์และวิธีการทำงาน
CVn

2
รูปที่ฉันจะอธิบายรหัสสำหรับผู้ที่ไม่เข้าใจตามที่ดูเหมือนจะปลอดภัยในการทำงาน แต่ downvote อาจปัดพวกนั้นจะเป็นประโยชน์ มันใช้คำสั่งเดียวกับคำตอบข้างต้นแต่กำลังเพิ่มการจัดรูปแบบด้วย AWK ฉันไม่ได้เรียกใช้สคริปต์เป็นการส่วนตัวเพราะฉันไม่ได้ใช้มัน แต่การอธิบายมันช่วยผู้ที่ต้องการรูปแบบบางอย่าง
Dooley_labs

1
ฉันอ่านรหัสและเรียกใช้ มันจัดเรียงเขตข้อมูลเช่นตารางและรูปแบบใช้หน่วยความจำถิ่นที่มีคำนำหน้า (เช่น 1.12 GB, 582.79 MB)
Stéphane Gourichon

0

สิ่งนี้ยังใช้ ID กระบวนการเรียงลำดับตาม MB ที่ใช้และสรุปคำสั่ง (ที่สร้างกระบวนการ):

ps aux | awk '{print $6/1024 " MB\t\t" $2 "\t" $11}' | sort -n


0

เซิร์ฟเวอร์ ubuntu ของฉัน DISTRIB RELEASE = 18.04 บน Hyper-V มีหน่วยความจำส่วนใหญ่ที่ใช้ แต่กระบวนการทั้งหมดนั้นใช้ได้ (ยอมรับแล้วฉันได้ลบแพ็คเกจ snapd และแพ็คเกจที่ไม่ต้องใส่ข้อมูล แต่ยังคงใช้หน่วยความจำ 95% อยู่)

คำตอบคือ Hyper-V มีหน่วยความจำแบบไดนามิกดังนั้นจึงใช้หน่วยความจำสำหรับการใช้งานระบบหลักและ ubuntu ตั้งค่าสถานะตามที่ใช้

หวังว่าจะช่วยใครซักคน

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