मेरे पास 28GB रैम और 2GB स्वैप के साथ वर्चुअल लिनक्स (फेडोरा 17) सर्वर है। सर्वर एक MySQL DB चला रहा है जो अधिकांश RAM का उपयोग करने के लिए सेट किया गया है।
कुछ समय चलने के बाद सर्वर अप्राप्य पृष्ठों को स्वैप करने के लिए स्वैप का उपयोग करना शुरू कर देता है। यह ठीक है क्योंकि मेरा स्वपन 60 डिफ़ॉल्ट पर है और यह अपेक्षित व्यवहार है।
अजीब बात यह है कि शीर्ष / ज्ञापन में संख्या प्रक्रियाओं से जानकारी के अनुरूप नहीं है। यानी सर्वर इन नंबरों की रिपोर्ट कर रहा है:
/proc/meminfo:
SwapCached: 24588 kB
SwapTotal: 2097148 kB
SwapFree: 865912 kB
top:
Mem: 28189800k total, 27583776k used, 606024k free, 163452k buffers
Swap: 2097148k total, 1231512k used, 865636k free, 6554356k cached
अगर मैं /server//a/423603/98204 से स्क्रिप्ट का उपयोग करता हूं, तो यह उचित संख्या (bash'es, systemd, आदि द्वारा स्वैप की गई कुछ एमबीएस) और MySQL से एक बड़ा आवंटन की रिपोर्ट करता है (मैंने बहुत से आउटपुट लाइनों को छोड़ दिया है ):
892 [2442] qmgr -l -t fifo -u
896 [2412] /usr/libexec/postfix/master
904 [28382] mysql -u root
976 [27559] -bash
984 [27637] -bash
992 [27931] SCREEN
1000 [27932] /bin/bash
1192 [27558] sshd: admin@pts/0
1196 [27556] sshd: admin [priv]
1244 [1] /usr/lib/systemd/systemd
9444 [26626] /usr/bin/perl /bin/innotop
413852 [31039] /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/data/mysql/err --open-files-limit=8192 --pid-file=/data/mysql/pid --socket=/data/mysql/mysql.sock --port=3306
449264 Total Swap Used
इसलिए यदि मुझे स्क्रिप्ट आउटपुट सही मिलता है तो कुल स्वैप का उपयोग 449264K = ca होना चाहिए। 440MB mysql का उपयोग करते हुए ca. स्वैप का 90%।
सवाल यह है कि यह शीर्ष और मेमेन्फो संख्याओं से इतना भिन्न क्यों है? वहाँ किसी भी तरह से कैसे "डंप" स्वैप जानकारी देखने के लिए सभी प्रक्रियाओं से स्वैप usages के बजाय वास्तव में इसमें क्या है?
इस मुद्दे का विश्लेषण करते समय मैं विभिन्न विचारों के साथ आया था, लेकिन वे सभी गलत प्रतीत होते हैं:
- स्क्रिप्ट आउटपुट KB में नहीं है। भले ही यह 512 या 4KB इकाइयों में होगा, यह मेल नहीं खाएगा। वास्तव में अनुपात (1200: 440) लगभग 3: 1 है जो "अजीब" संख्या है।
- स्वैप में कुछ पृष्ठ हैं जो किसी तरह प्रक्रियाओं के बीच साझा किए गए हैं जैसा कि /server//a/477664/98204 में उल्लेख किया गया है । अगर यह सच है तो मैं इस तरह से उपयोग की जाने वाली मेमोरी की वास्तविक संख्या कैसे पा सकता हूं? मेरा मतलब है कि इसे cca 800MB अंतर बनाने की आवश्यकता होगी। और यह इस परिदृश्य में सही नहीं लगता है।
- स्वैप में कुछ "पुराने" पृष्ठ हैं जो पहले से समाप्त प्रक्रियाओं द्वारा उपयोग किए जाते हैं। मुझे कोई आपत्ति नहीं होगी कि अगर मैं यह पता लगाने में सक्षम था कि यह "फ्रीवेबल" स्वैप कितना है।
- स्वैप में ऐसे पृष्ठ हैं जिन्हें स्मृति में वापस स्वैप कर दिया गया है और बस स्वैप में हैं जब वे रैम में नहीं बदले और /server//a/100636/98204 में बताए अनुसार फिर से स्वैप करने की आवश्यकता है । लेकिन SwapCached मूल्य केवल 24MB है।
अजीब बात यह है कि स्वैप का उपयोग धीरे-धीरे बढ़ रहा है, जबकि स्क्रिप्ट से राशि का उत्पादन लगभग समान है। पिछले 3 दिनों में स्वैप का उपयोग 1100MB से वर्तमान 1230MB तक बढ़ गया, जबकि राशि 430MB से बढ़कर वर्तमान 449MB (सीएआर) हो गई।
सर्वर में पर्याप्त निशुल्क (सक्षम) रैम है इसलिए मैं बस स्वैप को बंद कर सकता हूं और इसे वापस चालू कर सकता हूं। या मैं शायद 0 पर स्वैग सेट कर सकता हूं, इसलिए स्वैप का उपयोग केवल तभी किया जाएगा जब कोई अन्य तरीका न हो। लेकिन मैं इस मुद्दे को हल करना चाहूंगा या कम से कम यह पता लगाऊंगा कि इसका कारण क्या है।