मेरा उत्पादन होस्ट नीचे है:
लगभग 40GB मुफ्त, अप्रयुक्त मेमोरी स्पेस को बनाए रखते हुए, सिस्टम 1GB स्वैप का उपयोग कर रहा है। क्या मुझे इस बारे में चिंतित होना चाहिए, या यह ज्यादातर सामान्य है?
free -m
। ग्राफिक्स को पढ़ना मुश्किल है।
मेरा उत्पादन होस्ट नीचे है:
लगभग 40GB मुफ्त, अप्रयुक्त मेमोरी स्पेस को बनाए रखते हुए, सिस्टम 1GB स्वैप का उपयोग कर रहा है। क्या मुझे इस बारे में चिंतित होना चाहिए, या यह ज्यादातर सामान्य है?
free -m
। ग्राफिक्स को पढ़ना मुश्किल है।
जवाबों:
यह कोई समस्या नहीं है और सामान्य होने की संभावना है। बहुत सारे कोड (और संभवतः डेटा) का उपयोग शायद ही कभी किया जाता है, इसलिए सिस्टम मेमोरी को मुक्त करने के लिए इसे स्वैप करेगा।
अगर मेमोरी को लगातार और अंदर स्वैप किया जा रहा है तो स्वैपिंग केवल एक समस्या है। यह उस तरह की गतिविधि है जो प्रदर्शन को मारता है और सिस्टम पर कहीं और एक समस्या का सुझाव देता है।
यदि आप अपनी स्वैप गतिविधि की निगरानी करना चाहते हैं तो आप कई उपयोगिताओं के साथ कर सकते हैं लेकिन vmstat
आमतौर पर यह काफी उपयोगी है
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 348256 73540 274600 0 0 1 9 9 6 2 0 98 0 0
0 0 0 348240 73544 274620 0 0 0 16 28 26 0 0 100 0 0
0 0 0 348240 73544 274620 0 0 0 0 29 33 0 0 100 0 0
0 0 0 348240 73544 274620 0 0 0 0 21 23 0 0 100 0 0
0 0 0 348240 73544 274620 0 0 0 0 24 26 0 0 100 0 0
0 0 0 348240 73544 274620 0 0 0 0 23 23 0 0 100 0 0
पहली पंक्ति को अनदेखा करें क्योंकि यह गतिविधि शुरू होने के बाद से गतिविधि है। के तहत si
और so
स्तंभों पर ध्यान दें ---swap--
; वे आम तौर पर काफी छोटे आंकड़े होने चाहिए यदि समय के बहुमत के लिए 0 नहीं।
यह भी ध्यान देने योग्य है कि इस प्रीमेप्टिव स्वैपिंग को कर्नेल सेटिंग के साथ नियंत्रित किया जा सकता है। फ़ाइल में /proc/sys/vm/swappiness
0 और 100 के बीच एक संख्या होती है जो कर्नेल को बताती है कि मेमोरी को स्वैप करने के लिए कितनी आक्रामक है। यह देखने के लिए फ़ाइल सेट करें कि यह किस पर सेट है। डिफ़ॉल्ट रूप से, अधिकांश लिनक्स डिस्ट्रोस इसे 60 तक डिफ़ॉल्ट करते हैं, लेकिन यदि आप मेमोरी समाप्त होने से पहले कोई स्वैपिंग नहीं देखना चाहते हैं, तो फ़ाइल में 0 को इस तरह से प्रतिध्वनित करें:
echo 0 >/proc/sys/vm/swappiness
इसे जोड़कर स्थायी बनाया जा सकता है
vm.swappiness = 0
को /etc/sysctl.conf
।
echo 0 >/proc/sys/vm/swappiness
:। इसे vm.swappiness = 0
/etc/sysctl.conf में जोड़कर स्थायी बनाया जा सकता है ।
swappiness=7
कुछ या कुछ के साथ , लंबे समय तक अप्रयुक्त पृष्ठों की अदला-बदली होती है। कोई बड़ा swappiness=0
मान और कोई मान भी कम अंतर है । कर्नेल-डिफॉल्ट swappiness=60
आमतौर पर सर्वरों के लिए अच्छा होता है, और यह केवल डेस्कटॉप इंटरेक्टिव उपयोग के लिए होता है, जहाँ कम स्वैग अच्छा होता है। लेकिन इसे 7 या कुछ करने के लिए सेट करने से बहुत नुकसान नहीं होना चाहिए। (लेकिन मैंने जाँच नहीं की है, मैं एक सर्वर sysadmin नहीं हूँ)।
swappiness
काम बढ़िया नहीं होता। दबाव के साथ, आप देखेंगे कि swappiness=7
फ़ाइल कैश को लगभग पूरी तरह से विस्तारित अवधि के लिए भुनाता है , जबकि swappiness=60
बहुत सारे कैश को परिसमाप्त करता है, लेकिन सेकंड के भीतर बाहर स्वैप करना शुरू कर देता है। यह अभी भी कैश है जो धड़कन लेता है, लेकिन बहुत अधिक संतुलित तरीके से।
अगर यह करने के लिए बेहतर कुछ नहीं है, तो लिनक्स डिस्क से पहले के पन्नों को लिख देगा। इसका मतलब यह नहीं है कि यह उन पृष्ठों को स्मृति से बेदखल कर देगा, हालांकि। यह सिर्फ उस मामले में यह चाहिए भविष्य में कुछ समय उन पृष्ठों को बेदखल, यह है, क्योंकि वे पहले से ही देखते हैं प्रतीक्षा करने के लिए उन्हें डिस्क पर लिखे जाने की जरूरत नहीं है।
आखिरकार, आप जिस कारण से याददाश्त से बाहर चल रहे हैं, वह शायद इसलिए है क्योंकि आपकी मशीन पहले से ही कड़ी मेहनत कर रही है, आप स्वैपिंग के अलावा इसके अतिरिक्त बोझ नहीं चाहते हैं। जब मशीन कुछ नहीं कर रही हो तो स्वैपिंग करना बेहतर होगा।
एक समान कारण के लिए, आपकी स्मृति हमेशा भरी होनी चाहिए। मेमोरी पेज, फाइलसिस्टम कैशे, में tmpfs
इतना सारा सामान होता है जिसे मेमोरी में रखा जा सकता है। वास्तव में, आपको चिंतित होना चाहिए कि क्या आपकी मेमोरी खाली है; आखिरकार, आपने इसके लिए बहुत सारे पैसे का भुगतान किया (कम से कम डिस्क स्थान की समान मात्रा की तुलना में), इसलिए इसका बेहतर उपयोग किया जाए!
vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
6 0 521040 114564 6688 377308 8 13 639 173 0 1100 5 4 90 0
1 0 521040 114964 6688 377448 0 0 256 0 0 1826 3 4 94 0
0 0 521040 115956 6688 377448 0 0 0 0 0 1182 7 3 90 0
0 0 521036 115992 6688 377448 4 0 16 0 0 1154 10 2 88 0
3 0 521036 114628 6696 377640 0 0 928 224 0 1503 15 17 67 1
स्तंभ स्वैप कोई समस्या नहीं है। कॉलम सी पर गैर शून्य मान और इसलिए सर्वर प्रदर्शन के लिए घातक हैं। विशेष रूप से बहुत से RAM वाले।
कई जीबी रैम वाली मशीनों पर स्वैपन को अक्षम करना सबसे अच्छा है:
sysctl -w vm.swappiness=0
यह स्वैप को अक्षम नहीं करेगा। यह केवल लिनक्स को अंतिम उपाय के रूप में स्वैप का उपयोग करने का निर्देश देगा। यह कुछ MB प्रोग्रामों को बर्बाद कर देगा जिन्हें RAM में होने की आवश्यकता नहीं है ... लेकिन आपकी डिस्क एक्सेस कॉपियों को फूला हुआ स्वैप करने के लिए बेहतर है।
हमें याद आया कि दो दशक पहले एक बड़े ४ remember६ में केवल ३२ एमबी रैम था। स्वैप एल्गोरिदम तब विकसित किया गया था जब पूरे रैम को दूसरे के एक छोटे से अंश में डिस्क पर ले जाया जा सकता था। उस समय के धीमे डिस्क के साथ भी। यही कारण है कि डिफ़ॉल्ट स्वैप नीतियां इतनी आक्रामक हैं। राम उन दिनों अड़चन थे। तब से रैम का आकार 10,000 गुना से अधिक और डिस्क की गति 10 गुना से कम हो गई। इसने अड़चन को डिस्क बैंडविड्थ में स्थानांतरित कर दिया।
Si और इसलिए टन के साथ मशीनों पर गतिविधि घातक है क्योंकि इसका मतलब है कि सिस्टम रैम के लिए खुद से लड़ रहा है। ऐसा क्या होता है कि रैम की तुलना में डिस्क, यहां तक कि बड़े स्टोरेज भी धीमा होते हैं। आक्रामक स्वैप एप्लिकेशन डेटा पर कर्नेल डिस्क कैश का पक्षधर है और रैम के लिए लड़ने का सबसे आम स्रोत है। चूँकि OS को प्रत्येक si पर डिस्क कैश मुक्त करना होगा , अतिरिक्त कैश जो स्वैप प्रदान करता है उसके जीने का समय उपयोगी रास्ते के लिए बहुत कम है। नतीजा यह है कि आप कैश को स्टोर करने के लिए डिस्क बैंडविड्थ ले रहे हैं जो शायद उपयोग नहीं किया जाएगा और आपके प्रोग्राम को सी पेज के इंतजार में रोक देगा । अर्थ है कि अनुप्रयोगों के लिए बहुत कम या कोई लाभ नहीं के साथ बहुत सारे महत्वपूर्ण संसाधनों की खपत होती है।
प्रतिक्रिया के शीर्षक पर ध्यान दें "बहुत सारे रैम के साथ सर्वर पर स्वैप गतिविधि"। यह कभी-कभी सी और इतनी गतिविधि वाली मशीनों पर लागू नहीं होता है। यह भविष्य में लागू नहीं हो सकता है यदि ओएस में होशियार स्वैप एल्गोरिदम विकसित किए जाते हैं।
लोग स्वैपिंग एल्गोरिथम को रोमांटिक करते हैं। कुछ लोग कहते हैं "यह रैम के कम उपयोग किए जाने वाले पृष्ठों को लेता है", लेकिन यह वह नहीं है जो कर्नेल बिल्कुल नहीं करता है। स्वैप के बारे में समझना मुश्किल है कि कर्नेल को पता नहीं है कि "कोल्ड पेज" क्या है। कर्नेल के पास यह निर्धारित करने के लिए एक अच्छा मीट्रिक नहीं है कि क्या पृष्ठ का उपयोग किया जाता है या निकट भविष्य में उपयोग किए जाने की संभावना है। इस बात को दरकिनार करने के लिए कि कर्नेल बेतरतीब ढंग से स्वैप में पृष्ठों को रखता है और जिन पृष्ठों की आवश्यकता नहीं होती है, वे वहाँ रहते हैं। उस एल्गोरिथ्म की समस्या यह है कि पृष्ठों को स्वैप में जाने की आवश्यकता है ताकि पता चल सके कि क्या उन्हें अनुप्रयोगों द्वारा आवश्यक है। और इसका मतलब बहुत सारे "गर्म" पृष्ठ स्वैप पर जाएंगे। रैम की तुलना में डिस्क के साथ समस्या बहुत धीमी है।
मैंने अपना स्वयं का बेंचमार्क बनाया जो एक वास्तविक परिदृश्य है जो एक सभ्य वॉल्यूम के साथ कई अनुप्रयोगों के लिए बहुत आम है। अपने परीक्षणों से, मैंने थ्रूपुट या विलंबता पर कोई लाभ नहीं देखा जब स्वैप उपयोग में हैं। इससे दूर। जब स्वैपिंग शुरू होती है तो यह कम से कम परिमाण के माध्यम से थ्रूपुट और विलंबता दोनों को धीमा कर देती है।
मैं इस बारे में थोड़ा और आगे बढ़ता हूं: मैं समझता हूं कि स्वैप प्रसंस्करण के लिए नहीं है। स्वैप केवल आपात स्थितियों के लिए हैं। वे क्षण जब बहुत अधिक एप्लिकेशन एक ही समय में चल रहे होते हैं और आपको मेमोरी स्पाइक मिलता है। स्वैप के बिना यह मेमोरी त्रुटियों का कारण होगा। मैं स्वैप उपयोग को विकास और उत्पादन टीमों की विफलता मानता हूं। यह केवल एक राय है जो हमने यहां चर्चा की थी उससे आगे जाती है, लेकिन मुझे लगता है। बेशक मेरे अनुप्रयोगों में स्वयं के द्वारा उत्कृष्ट स्मृति प्रबंधन है।
si
आपके सर्वर से अधिक घातक कैसे है bi
? दोनों का अर्थ है कि कुछ कार्यक्रम डिस्क से मेमोरी तक 4096 बाइट्स के पढ़ने की प्रतीक्षा कर रहे हैं। bi
किसी भी फाइल से है, और si
फ़ाइलों की एक विशिष्ट संकीर्ण श्रेणी से (लेकिन उनके बाइट्स के लिए कदम बस के रूप में तेजी से ठीक उसी पथ के माध्यम से)।
swappiness=0
सर्वर के लिए पूरी तरह से अनुचित लगता है। आप इसे एक इंटरेक्टिव डेस्कटॉप सिस्टम के लिए विचार कर सकते हैं (लेकिन फिर भी, swappiness=1
वास्तव में ठंडे पृष्ठों को स्वैप करने के लिए एक बेहतर विकल्प है)। एक और जवाब पर टिप्पणियाँ देखें । swappiness=7
या कुछ OOM तक RAM में ठंडे पन्नों को पिन किए बिना स्वैप गतिविधि को नाटकीय रूप से कम कर देगा, और यह विचार करने के लायक है कि क्या आपको लगता 60
है कि एक विशिष्ट सर्वर के लिए बहुत स्वैपी है।
si
है कि इससे भी बदतर है bi
। अधिकांश सर्वर सॉफ़्टवेयर को इस धारणा के आसपास डिज़ाइन किया गया है कि डिस्क से I / O धीमा हो सकता है, और I / O का इंतजार करते समय सामान्य रूप से उत्तरदायी बने रहने के लिए थ्रेड्स, Async I / O, या कुछ अन्य तकनीक का उपयोग करता है। पेज की गलती कहीं भी हो सकती है। सबसे खराब स्थिति में, एक धीमा पृष्ठ दोष लॉक लेने के बाद हो सकता है, अन्य महत्वपूर्ण सूत्र ~ 10ms (धीमे घूर्णी भंडारण पर स्वैप के साथ) के लिए उस महत्वपूर्ण खंड में प्रवेश करने से रोकते हैं। यदि एक महत्वपूर्ण खंड एक साझा डेटा संरचना से संभावित-ठंडे पेज पर डेटा की प्रतिलिपि बनाता है, तो यह प्रशंसनीय हो सकता है।
यह आपके प्रश्न का उत्तर नहीं है; बल्कि, एक अतिरिक्त निर्णय लेने में आपकी मदद करने के लिए सिर्फ अतिरिक्त जानकारी।
यदि आप जानना चाहते हैं कि कौन सी प्रक्रियाएँ विशेष रूप से कितनी अदला-बदली का उपयोग कर रही हैं, तो यहाँ थोड़ा शेल स्क्रिप्ट है:
#!/bin/bash
set -o posix
set -u
OVERALL=0
for DIR in `find /proc/ -maxdepth 1 -type d -regex "^/proc/[0-9]+"` ; do
PID=`echo $DIR | cut -d / -f 3`
PROGNAME=`ps -p $PID -o comm --no-headers`
SUM=0
for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'` ; do
let SUM=$SUM+$SWAP
done
echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"
let OVERALL=$OVERALL+$SUM
done
echo "Overall swap used: $OVERALL"
मुझे यह भी जोड़ना चाहिए कि tmpfs भी स्वैप करेंगे। यह प्रणाली का उपयोग करके आधुनिक लिनक्स सिस्टम पर अधिक सामान्य है जो tmpfs का उपयोग करके उपयोगकर्ता-स्पेस / tmp ओवरले बनाते हैं।
awk '/Swap/ {sw += $2} FNR==1 { /*first line of a new file */ find the command somehow, maybe still fork/exec ps;} END { print totals }' /proc/[0-9]*/smaps
। यह हर प्रक्रिया के लिए कट और पीएस चलाता है, और सिस्टम में हर प्रक्रिया के लिए grep + awk कई बार।
मैंने देखा है कि MySQL क्लस्टर प्रतिकृति धीमी हो जाती है या विफल हो जाती है जब एजेंट भारी रूप से स्वैप कर रहे होते हैं। हो सकता है कि कुछ एप्लिकेशन को कोई आपत्ति न हो या शायद कुछ अदला-बदली से भी फायदा हो, लेकिन डेटाबेस वास्तव में इससे पीड़ित लगते हैं। हालाँकि कई चर्चाएँ मैंने मंचों पर देखी हैं जो विशिष्ट कार्य भार चर्चा से स्वैच्छिक चर्चा पर चर्चा करती हैं।
DBA की दुनिया में सर्वसम्मति से प्रतीत होता है कि "यह सामान्य ज्ञान है कि जब आप MySQL (या वास्तव में कोई अन्य DBMS) चला रहे हैं, तो आप अपने स्वैप स्थान में किसी भी I / O को नहीं देखना चाहते हैं। कैश आकार का स्केलिंग (उपयोग करके) innodb_buffer_pool_size in MySQL के मामले में) यह सुनिश्चित करने के लिए मानक अभ्यास है कि पर्याप्त स्वतंत्र मेमोरी है, इसलिए स्वैपिंग की आवश्यकता नहीं है।
लेकिन क्या होगा अगर आप कुछ गलती करते हैं या मिसकॉल करते हैं, और स्वैपिंग होती है? यह वास्तव में प्रदर्शन को कितना प्रभावित करता है? यह वही है जो मैंने जांच के लिए निर्धारित किया है। "
मुझे आशा है कि पाठकों को निम्नलिखित लिंक एप्रोपोस मिलेंगे।
https://www.percona.com/blog/2017/01/13/impact-of-swapping-on-mysql-performance/
https://www.percona.com/blog/2010/01/18/why-swapping-is-bad-for-mysql-performance/