लिनक्स: कुल स्वैप का उपयोग किया जाता है = स्वैप + प्रक्रियाओं द्वारा उपयोग किया जाता है?


17

इसलिए, मैं कुछ जांच करने की कोशिश कर रहा हूं कि स्वैप सिस्टम उच्च स्वैप उपयोग के साथ सिस्टम में कहां से आता है:

# free
             total       used       free     shared    buffers     cached
Mem:        515324     508800       6524          0       4852      27576
-/+ buffers/cache:     476372      38952
Swap:       983032     503328     479704

प्रति प्रक्रिया में प्रयुक्त स्वैप जोड़ना:

# for proc in /proc/*; do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe`'"}'; done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'
0       /bin/gawk
0       /bin/sort
0       /usr/bin/readlink
28      /sbin/xxxxxxxx
52      /sbin/mingetty
52      /sbin/mingetty
52      /sbin/mingetty
52      /sbin/mingetty
56      /sbin/mingetty
56      /sbin/mingetty
60      /xxxxxxxxxxx
60      /usr/sbin/xxx
84      /usr/sbin/xxx
108     /usr/bin/xxx
168     /bin/bash
220     /sbin/init
256     /sbin/rsyslogd
352     /bin/bash
356     /bin/bash
360     /usr/sbin/sshd
496     /usr/sbin/crond
672     /usr/sbin/sshd
12972   /opt/jdk1.6.0_22/bin/java
80392   /usr/libexec/mysqld
311876  /opt/jdk1.6.0_22/bin/java
408780  Total

जो कुल इस्तेमाल किए गए स्वैप के लिए कम मूल्य देता है। शेष उपयोग किया गया स्वैप क्षेत्र कहां है? क्या यह vmalloc () 'कर्नेल के अंदर एड मेमोरी है? कुछ और? मैं इसे कैसे पहचान सकता हूं?

ज्ञापन का आउटपुट:

# cat /proc/meminfo 
MemTotal:       515324 kB
MemFree:          6696 kB
Buffers:          5084 kB
Cached:          28056 kB
SwapCached:     157512 kB
Active:         429372 kB
Inactive:        65068 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       515324 kB
LowFree:          6696 kB
SwapTotal:      983032 kB
SwapFree:       478712 kB
Dirty:             100 kB
Writeback:           0 kB
AnonPages:      399456 kB
Mapped:           8792 kB
Slab:             7744 kB
PageTables:       1820 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   1240692 kB
Committed_AS:  1743904 kB
VmallocTotal:   507896 kB
VmallocUsed:      3088 kB
VmallocChunk:   504288 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     4096 kB

बफ़र और कैश शामिल हैं और वे किसी भी प्रक्रिया से जुड़े नहीं हैं।
गोल्डीलॉक्स

2
@goldilocks: नहींं, वे भौतिक स्मृति में हैं। इसके अलावा, वे जोड़ नहीं है।
नौ

आप सही हैं, मुझे लगता है कि स्वैप करने के लिए कैशिंग सामान व्यर्थ की तरह होगा। हालाँकि, मुझे लगता है कि जिस चीज की अदला-बदली की गई है, उसे वहीं छोड़ दिया जा सकता है और उस प्रक्रिया के बाद भी ट्रैक किया जा सकता है, जो कि ख़राब है, जब तक कि स्वैप स्थान की अन्यथा आवश्यकता न हो; यह बाद में समय बचाता है यदि कोई प्रक्रिया उसी पृष्ठ को लोड करती है और फिर उस पृष्ठ को फिर से स्वैप किया जाना है - यह अभी भी स्वैप में पहले से ही है। Google "स्वैप कैश" linux-tutorial.info/modules.php?name=MContent&pageid=314 यह समानता है कि वास्तविक "कैश कैश" कैसे आता है (यह अब दोषपूर्ण प्रक्रियाओं से मेमोरी में सहेजा गया सामान है)।
गोल्डीलॉक्स

... मतलब, योग्य, कि " स्वैप में कैशिंग सामान " इतना व्यर्थ नहीं है, बस यह कि राम कैश को स्वैप करके वहां नहीं पहुंचता है।
गोल्डीलॉक्स

1
क्या यह जवाब नहीं है कि कर्नेल स्वैप कर सकता है, और यह आपके प्रसंस्करण में शामिल नहीं है? विशेष रूप से कर्नेल में आजकल "यूजर स्पेस" प्रक्रियाओं का एक पूरा ढेर है ... बस एक अनुमानित अनुमान है।
इयान

जवाबों:


11

अंतर जिसे आप देख रहे हैं वह वास्तव में स्वैप स्पेस के लिए बेहिसाब होने के कारण नहीं है। "हटाए गए" "कि कर्नेल कभी-कभी /proc/*/exeलिंक से जुड़ता है आउटपुट द्वारा readlinkउत्पन्न होता है और आपकी awk स्क्रिप्ट में पार्स त्रुटियां पैदा कर रहा है, और आप प्रभावी रूप से उन प्रक्रियाओं की गिनती नहीं कर रहे हैं जिनके बायनेरी अब आपके कुल में मौजूद नहीं हैं।

कुछ कर्नेल शब्द "हटाए गए" को /proc/*/exeसहानुभूति के लक्ष्यों के लिए जोड़ते हैं जब प्रक्रिया के लिए मूल निष्पादन योग्य अब आसपास नहीं होता है।

आपका आदेश कुल की तुलना में कम दिखाई दे रहा है इसका कारण है। इस readlinkतरह के लिंक का आउटपुट "/ पथ / से / बिन (हटाए गए)" जैसा कुछ होगा, जो awkआउटपुट में स्ट्रिंग में प्रतिस्थापित होने पर एक पार्स त्रुटि का कारण बनता है (यह कोष्ठक और रिक्त स्थान पसंद नहीं करता है)। उदाहरण के लिए, यह करें:

for a in /proc/*/exe ; do readlink $a ; done | grep deleted

और आपको "हटाए गए" के साथ कुछ प्रविष्टियाँ दिखाई देंगी। यदि आप इन प्रविष्टियों के लिए स्वैप उपयोग को देखते हैं, तो उनका कुल आपके द्वारा देखी गई विसंगति से मेल खाता है, क्योंकि परिणामस्वरूप awkत्रुटियां उनके योगों को गणना करने और अंतिम कुल में शामिल होने से रोकती हैं।

यदि आप अपने मूल आदेश को बिना किसी स्‍ट्रेडर के पुनर्निर्देशित किए कहीं भी चलाते हैं, तो आप शायद कुछ "भगोड़े स्ट्रिंग निरंतर" त्रुटियों को नोटिस करेंगे। वे त्रुटियां उपरोक्त का एक परिणाम हैं और आपको उन्हें अनदेखा नहीं करना चाहिए था।

अपने मूल आदेश में अन्य संभावित सुधारों को अनदेखा करते हुए, आप इसे (हटाए गए) हटाकर इसे संशोधित कर सकते हैं, इस तरह (नोट आउटपुट में |awk '{print $1}'जोड़ा गया readlink):

for proc in /proc/*; \
  do cat $proc/smaps 2>/dev/null | awk '/Swap/{swap+=$2}END{print swap "\t'`readlink $proc/exe|awk '{print $1}' `'" }'; \
done | sort -n | awk '{total+=$1}/[0-9]/;END{print total "\tTotal"}'

का यह प्रयोग awkउत्पादन ठीक करने के लिए की readlinkहै, तो नाम रिक्ति तोड़ सकता है - आप उपयोग कर सकते हैं sedया जो कुछ भी आप अपनी पसंदीदा विधि।

बोनस की जानकारी

वैसे, आप बस इस्तेमाल कर सकते हैं smem -t। "स्वैप" कॉलम प्रदर्शित करता है कि आप क्या चाहते हैं।

हालांकि, इसे स्वयं गणना करने के लिए, आप इस जानकारी को सीधे VmSwapफ़ील्ड से अधिक प्राप्त कर सकते हैं /proc/*/status(स्मैप्स को कुछ कर्नेल समर्थन की आवश्यकता होती है और हमेशा उपलब्ध नहीं होती है), और एक उचित फ़ाइल नाम पैटर्न का उपयोग करके त्रुटि के आउटपुट को पुनर्निर्देशित करने से बचें। त्रुटियों की शुरुआत:

for proc in /proc/[0-9]*; do \
  awk '/VmSwap/ { print $2 "\t'`readlink $proc/exe | awk '{ print $1 }'`'" }' $proc/status; \
done | sort -n | awk '{ total += $1 ; print $0 } END { print total "\tTotal" }'

आप वास्तविक द्विआधारी की जरूरत नहीं है और सिर्फ प्रक्रिया नाम होने के साथ सौदा कर सकते हैं, तो आप प्राप्त कर सकते हैं सब कुछ से status:

for a in /proc/*/status ; do \
  awk '/VmSwap|Name/ { printf $2 " " } END { print "" }' $a ; \
done | awk '{ total+=$2 ; print $0 } END { print "Total " total }'

और अंत में, अगर सिर्फ PID का दम घुटता है, तो आप बस यह सब कर सकते हैं awk:

awk '/VmSwap/ { total += $2; print $2 "\t" FILENAME } END { print total "\tTotal" }' /proc/*/status

ध्यान दें:

अब इस वहाँ के बीच मतभेद नहीं हैं कि कहने के लिए नहीं है freeऔर smem(बाद किया जा रहा है अपनी स्क्रिप्ट के रूप में ही)। बहुत सारे हैं (उदाहरण के लिए, https://www.google.com/search?q=smem+free , जिसके पास स्मृति उपयोग के बारे में आपके सवालों के जवाब देने के लिए पहले पृष्ठ पर पर्याप्त से अधिक परिणाम हैं)। लेकिन एक उचित परीक्षण के बिना, आपकी विशिष्ट स्थिति को संबोधित नहीं किया जा सकता है।


5

स्वैप का उपयोग tmpfs द्वारा किया जाता है यदि कर्नेल को अधिक मुक्त राम की आवश्यकता होती है या बस इसलिए कि यह कुछ समय के लिए अप्रयुक्त है ... इसलिए किसी भी tmpfs का उपयोग स्वैप का उपभोग कर सकता है।


1
क्यों होता है पतन? यह बिल्कुल सही है।
jlliagre
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.