การติดตามการใช้หน่วยความจำ“ ที่หายไป” ใน linux


10

ในเคอร์เนล Arch 3.6.7 x86_64 ฉันพยายามพิจารณาการใช้งานหน่วยความจำของระบบซึ่งยิ่งฉันดูมันยิ่งดูเหมือนว่าจะเป็นรู (ในการบัญชีของหน่วยความจำที่ใช้แล้วไม่ใช่รูใน การใช้งานของ)

นี่เป็นระบบที่ถูกบูตใหม่ ด้วยการทำงานที่ไม่มากนอกจาก systemd และ sshd เพื่อให้ง่าย

$ ps aux | sort -n -k6
...
root       316  0.0  0.0   7884   812 tty1     Ss+  14:37   0:00 /sbin/agetty --noclear tty1 38400
matt       682  0.0  0.0  24528   820 pts/0    S+   15:09   0:00 sort -n -k6
dbus       309  0.0  0.0  17280  1284 ?        Ss   14:37   0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
matt       681  0.0  0.0  10808  1364 pts/0    R+   15:09   0:00 ps aux
root       308  0.0  0.0  26060  1516 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-logind
root       148  0.0  0.0  25972  1692 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-udevd
matt       451  0.0  0.0  78180  2008 ?        S    14:37   0:00 sshd: matt@pts/0
root       288  0.0  0.0  39612  2708 ?        Ss   14:37   0:00 /usr/sbin/sshd -D
matt       452  0.0  0.0  16452  3248 pts/0    Ss   14:37   0:00 -bash
root         1  0.0  0.0  32572  3268 ?        Ss   14:37   0:00 /sbin/init
root       299  0.0  0.0  69352  3604 ?        Ss   14:37   0:00 /usr/sbin/syslog-ng -F
root       449  0.0  0.0  78040  3800 ?        Ss   14:37   0:00 sshd: matt [priv]
root       161  0.0  0.0 358384  9656 ?        Ss   14:37   0:00 /usr/lib/systemd/systemd-journald

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

ดังนั้นการสาธิตสิ่งที่ฉันเห็น

# cat /proc/meminfo
MemTotal:       16345780 kB
MemFree:        16129940 kB
Buffers:           10360 kB
Cached:            48444 kB
SwapCached:            0 kB
Active:            24108 kB
Inactive:          46724 kB
Active(anon):      12104 kB
Inactive(anon):     3616 kB
Active(file):      12004 kB
Inactive(file):    43108 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:         11996 kB
Mapped:            16372 kB
Shmem:              3696 kB
Slab:              25092 kB
SReclaimable:      11716 kB
SUnreclaim:        13376 kB
KernelStack:         928 kB
PageTables:         2428 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8172888 kB
Committed_AS:      34304 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      372788 kB
VmallocChunk:   34359362043 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       12288 kB
DirectMap2M:    16680960 kB

หากเราเพิ่มการใช้งาน:

MemTotal - MemFree - Buffers - Cached = Used
16345780 - 16129940 - 10360 - 48444 = 157036

ดูเหมือนจะมีการใช้ตัวนับ Active / / ไม่ใช้งานในบางหน้า (ไม่ใช่ทั้งหมด) ดังนั้นจึงสามารถทำซ้ำสิ่งที่นับไว้ที่อื่น

Active + Inactive = Used
46724  + 24108    = 70832 (not quite)

Commited_AS ที่นี่ดูเหมือนว่าจะติดตามอย่างใกล้ชิดกับผลรวมของ userspace ส่วนตัว / แชร์หน่วยความจำลดราคาไฟล์ที่แชร์จาก / proc / * / smaps การคำนึงถึง PSSด้วยเช่นกัน (จากความสนใจฉันได้รับ Commited_AS ที่ใหญ่กว่ามากในเดบิต 32 บิต 2.6.32-5-686)

AnonPages + Mapped + Commited_AS = Userspace?
11996     + 16372  + 34304       = 62672

Slab สอดคล้องกับ / proc / slabinfo

Slab +  Shmem + KernelStack + PageTables = Kernelspace?
25092 + 3696  + 928         + 2428       = 32144

Userspace? + Kernelspace? = Used?
62672      + 32144        = 94816

สั้นมาก ~ 63M มันทำให้ฉันรู้สึกว่าเคอร์เนลและโมดูลที่โหลดมาทั้งหมดนั้นขาด MB บางส่วน พื้นดูเหมือนจะครอบคลุมมากแม้ว่าดังนั้นหากมีการขาดหายไปฉันไม่แน่ใจว่าจะเท่ากับ ~ 60Mb?

63 นั้นใกล้เคียงกับตัวเลข Active + Inactive แต่ไม่รู้สึกว่าถูกต้อง

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

ดูเหมือนว่า linux จะกิน ram ของฉัน! แม้ว่าจะมีขนาดเล็กกว่าที่ถูกกล่าวหาว่าปกติ =)

แก้ไข Commited_AS เป็นสิ่งที่คาดเดาได้จากเคอร์เนลว่าต้องใช้หน่วยความจำเท่าใดจึงจะครอบคลุม 99.9% ของสิ่งที่ได้ทำไว้ดังนั้นไม่ใช่จำนวนที่จัดสรรจริง AnonPages + การแมปเป็นองค์ประกอบของมันเพื่อที่จะออกจากรูที่ใหญ่กว่าตอนนี้ประมาณ 100MB

User + Kernel
28368 + 32144 = 60512 != 157036

AnonPages และแผนที่ส่วนใหญ่ติดตามด้วยข้อมูล anon / ที่แมปจาก / proc / [0-9] * / smaps wgen โดยใช้ PSS / แชร์เข้าบัญชี

พื้นที่สงวนปรากฏให้พอดีกับก้อนที่ถอดออกจากหน่วยความจำทั้งหมด:

freeหน่วยความจำทั้งหมดคือ 16345032Kb
หน่วยความจำระบบทั้งหมดคือ 16777216Kb
PCI 'hole' - lspci -v 266520K = 16510696K
Bios ที่สงวนไว้ - dmesg 92793K = 16417903K

edit2 ฉันสังเกตเห็นว่าการใช้งานหน่วยความจำพิเศษนี้ไม่ได้อยู่ในการทำงานของ VM ภายในกล่องเดิมที่/proc/meminfoมาจาก ดังนั้นฉันจึงเริ่มมองหาสิ่งที่แตกต่างระหว่างคนทั้งสอง ในที่สุดก็พบว่าการเพิ่มขึ้นของหน่วยความจำกายภาพทั้งหมดที่มีอยู่ใกล้เคียงกับการเพิ่มขึ้นของหน่วยความจำที่ใช้

phys 16GB used>144508     vm>50692      user>21500      kern>26428      u+ktot>47928
vm   64MB used>24612      vm>31140      user>14956      kern>14440      u+ktot>29396
vm  256MB used>26316      vm>35260      user>14752      kern>14780      u+ktot>29532
vm    1GB used>33644      vm>35224      user>14936      kern>14772      u+ktot>29708
vm    2GB used>41592      vm>35048      user>14736      kern>15056      u+ktot>29792
vm    4GB used>57820      vm>35232      user>14780      kern>14952      u+ktot>29732
vm    8GB used>82932      vm>36912      user>15700      kern>15388      u+ktot>31088
vm   12GB used>110072     vm>35248      user>14812      kern>15624      u+ktot>30436
vm   15GB used>122012     vm>35424      user>14832      kern>15824      u+ktot>30656

สามารถใช้งานได้ ~ 8Mb สำหรับทุกๆหน่วยความจำ 1GB อาจเป็นแผนที่หน่วยความจำในเคอร์เนล ... แต่ฉันคิดว่ามันจะเพิ่มขึ้นเมื่อมีการจัดสรรหน่วยความจำแทนที่จะตั้งค่าเมื่อบูต

จะน่าสนใจไหมถ้ามีใครเข้าใช้งานเครื่อง bigmem เครื่องใดก็ได้ถ้าแนวโน้มยังคงดำเนินต่อไป?


psอยู่โดยการออกแบบ อย่าใช้เพื่อการบัญชีหน่วยความจำ
bahamat

2
เสียงเชียร์ psแต่นี้ไม่ได้รับทราบ /proc/meminfoมันเป็นเรื่องการใช้งานโดยรวมใน การบัญชีกระบวนการเพียงอย่างเดียวนั้นผ่าน smaps ซึ่งทำหน้าที่สำหรับหน่วยความจำที่แชร์และส่วนตัว แต่นั่นก็เพื่อเปรียบเทียบกับค่า AnonPages / Mapped จาก meminfo
Matt


ดังนั้นการอ้างอิงในโพสต์ของฉันเกี่ยวกับ linux จริง ๆ กิน ram ของฉัน =)
แมตต์

คำตอบ:


3

"หน่วยความจำที่ใช้โดยกระบวนการ" ไม่ได้เป็นแนวคิดที่ชัดเจนในระบบปฏิบัติการที่ทันสมัย สิ่งที่สามารถวัดได้คือขนาดของพื้นที่ที่อยู่ของกระบวนการ (SIZE) และขนาดชุดที่อยู่อาศัย (RSS จำนวนหน้าในพื้นที่ที่อยู่ในหน่วยความจำ) เป็นส่วนหนึ่งของ RSS ที่ใช้ร่วมกัน (กระบวนการส่วนใหญ่ในหน่วยความจำใช้ร่วมกันหนึ่งสำเนาของ glibc และอื่น ๆ สำหรับสารพันไลบรารีอื่น ๆ ที่ใช้ร่วมกันหลายกระบวนการที่ทำงานร่วมกันปฏิบัติการเดียวกันมันกระบวนการแยกข้อมูลแบบอ่านอย่างเดียวแยกและอาจเป็นกลุ่ม ข้อมูลอ่าน - เขียนกับพาเรนต์) ในทางกลับกันหน่วยความจำที่ใช้สำหรับกระบวนการโดยเคอร์เนลจะไม่ถูกคิดเช่นตารางหน้าบัฟเฟอร์เคอร์เนลและเคอร์เนลสแต็ก ในภาพรวมคุณต้องคำนึงถึงหน่วยความจำที่สงวนไว้สำหรับการ์ดกราฟิกการใช้งานของเคอร์เนลและ "หลุม" ที่หลากหลายที่สงวนไว้สำหรับ DOS และระบบก่อนประวัติศาสตร์อื่น ๆ (ไม่มากนัก

วิธีเดียวในการรับภาพรวมคือสิ่งที่เคอร์เนลรายงานเช่นนี้ การเพิ่มตัวเลขด้วยการซ้อนทับที่ไม่รู้จักและการไม่รู้จักซ้ายด้านซ้ายเป็นการออกกำลังกายที่ดีทางคณิตศาสตร์ไม่มีอะไรเพิ่มเติม


1
'หน่วยความจำต่อกระบวนการ' ไม่ชัดเจน แต่ฉันไม่เห็นสาเหตุที่จะส่งผลต่อการติดตามการใช้งานโดยรวม สำหรับเคอร์เนล, PageTables โดยรวม, Slab, KernelStack และตัวนับ mem ที่ไม่ใช่กระบวนการอื่น ๆ จะรายงานใน / proc / meminfo และรวมอยู่ในสิ่งที่ฉันกำลังพยายามทำบัญชี (กระบวนการ mem จะอยู่ที่นั่นเช่นกัน) นอกเหนือจากตัวนับโดยรวมที่ฉันได้พิจารณาต่อ smaps กระบวนการสำหรับ anon / แมปหน่วยความจำที่ใช้ร่วมกัน / ส่วนตัวที่จะได้รับความคิดที่หน่วยความจำกระบวนการอาจจะคิดใน / proc / meminfo ผมเล็งไปที่สิ่งที่ชุดของตัวเลข VM เพิ่มขึ้นถึงทางกายภาพที่ฉันชัดเจนมีหลุมใน.
แมตต์

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