मैंने केवल अपनी जरूरतों के लिए कल इसे देखना शुरू किया, नीचे जो मैंने अब तक पाया है वह है:
SWAP_USED = Used_by_Processes + SwapCached + Part_of_Tmpfs + something_else
लघु कथा:
Used_by_Processes - डेटा जिसे मेमोरी से पूरी तरह से स्वैप किया गया है।
SwapCached - डेटा जिसे डिस्क में स्वैप किया गया है, लेकिन अभी भी मेमोरी में है।
Part_of_Tmpfs - tmpfs डेटा का कुछ भाग।
लम्बी कहानी:
Used_by_Processes - इसको गलत तरीके से समझने के बारे में कई निर्देश प्रकाशित हैं ; उदाहरण के लिए, यदि हम सभी VmSwap
प्रविष्टियों को प्रविष्टियों /proc/*/status
या Swap
प्रविष्टियों से जोड़ते हैं - तो हमें एक ओवरएस्टीमेट/proc/*/smaps
मिलेगा (साझा किए गए स्वैप किए गए पृष्ठ एक से अधिक बार गिने जा सकते हैं)। यदि हम इसे root
उपयोगकर्ता या हमारे OS से नहीं चलाते हैं - तो कम उम्र के व्यक्ति को चुपचाप लौटा दिया जाएगा। मेरे पास साझा पृष्ठों की पहचान करने का एक उचित तरीका नहीं है, लेकिन समान 'नक्शों' के बंटवारे से अन्य दृष्टिकोणों की तुलना में बहुत बेहतर सन्निकटन होता है: (ध्यान दें कि cat
नीचे बेकार नहीं है और वास्तव में इसकी आवश्यकता है 2>/dev/null
)
[root@a:~]# cat /proc/*/status|awk ' /^VmSwap/{ s+=$2 }END{print s}'
32048
[root@a:~]# cat /proc/*/smaps|awk ' /^Swap/{ s+=$2 }END{print s}'
32048
[root@a:~]# cat /proc/*/smaps|awk '/-/{r=$0}/^Swap/{if(R[r]!=1)s+=$2;R[r]=1}END{print s}'
14940
[root@a:~]# free -k|grep -e Swap -e used
total used free shared buffers cached
Swap: 8388600 15508 8373092
SwapCached - यह एक सीधा है और साफ से निकाला जा सकता है /proc/meminfo
। कुछ लोगों को यह उम्मीद नहीं होगी कि इसे "प्रयुक्त" स्वैप के रूप में गिना जाएगा, क्योंकि रैम और स्वैप दोनों में एक ही पृष्ठ की एक डुप्लिकेट (गैर-गंदी) प्रतिलिपि बनाई जा सकती है और दोनों तरफ से तुरंत (अगर मांग आती है तो) इस तरह से मुक्त किया जा सकता है प्रतियों में से एक "मुक्त"।
Part_of_Tmpfs - उज्जवल पक्ष यह है कि जब आपका सभी tmpfs डेटा कई-दिनों से अछूता है और swappiness
गैर-शून्य है - तो इसकी पूरी संभावना है कि पूरे tmpfs को अदला-बदली किया गया है (और हाल ही में उपयोग किए गए डेटा के लिए इसके विपरीत)। नकारात्मक पक्ष यह है कि मुझे कोई एपीआई नहीं मिला है जो कि आईएस की अदला-बदली या प्रतिशत की गणना करने के लिए है कि इसमें कितना स्वैप है, हालांकि अगर पर्याप्त रैम है - तो हम पूरे tmpfs डेटा को कॉपी कर सकते हैं /dev/null
और इस तरह कुछ सुराग प्राप्त कर सकते हैं कि यह कितना स्वैप किया गया था।
Tmpfs के आकार की गणना के दौरान की जाने वाली सामान्य गलतियाँ हैं - मान लेना कि /dev/shm
केवल tmpfs कॉन्फ़िगर किया गया है या पुनरावर्ती प्रति-फ़ाइल स्कैनिंग द्वारा इसे करने की कोशिश कर रहा है (न केवल कार्यान्वयन छिपी हुई फ़ाइलों को छोड़ना है या इसे गैर से करना है root
, लेकिन यह भी अन-स्वैप है ट्रैवर्सिंग के दौरान कुछ पेज)। बहुत आसान तरीका है अच्छे पुराने का उपयोग करना df
।
some_else - diff 385 MB
नीचे " " देखें, कर्नेल स्रोतों में एक गोता लगाने की जरूरत है। मेरी स्क्रिप्ट देखें:
#!/bin/bash
TMPFS=`df -kP |awk ' /^tmpfs/{ s+=$3 }END{print int( s/1024)}'`
PROCS=`cat /proc/*/smaps|awk '/-/{r=$0} /^Swap/{if(R[r]!=1)s+=$2;R[r]=1}END{print int( s/1024)}'`
SCACH=`cat /proc/meminfo|awk ' /^SwapCached/ {print int($2/1024)}'`
TOTAL=`free -k |awk ' /^Swap/ {print int($3/1024)}'`
echo -e " df $TMPFS\t smaps $PROCS \tSwapCache $SCACH\t| $TOTAL\tswap | diff $[TOTAL-TMPFS-PROCS-SCACH]\tMB"
और विभिन्न बक्से से उत्पादन:
xa002: df 0 smaps 271 SwapCache 3858 | 4120 swap | diff -9 MB
sg003: df 0 smaps 234 SwapCache 3876 | 4111 swap | diff 1 MB
sg001: df 0 smaps 245 SwapCache 3845 | 4093 swap | diff 3 MB
sg002: df 0 smaps 244 SwapCache 3843 | 4091 swap | diff 4 MB
dm001: df 2 smaps 971 SwapCache 728 | 1707 swap | diff 6 MB
hm012: df 270 smaps 161 SwapCache 29 | 454 swap | diff -6 MB
hm003: df 274 smaps 142 SwapCache 27 | 440 swap | diff -3 MB
hm006: df 262 smaps 150 SwapCache 29 | 437 swap | diff -4 MB
hm002: df 265 smaps 120 SwapCache 28 | 412 swap | diff -1 MB
hm009: df 258 smaps 124 SwapCache 33 | 410 swap | diff -5 MB
hm011: df 262 smaps 118 SwapCache 28 | 406 swap | diff -2 MB
hm008: df 245 smaps 122 SwapCache 32 | 396 swap | diff -3 MB
hm005: df 247 smaps 120 SwapCache 33 | 396 swap | diff -4 MB
dp001: df 0 smaps 0 SwapCache 0 | 386 swap | diff 386 MB
hm014: df 184 smaps 134 SwapCache 34 | 343 swap | diff -9 MB
hm007: df 0 smaps 132 SwapCache 32 | 158 swap | diff -6 MB
bm002: df 0 smaps 121 SwapCache 25 | 141 swap | diff -5 MB
dm002: df 2 smaps 70 SwapCache 71 | 139 swap | diff -4 MB
bm001: df 3 smaps 102 SwapCache 28 | 131 swap | diff -2 MB
bm004: df 0 smaps 98 SwapCache 29 | 126 swap | diff -1 MB
hm013: df 0 smaps 100 SwapCache 30 | 124 swap | diff -6 MB
bm006: df 0 smaps 103 SwapCache 15 | 122 swap | diff 4 MB
hm010: df 0 smaps 102 SwapCache 24 | 122 swap | diff -4 MB
hm001: df 0 smaps 101 SwapCache 25 | 121 swap | diff -5 MB
bm003: df 0 smaps 98 SwapCache 15 | 107 swap | diff -6 MB
bm005: df 0 smaps 70 SwapCache 17 | 85 swap | diff -2 MB
sg004: df 0 smaps 72 SwapCache 14 | 83 swap | diff -3 MB
sg001: df 0 smaps 41 SwapCache 33 | 78 swap | diff 4 MB
sg005: df 0 smaps 59 SwapCache 20 | 75 swap | diff -4 MB
sg003: df 0 smaps 58 SwapCache 18 | 72 swap | diff -4 MB
sg006: df 0 smaps 56 SwapCache 13 | 65 swap | diff -4 MB
sg002: df 0 smaps 54 SwapCache 12 | 64 swap | diff -2 MB
xa001: df 0 smaps 56 SwapCache 5 | 55 swap | diff -6 MB
और बोनस के रूप में एक छोटा सा प्रयोग:
[root@hm012:~]# df -h|grep -e '^Filesystem' -e '^tmpfs'
Filesystem Size Used Avail Use% Mounted on
tmpfs 12G 271M 12G 3% /dev/shm
tmpfs 8.0G 84K 8.0G 1% /tmp
[root@hm012:~]# ./get_swap.sh
df 270 smaps 161 SwapCache 29 | 454 swap | diff -6 MB
[root@hm012:~]# rm -rf /dev/shm/*
[root@hm012:~]# df -h|grep -e '^Filesystem' -e '^tmpfs'
Filesystem Size Used Avail Use% Mounted on
tmpfs 12G 0 12G 0% /dev/shm
tmpfs 8.0G 84K 8.0G 1% /tmp
[root@hm012:~]# ./get_swap.sh
df 0 smaps 161 SwapCache 29 | 185 swap | diff -5 MB
उपरोक्त वर्णित सन्निकटन से अलग PS - इसमें त्रुटि के अन्य स्रोत हैं, जैसे KB में MB का चक्कर लगाना, RAM और स्वैप के ब्लॉक-आकार के बीच एक बेमेल की सैद्धांतिक संभावना, आदि। मुझे यकीन नहीं है कि यह सब कुछ कवर करता है, लेकिन यह उम्मीद कर रहा है कुछ हद तक मदद करता है :)
VmSwap
लाइन में दिखाए गए मूल्य के अलावा कुछ भी वापस करता है/proc/PID/status
? सवाल यह नहीं है कि प्रीटीयर डिस्प्ले के लिए पूछ रहा है, यह पूछ रहा है कि प्रक्रिया डेटा के अलावा स्वैप में क्या हो सकता है।