कैसे खोजे कि linux swap का उपयोग क्या है या स्वैप में क्या है?


12

मेरे पास 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 के बजाय वास्तव में इसमें क्या है?

इस मुद्दे का विश्लेषण करते समय मैं विभिन्न विचारों के साथ आया था, लेकिन वे सभी गलत प्रतीत होते हैं:

  1. स्क्रिप्ट आउटपुट KB में नहीं है। भले ही यह 512 या 4KB इकाइयों में होगा, यह मेल नहीं खाएगा। वास्तव में अनुपात (1200: 440) लगभग 3: 1 है जो "अजीब" संख्या है।
  2. स्वैप में कुछ पृष्ठ हैं जो किसी तरह प्रक्रियाओं के बीच साझा किए गए हैं जैसा कि /server//a/477664/98204 में उल्लेख किया गया है । अगर यह सच है तो मैं इस तरह से उपयोग की जाने वाली मेमोरी की वास्तविक संख्या कैसे पा सकता हूं? मेरा मतलब है कि इसे cca 800MB अंतर बनाने की आवश्यकता होगी। और यह इस परिदृश्य में सही नहीं लगता है।
  3. स्वैप में कुछ "पुराने" पृष्ठ हैं जो पहले से समाप्त प्रक्रियाओं द्वारा उपयोग किए जाते हैं। मुझे कोई आपत्ति नहीं होगी कि अगर मैं यह पता लगाने में सक्षम था कि यह "फ्रीवेबल" स्वैप कितना है।
  4. स्वैप में ऐसे पृष्ठ हैं जिन्हें स्मृति में वापस स्वैप कर दिया गया है और बस स्वैप में हैं जब वे रैम में नहीं बदले और /server//a/100636/98204 में बताए अनुसार फिर से स्वैप करने की आवश्यकता है । लेकिन SwapCached मूल्य केवल 24MB है।

अजीब बात यह है कि स्वैप का उपयोग धीरे-धीरे बढ़ रहा है, जबकि स्क्रिप्ट से राशि का उत्पादन लगभग समान है। पिछले 3 दिनों में स्वैप का उपयोग 1100MB से वर्तमान 1230MB तक बढ़ गया, जबकि राशि 430MB से बढ़कर वर्तमान 449MB (सीएआर) हो गई।

सर्वर में पर्याप्त निशुल्क (सक्षम) रैम है इसलिए मैं बस स्वैप को बंद कर सकता हूं और इसे वापस चालू कर सकता हूं। या मैं शायद 0 पर स्वैग सेट कर सकता हूं, इसलिए स्वैप का उपयोग केवल तभी किया जाएगा जब कोई अन्य तरीका न हो। लेकिन मैं इस मुद्दे को हल करना चाहूंगा या कम से कम यह पता लगाऊंगा कि इसका कारण क्या है।


जैसे आप कहते हैं कि आपको बस vm.swappiness = 0 (या 1) सेट करना चाहिए और swapoff && swapon
HTTP500

लेकिन यह समस्या हल नहीं होगी। मैं यह मान रहा हूं कि यदि मैं 60 तक वापस जाता हूं या 0 या 1 पर रखता हूं (जब तक कि सर्वर मेमोरी से बाहर नहीं निकलता))
Radek Hladík

यदि यह एक डीबी सर्वर है तो इसे केवल आपात स्थिति में स्वैप का उपयोग करना चाहिए, इसलिए आपको इसे हमेशा 0 (या 1) पर सेट करना चाहिए।
HTTP500

यह सच है और शायद यही है कि मैं क्या करने जा रहा हूं अगर मुझे इस मुद्दे का कारण नहीं मिलता है ... दूसरी तरफ सर्वर पर बहुत सारे छोटे डीबी हैं जो बहुत छिटपुट रूप से उपयोग किए जाते हैं और मुझे उनके होने का विचार पसंद आया सिस्टम द्वारा स्वैप किए जाने पर जब वे उपयोग में नहीं होते हैं ... हालांकि मुझे लगता है कि MySQL इसे अपने दम पर संभाल सकेगा ...
Radek Hladík

Mysql अपने स्वयं के कैश को प्रबंधित करने का एक बहुत अच्छा काम करता है, लेकिन यह इस बात पर आधारित है कि स्मृति में वास्तव में क्या है और क्या नहीं है। यदि आप स्वैप मेमोरी का उपयोग करके इसे डबल-अनुमान करने की कोशिश करते हैं, तो आप सिर्फ mysql को यह तय करने की क्षमता बिगाड़ रहे हैं कि क्या कैश किया जाना चाहिए और क्या नहीं। स्वैप बंद करें। यदि आप स्वैप को मारते हैं, तो यह एक ट्यूनिंग विफलता है। अपने कैश आकार को समायोजित करें ताकि स्वैप कभी न हो, लेकिन इससे कम है, आप सभी उपलब्ध भौतिक मेमोरी का उपयोग करना चाहते हैं।
mc0e

जवाबों:


9

फेडोरा 18 और ऊपर smemरिपोज में है। आप अजगर स्क्रिप्ट डाउनलोड कर सकते हैं और स्रोत से इंस्टॉल कर सकते हैं ।

यहां मेरी मशीन से एक नमूना आउटपुट (कुछ स्निप और एनोनिज्म) दिया गया है:

# smem -s swap -t -k -n
  PID User     Command                         Swap      USS      PSS      RSS 
20917 1001     bash                               0     1.1M     1.1M     1.9M 
28329 0        python /bin/smem -s swap -t        0     6.3M     6.5M     7.4M 
 2719 1001     gnome-pty-helper               16.0K    72.0K    73.0K   516.0K 
  619 0        @sbin/mdadm --monitor --sca    28.0K    72.0K    73.0K   248.0K 

[big snip]

32079 42       gnome-shell --mode=gdm         41.9M     1.9M     2.0M     5.0M 
32403 1001     /opt/google/chrome/chrome -    43.1M   118.5M   119.4M   132.3M 
 4844 1002     /opt/google/chrome/chrome      48.1M    38.1M    41.9M    51.9M 
 5411 1002     /opt/google/chrome/chrome -    54.6M    33.4M    33.5M    36.8M 
 5624 1002     /opt/google/chrome/chrome -    72.4M    54.9M    55.5M    65.7M 
24328 1002     /opt/Adobe/Reader9/Reader/i    77.5M     1.9M     2.0M     5.2M 
 4921 1002     /opt/google/chrome/chrome -   147.2M   258.4M   259.4M   272.0M 
-------------------------------------------------------------------------------
  214 14                                       1.1G     1.1G     1.2G     1.7G 

स्रोत यह भी प्रदान करता है smemcapकि सभी प्रासंगिक डेटा संग्रहीत किए जाएंगे ताकि बाद में उस पर स्मैम चलाया जा सके।

   To  capture  memory statistics on resource-constrained systems, the the
   smem source includes a utility named  smemcap.   smemcap  captures  all
   /proc entries required by smem and outputs them as an uncompressed .tar
   file to STDOUT.  smem can analyze the output using the --source option.
   smemcap is small and does not require Python.

1
F17 रेपो से स्मैम ने काम नहीं किया (एक खाली सूची दिखाई), लेकिन स्रोत से एक ने काम किया और दूसरों के रूप में लगभग समान संख्या दिखा रहा है :-) mysql 358.1M 392.6M कुल में से, जबकि शीर्ष शो 1191224k इस्तेमाल किया
Radek Hladík

4

आपको इस स्क्रिप्ट को किसी अन्य मशीन पर जांचना चाहिए, क्योंकि मेरा सिस्टम सही स्वैप उपयोग दिखाता है:

# Your_script.sh
111280   Total Swap Used
# free
Swap:     33551716     120368   33431348

बहुत पास 111280 ~ = 120368।

इस लिपि को भी देखें:

में खरीद के लिए / खरीद / *; do बिल्ली $ proc / smaps 2> / dev / null | awk '/ स्वैप / {स्वैप + = $ 2} END {प्रिंट स्वैप "\ t' readlink $proc/exe'"}'; हो गया | सॉर्ट-एन | awk '{कुल + = $ 1} / [0-9] /; END {प्रिंट कुल "\ tTotal"} "

इस धागे से:

/unix/71714/linux-total-swap-used-swap-used-by-processes


उल्लिखित स्क्रिप्ट समान परिणाम दे रही है ... 364920 / usr / libexec / mysqld 400372 कुल
राडेक हल्दिक

जब मैंने बहुत कम स्वैप उपयोग (50 एमबी) के साथ अन्य सर्वर पर स्क्रिप्ट की कोशिश की, तो यह कुल मिलाकर 72 एमबी की सूचना दी :-) मुझे बाद में इसे कुछ गैर
अनुक्रमण
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.