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