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.