लिनक्स में "गुम" मेमोरी उपयोग को ट्रैक करना


10

एक आर्क 3.6.7 x86_64 कर्नेल पर, मैं सिस्टम के मेमोरी उपयोग के लिए खाता बनाने की कोशिश कर रहा हूं, जिसे जितना अधिक मैं इसे देखता हूं, उतना ही एक छेद दिखाई देता है (प्रयुक्त मेमोरी के लेखांकन में, एक गैर-छेद में का उपयोग)।

यह एक ताज़ा बूटेड सिस्टम है। सिंपल और 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 / कश्मीर * फ़ाइलों में से कुछ है और दुर्भाग्य से तब से गायब हैं। / 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 + Inactive = Used
46724  + 24108    = 70832 (not quite)

Commited_AS यहां उपयोगकर्ता की निजी / साझा मेमोरी डिस्काउंटिंग साझा की गई फ़ाइलों को / proc / * / smaps से सम्‍मिलित करता है। पीएसएस को ध्यान में रखते हुए भी लाइनों में है। (ब्याज से बाहर मुझे एक 32 बिट डेबियन 2.6.32-5-686 पर एक बहुत बड़ा Commited_AS मिलता है)

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

स्लैब / proc / slabinfo के साथ इनलाइन है

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

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

तो ~ 63M छोटा। यह मुझे बताता है कि कर्नेल और लोड किए गए सभी मॉड्यूल में कुछ एमबी की कमी है। स्लैब हालांकि बहुत कुछ कवर करता है, इसलिए यदि कोई गायब है तो मुझे यकीन नहीं है कि यह ~ 60Mb के बराबर होगा?

63 थोड़े सक्रिय + निष्क्रिय आंकड़ा के करीब है, लेकिन यह सही नहीं लगता है।

तो क्या कोई जादू का फॉर्मूला जानता है ?? अन्यथा अगर मैं जिस आकृति को देख रहा हूं, वे सही हैं कि स्मृति आवंटन में ग्रे क्षेत्र क्या हैं जिनके बारे में मैं प्रहार कर सकता हूं?

ऐसा प्रतीत होता है कि लिनक्स ने मेरे राम को खा लिया! सामान्य रूप से आरोपित की तुलना में एक छोटा सा हिस्सा =)

Commited_AS को संपादित करना कर्नेल से एक अनुमान है कि इसे 99.9% कवर करने के लिए कितनी मेमोरी की आवश्यकता होगी, इसलिए यह एक वास्तविक आवंटित संख्या नहीं है। AnonPages + Mapped इसका एक घटक है, जिससे एक बड़ा छेद निकलता है, लगभग 100MB अब।

User + Kernel
28368 + 32144 = 60512 != 157036

AnonPages और Mapped अधिकतर anon / mapped जानकारी के साथ / proc / [0-9] * / smaps wgen से PSS / Shared खाते में लेते हैं।

आरक्षित क्षेत्र कुल मेमोरी से हटाए गए चंक में फिट होते हैं:

कुल freeमेमोरी 16345032Kb है।
टोटल सिस्टम मेमोरी 16777216Kb
PCI 'होल' है - lspci -v 266520K = 16510696K
बायोस 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

यह काम करता है ~ 1Mb हर 1GB मेमोरी के लिए आवंटित किया जाता है। कर्नेल में एक मेमोरी मैप हो सकता है ... लेकिन मुझे लगा कि केवल बूट के रूप में सेटअप होने के बजाय मेमोरी आवंटित की जाती है।

यह देखना दिलचस्प होगा कि क्या ट्रेंड जारी रहने पर किसी की किसी बड़ी मशीन तक पहुंच होती है या नहीं?


psडिजाइन द्वारा झूठ। मेमोरी अकाउंटिंग के लिए इसका इस्तेमाल न करें।
bahamat

2
चीयर्स, लेकिन यह टैलींग नहीं है ps। यह समग्र उपयोग में है /proc/meminfo। एकमात्र प्रक्रिया लेखांकन स्मैप्स के माध्यम से किया गया है जो साझा और निजी मेमोरी के लिए खाता है, लेकिन यह केवल मेइनफो से अननैपेज / मैप्ड मूल्यों की तुलना करने के लिए था।
मैट


इसलिए मेरे पोस्ट में संदर्भ वास्तव में मेरे राम खाने के बारे में =)
मैट

जवाबों:


3

"एक प्रक्रिया द्वारा उपयोग की जाने वाली मेमोरी" नहीं हैआधुनिक ऑपरेटिंग सिस्टम में एक स्पष्ट कटौती अवधारणा। जो मापा जा सकता है वह प्रक्रिया के पता स्थान (SIZE) और निवासी सेट आकार (RSS, पता स्थान में कितने पृष्ठ वर्तमान में स्मृति में है) के आकार का है। RSS का हिस्सा साझा किया जाता है (मेमोरी में अधिकांश प्रक्रियाएं ग्लिबक की एक प्रति साझा करती हैं, और इसलिए अन्य साझा एलआईडी सिस्टम के लिए मिश्रित होती हैं; एक ही निष्पादन योग्य शेयर को चलाने वाली कई प्रक्रियाएं, प्रक्रियाएं केवल-पढ़ने के लिए डेटा को साझा करती हैं और संभवतः अभी तक संशोधित नहीं किया गया है। माता-पिता के साथ पठन-लेखन डेटा)। दूसरी ओर, कर्नेल द्वारा प्रक्रिया के लिए उपयोग की जाने वाली मेमोरी का कोई हिसाब नहीं है, जैसे पेज टेबल, कर्नेल बफ़र्स और कर्नेल स्टैक। समग्र चित्र में आपको ग्राफिक्स कार्ड, कर्नेल के उपयोग के लिए आरक्षित मेमोरी, और डीओएस और अन्य प्रागैतिहासिक प्रणालियों के लिए आरक्षित "छेद" को जमा करना होगा (जो कि ज्यादा नहीं है,

एक समग्र चित्र प्राप्त करने का एकमात्र तरीका यह है कि कर्नेल इस प्रकार रिपोर्ट करता है। अज्ञात ओवरलैप और अज्ञात बाएं बाहरी के साथ संख्याओं को जोड़ना अंकगणित में एक अच्छा व्यायाम है, इससे अधिक कुछ नहीं।


1
'मेमोरी प्रति प्रोसेस' स्पष्ट कटौती नहीं है, लेकिन मैं यह नहीं देख सकता कि समग्र उपयोग पर नज़र रखने को क्यों प्रभावित करना चाहिए? कर्नेल के लिए, समग्र पेजटेबल्स, स्लैब, कर्नेलस्टैक और अन्य नॉन प्रोसेस मेम काउंटर्स को / proc / meminfo में सूचित किया जाता है और इसमें शामिल है कि मैं क्या करने की कोशिश कर रहा हूं (प्रक्रिया मेम वहां भी लगता है)। समग्र काउंटरों के अलावा, मैं अननोन / मैप्ड, शेयर्ड / प्राइवेट मेमोरी के लिए प्रति प्रोसेस स्मैप्स में देख रहा था, इस बात का अंदाजा लगाने के लिए साझा / निजी मेमोरी कि जहाँ प्रक्रिया मेमोरी को / proc / meminfo में देखा जा सकता है। मैं कम से वीएम संख्या किस सेट, शारीरिक तक जोड़ जो मैं स्पष्ट रूप से में एक छेद है लक्ष्य कर रहा हूँ।
मैट

1
मूल रूप psसे स्मृति के लिए सही ढंग से लेखांकन में असमर्थ है। इसलिए इसका उपयोग न करें। क्या psरिपोर्ट केवल सच होगी अगर यह प्रक्रिया सिस्टम पर चलने वाली एकमात्र (एक असंभव) थी। इस बारे में अधिक जानने के लिए कि आप यहाँ क्यों नहीं psपढ़ते हैं: लिनक्स पर मेमोरी यूज़ को समझना
bahamat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.