जब बहुत सारी फ्री मेमोरी बच जाती है तो स्वैप का उपयोग क्यों किया जाता है?


35

मेरे पास अच्छे मेमोरी संसाधनों के साथ बहुत अच्छा वेब (समर्पित) सर्वर है:

System information
Server load     2.19 (8 CPUs)   
Memory Used     29.53% (4,804,144 of 16,267,652)    
Swap Used   10.52% (220,612 of 2,097,136)   

जैसा कि आप देख सकते हैं, मेरा सर्वर स्वैप का उपयोग कर रहा है जब बहुत सारी मुफ्त मेमोरी उपलब्ध है।

क्या यह सामान्य है या कॉन्फ़िगरेशन या कोडिंग में कुछ गड़बड़ है?

NB
My MySQL प्रक्रिया किसी कारण से 160% से अधिक CPU शक्ति का उपयोग कर रही है; मुझे पता नहीं क्यों, लेकिन मेरे पास 70 से अधिक एक साथ उपयोगकर्ता नहीं हैं ...


एप्लीकेशन लिनक्स में 100% से अधिक CPU का उपयोग कर सकते हैं? एर्म ...
ब्लूराजा

5
@BlueRaja: हाँ, क्योंकि लिनक्स में CPU उपयोग को एक एकल CPU के सापेक्ष मापा जाता है, आपके सिस्टम के सभी CPU के लिए नहीं। तो 8 सीपीयू वाली मशीन में, आपके पास अधिकतम 800% सीपीयू उपलब्ध है।
21:39 पर डैनियल Pryden

MySQL के किस संस्करण का उपयोग कर रहे हैं ???
रोलैंडमाइसीडीडीबीए

@RolandoMySQLDBA संस्करण 5.5
user1179459

जवाबों:


61

यह पूरी तरह से सामान्य है।

सिस्टम स्टार्टअप पर, कई सेवाएं शुरू होती हैं। ये सेवाएं खुद को इनिशियलाइज़ करती हैं, कॉन्फ़िगरेशन फ़ाइलों में पढ़ती हैं, डेटा स्ट्रक्चर्स वगैरह बनाती हैं। वे कुछ स्मृति का उपयोग करते हैं। इनमें से कई सेवाएँ पूरे सिस्टम के लिए फिर कभी नहीं चलेंगी क्योंकि आप उनका उपयोग नहीं कर रहे हैं। उनमें से कुछ घंटों, दिनों या हफ्तों में चल सकते हैं। फिर भी यह सारा डेटा भौतिक स्मृति में है।

बेशक, सिस्टम इस डेटा को फेंक नहीं सकता है। यह साबित नहीं हो सकता है कि यह सचमुच कभी एक्सेस नहीं किया जाएगा। उन सेवाओं में से एक, उदाहरण के लिए, वह हो सकती है जो आपको बॉक्स तक दूरस्थ पहुंच प्रदान करती है। आपने एक सप्ताह में इसका उपयोग नहीं किया होगा, लेकिन यदि आप इसका उपयोग करते हैं, तो यह बेहतर काम था।

लेकिन सिस्टम को पता है कि वह उस भौतिक मेमोरी का उपयोग डिस्क कैश जैसी चीजों के लिए या अन्य तरीकों से कर सकता है जो प्रदर्शन को बेहतर बनाएगा। तो यह अवसरवादी स्वैपिंग करता है। जब इसके पास करने के लिए बेहतर कुछ नहीं होता है, तो यह उन डेटा को लिखता है जो स्वैप स्पेस का उपयोग करके डिस्क पर बहुत लंबे समय तक उपयोग नहीं किया गया है। हालाँकि, यह अभी भी पृष्ठों को भौतिक स्मृति में रखता है। तो वे अभी भी उन्हें स्वैप के बिना पहुँचा जा सकता है।

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


उस स्थिति में आप कृपया बता सकते हैं कि कभी-कभी स्वैप स्थान का उपयोग क्यों नहीं किया जाता है। मेम: 49554484k कुल, 4087592k इस्तेमाल किया, 45466892k फ्री, 349244k बफ़र्स स्वैप: 94204k कुल, 0k इस्तेमाल किया, 94204k फ्री, 1113644k कैश हुआ
अनंत

4
@ नान्थन: इसके कई कारण हो सकते हैं। सबसे अधिक संभावना यह है कि सिस्टम कभी भी किसी भी स्मृति दबाव में नहीं था, यहां तक ​​कि बफर लिखे जाने के कारण भी, इसलिए अवसरवादी स्वैप कोड कभी भी ट्रिगर नहीं हो सकता है। यह भी हो सकता है कि किसी ने सोचा था कि कोई स्वैप उपयोग बुरा था और इसलिए प्रणाली को अवसरवादी रूप से स्वैप नहीं करने के लिए गलत तरीके से ट्यून किया गया ( स्वैग को कम करके )।
डेविड श्वार्ट्ज

6

ऐसा हो सकता है यदि अतीत में कुछ समय के लिए आपको मशीन में भौतिक रैम की तुलना में अधिक मेमोरी की आवश्यकता होती है। उस समय कुछ डेटा स्वैप स्पेस को लिखा गया होगा।

जब बाद में स्मृति मुक्त हो जाती है, तो स्वैप से डेटा स्वचालित रूप से रैम में वापस नहीं पढ़ा जाता है: यह केवल तब होता है जब स्वैप में डेटा वास्तव में किसी प्रक्रिया द्वारा आवश्यक होता है। यह पूरी तरह से सामान्य है।

आपकी mysql प्रक्रिया के लिए: यह सब आपके द्वारा चलाए जाने वाले प्रश्नों के प्रकार पर निर्भर करता है। सिद्धांत रूप में 2 बहुत ही जटिल प्रश्न संभवतः आपके उपयोगकर्ताओं की संख्या की परवाह किए बिना इस तरह के भार को प्राप्त करने के लिए पर्याप्त हो सकते हैं। आप धीमे क्वेरी लॉग को अधिक अंतर्दृष्टि प्राप्त करने में सक्षम कर सकते हैं जिसमें प्रश्न लोड-गहन हैं।


नहीं - स्वैप उपयोग एक उच्च पानी का निशान नहीं है। जब स्वैप किए गए पृष्ठ वापस मैप किए जाते हैं, तो डिस्क पृष्ठ उपयोग में नहीं (लेकिन फिर भी डेटा हो सकता है) के रूप में चिह्नित किए जाते हैं।
सिम्बियन

मैंने केवल एक परिदृश्य का उल्लेख किया है जिसमें आप स्वैप उपयोग कर सकते हैं, लेकिन यह वास्तव में हमेशा पर्याप्त शारीरिक स्मृति नहीं होने का लक्षण नहीं है - जैसा कि ऊपर डेविड शवार्ट्ज द्वारा भी समझाया गया है
brain99

3

आप इस व्यवहार को बदल भी सकते हैं sysctl -w vm.swappiness=10, जिससे स्वैप का उपयोग तब तक बहुत कम हो जाएगा जब तक कि वास्तव में इसकी आवश्यकता न हो।

MySQL के लिए, क्या आपने ट्यूनिंग-primer.sh स्क्रिप्ट का उपयोग करके कम से कम बेसलाइन कॉन्फ़िगरेशन टेस्ट किया है ?


1
इससे कैश / बफ़र्स को पुनः प्राप्त करने की प्रवृत्ति बढ़ेगी। दुर्भाग्य से यह मूल प्रश्न से स्पष्ट नहीं है कि क्या 29.53% के आंकड़े में बफ़र्स / कैश शामिल हैं - यदि ऐसा नहीं होता है, तो आपके द्वारा शर्करा को बदलने वाले परिवर्तन का प्रदर्शन पर प्रतिकूल प्रभाव पड़ेगा। अगर यह dbms बड़े पैमाने पर इनोडब का उपयोग कर रहा है, तो संभवतः इसे बुरी तरह से कॉन्फ़िगर किया गया है (हालांकि एक 8 कोर 16 जीबी बॉक्स एक वेबसर्वर के रूप में उपयोग के लिए शुरू होने के लिए एक बुरा विकल्प है)
सहानुभूति

आप वेब सर्वर के लिए इसका बुरा विकल्प क्यों कहते हैं? मैं मासूमियत का उपयोग नहीं करता हूं, मैं अभी भी मायसम पसंद करता हूं क्योंकि मेरे रीड 70% हैं और केवल 30% लिखते हैं ....
user1179459

1

यह संभवतः, जैसा कि डेविड ने समझाया, लिनक्स कर्नेल का एक सामान्य व्यवहार, लेकिन यह MySQL "स्वैप पागलपन" समस्या की घटना भी हो सकती है । आपके मामले में (8 सीपीयू, 16 जीबी रैम कुल, 5 जीबी का उपयोग), ऐसा होने के लिए, आपके कंप्यूटर में 4 नोड्स (सॉकेट) और 4 जीबी रैम प्रति नोड और 4 के एक MySQL InnoDB बफर पूल के साथ NUMA सिस्टम होना चाहिए। जीबी।

संक्षेप में (आपको पूर्ण विवरण के लिए ऊपर दिए गए लिंक को पढ़ना चाहिए), ऐसा ही होता है:

  1. जब आपकी प्रणाली शुरू होती है, तो सभी NUMA नोड्स पर उनकी स्मृति का उपयोग करके प्रक्रियाएं फैल जाती हैं।
  2. जब MySQL शुरू होता है, तो यह इनोबीडी बफर पूल के लिए 4 जीबी आवंटित करता है, एक NUMA नोड की रैम को भरता है और अन्य नोड पर कुछ रैम का उपयोग करता है।
  3. फिर, लिनक्स कर्नेल, जो आवंटित NUM को एक NUMA नोड से दूसरे में नहीं ले जा सकता है, सोचता है कि भूखे नोड से पृष्ठों को स्वैप करना अच्छा है (या पृष्ठों को स्वैप करने की आवश्यकता है क्योंकि पृष्ठों को स्वैप करने की आवश्यकता है)।

उससे बचने के लिए, सभी कोर पर रैम आवंटित करने के लिए MySQL के लिए मेमोरी आवंटन बदलें (अधिक जानकारी के लिए उपरोक्त लिंक देखें)।

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