क्या थ्रेड्स वर्चुअल मेमोरी या वास्तविक मेमोरी का उपयोग करते हैं?


10

मैं अपने लिनक्स सर्वर को 10,000 थ्रेड प्रति प्रक्रिया को संभालने के लिए ऑप्टिमाइज़ करने की कोशिश कर रहा था, जबकि अभी यह केवल 382 है। के अनुसार इस लेख निम्न सूत्र बाहर कुल संभव धागे को खोजने के लिए प्रयोग किया जाता है:

number of threads = total virtual memory / (stack size*1024*1024)

इसका मतलब है कि थ्रेड्स अपने सभी डेटा को वर्चुअल मेमोरी में स्टोर करते हैं। और मेरे ज्ञान का सबसे अच्छा करने के लिए, वर्चुअल मेमोरी एक लिनक्स मशीन में स्वैप स्पेस है जो रैम या कैश की तुलना में हार्डडिस्क पर संग्रहीत होती है।

तो मेरा सवाल यह है कि हमारे थ्रेड हार्डडिस्क का उपयोग अपने डेटा को प्रोसेस / स्टोर करने के लिए करते हैं।

यदि हाँ, तो इस प्रभाव प्रदर्शन नहीं है? क्या हम रैम या कैश पर उन्हें डालकर प्रदर्शन बढ़ा सकते हैं? कैसे?

यदि नहीं, तो धागे वास्तव में कैसे काम करते हैं?

अपडेट करें:

बेकार के उत्तर के अनुसार , वर्चुअल मेमोरी एक प्रणाली है जिसमें मोटे तौर पर शामिल होता है:

  • भौतिक मेमोरी (RAM)
  • आपके द्वारा संलग्न कोई भी स्वैप
  • जब वर्चुअल पता भौतिक स्मृति में उपलब्ध नहीं है, तो वर्चुअल को भौतिक पते में अनुवाद करने और पृष्ठ दोष जारी करने के लिए हार्डवेयर समर्थन
  • (कर्नेल) सॉफ़्टवेयर समर्थन: उस हार्डवेयर द्वारा उपयोग किए गए लुकअप तालिकाओं को प्रबंधित करना, जो मांग पर स्वाइप से पृष्ठों को खींचकर उन पृष्ठ दोषों को संभालते हैं

इस प्रकार, वर्चुअल मेमोरी पर मौजूद सब कुछ सामूहिक रूप से रैम (रियल मेमोरी) और हार्ड डिस्क (स्वैप फाइल) पर है। और जैसा कि जेम्स ने राम बनाम एचडीडी पर अपने जवाब के फैसले में समझाया है कि कर्नेल ने एलआरयू जैसे एल्गोरिदम का उपयोग किया है।


2
जब तक आपके सर्वर में 10,000 CPU / Cores नहीं हैं, आप अपना समय बर्बाद कर रहे हैं।

@JarrodRoberson: कोई भी ऐसा क्यों है?
ड्रैगोस्रस्परकोल

3
10,000 थ्रेड्स चीजों को पैमाना बनाने का एक अच्छा तरीका नहीं है, यह एक अच्छा तरीका है कि एक सर्वर को क्रॉल पर लाया जाए, सीपीयू या कोर पर 1 से अधिक थ्रेड बस सर्वर संदर्भ स्विच बनाने और धीमी गति से चलाने के लिए नहीं है।

विशेष रूप से, जब आप कहते हैं "मेरे लिनक्स सर्वर को अनुकूलित करने की कोशिश कर रहे हैं" - क्या आप अनुकूलन करने की कोशिश कर रहे हैं? यदि यह थ्रूपुट है, तो मल्टीप्लेक्सिंग और गैर-अवरुद्ध I / O के साथ सीपीयू प्रति एक धागा बेहतर होने की संभावना है।
बेकार

जवाबों:


12

मेरे ज्ञान का सबसे अच्छा करने के लिए, वर्चुअल मेमोरी एक लिनक्स मशीन में स्वैप स्पेस है

नहींं, वर्चुअल मेमोरी एक प्रणाली है जिसमें मोटे तौर पर शामिल हैं:

  • भौतिक मेमोरी (RAM)
  • आपके द्वारा संलग्न कोई भी स्वैप
  • जब वर्चुअल पता भौतिक स्मृति में उपलब्ध नहीं है, तो वर्चुअल को भौतिक पते में अनुवाद करने और पृष्ठ दोष जारी करने के लिए हार्डवेयर समर्थन
  • (कर्नेल) के लिए सॉफ़्टवेयर समर्थन:
    • उस हार्डवेयर द्वारा उपयोग किए जाने वाले लुकअप टेबल का प्रबंधन करना
    • मांग पर स्वैप से पृष्ठों को खींचकर उन पृष्ठ दोषों को संभालना

यह सुनिश्चित करने के लिए कर्नेल पर निर्भर है कि आप जो वर्चुअल मेमोरी चाहते हैं वह रैम में कैश्ड है जब आप इसे चाहते हैं - जब तक कि आप अपने स्वयं के उपयोगकर्ता वीएम परत (जैसे डेटाबेस अक्सर करते हैं, iiuc) नहीं लिख रहे हैं, बस इसके बारे में चिंता न करें।


ठीक है तो मेरी आभासी स्मृति धारणा गलत थी। वैसे भी एक त्वरित अनुवर्ती प्रश्न .. यदि SWAP स्पेस RAM से अधिक है तो क्या पूरी तरह से अधिकतम थ्रेड प्रदर्शन प्रभावित होगा?
ड्रैगोस्रस्परकोल

@dragosrsupercool: आपका स्वैप स्थान हमेशा भौतिक मेमोरी से बड़ा होने जा रहा है, अन्यथा वर्चुअल मेमोरी का उपयोग करने की आवश्यकता है।
ब्रायन ओकले

1
@BryanOakley: यह जरूरी सच नहीं है। कुछ OS आवंटित किए गए प्रत्येक वर्चुअल पेज के लिए एक स्वैप पेज आवंटित करते हैं (यानी स्वैप कम से कम भौतिक रूप से बड़ा होना चाहिए)। अन्य OS केवल एक स्वैप पृष्ठ आवंटित करते हैं जब भौतिक स्मृति से पृष्ठ को स्थानांतरित करने की आवश्यकता होती है (यानी स्वैप भौतिक से कम हो सकती है)। पूर्व का लाभ यह है कि यदि आवंटन सफल होता है, तो उस मेमोरी को स्वैप करना हमेशा सफल होता है। उत्तरार्द्ध का लाभ यह है कि आपको अपेक्षाकृत दुर्लभ परिस्थितियों के लिए बड़ी मात्रा में स्वैप फ़ाइलों को आवंटित करने की आवश्यकता नहीं है।
mcmcc 15

1
@dragosrsupercool, प्रदर्शन RAM, स्वैप या उनके बीच के अनुपात से प्रभावित नहीं होगा जब तक कि आप RAM पर कम नहीं होते हैं और वास्तव में पेजिंग करते हैं। सर आपको पेजिंग गतिविधि के बारे में बता सकते हैं iirc ( sar -Bलिनक्स पर जाँच की गई )।
बेकार

@ समर्थन: जब तक मैं पूरी तरह से रैम का उपयोग नहीं करता हूं और पेजिंग शुरू नहीं करता, मैं थ्रेड्स की संख्या बढ़ाना चाहता हूं।
ड्रैगोस्रसपर्कूल

14

यदि थ्रेड वास्तव में चल रहा है, तो वर्तमान निर्देश, और, थ्रेड का उपयोग करने वाला कोई भी चर भौतिक मेमोरी में होना चाहिए।

अधिकांश (वास्तव में लगभग सभी) प्रोग्राम वर्चुअल मेमोरी में रहते हैं, और, अधिकांश प्रोग्राम वेरिएबल्स के भंडारण के लिए वर्चुअल मेमोरी का उपयोग करते हैं।

आभासी पतों को पृष्ठ के रूप में आयोजित किया जाता है (ये आमतौर पर 4096 या 8192 बाइट ब्लॉक होते हैं)।

किसी भी समय वर्चुअल मेमोरी के प्रत्येक ब्लॉक को वास्तविक मेमोरी में या इसके लिए आरक्षित "स्वैप स्पेस" में डिस्क पर कहीं संग्रहीत किया जाता है।

आपका प्रोग्राम कोड वर्चुअल एड्रेस के साथ डील करता है, जब आप वर्चुअल एड्रेस पर ब्रांच करते हैं, या, वर्चुअल एड्रेस पर स्टोरेज तक पहुंचने का अनुरोध करते हैं, तो सिस्टम (आमतौर पर हार्डवेयर लेवल पर) एड्रेस रिक्वेस्ट की वर्तमान लोकेशन पता करता है और इसे आपके वर्चुअल एड्रेस पर मैप करता है, यदि पता वर्तमान में डिस्क पर रहता है, तो यह वास्तविक मेमोरी में इसे प्रदर्शित करता है और फिर पते को मैप करता है।

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

आधुनिक प्रणालियों में वर्चुअल स्टोरेज से जुड़े कई अनुकूलन और ट्रिक्स हैं।

  • पते को "प्रति प्रक्रिया" के आधार पर मैप किया जाता है, उदाहरण के लिए लिनक्स बॉक्स में सभी C प्रोग्राम एक ही पते पर "मुख्य" प्रक्रिया शुरू करते हैं।
  • यह कई 32 बिट प्रक्रियाओं को एक मशीन पर 4GB से अधिक कब्जा करने और उपयोग करने में सक्षम कर सकता है क्योंकि 32 बिट वर्चुअल पते को वास्तविक 64 बिट पते पर मैप किया जा सकता है।
  • जब प्रक्रियाएं समाप्त हो जाती हैं या मेमोरी अन्यथा "फ्री" हो जाती है, तो सिस्टम सिर्फ़ पेजों को मुफ़्त में चिह्नित करता है, उन्हें कभी भी स्वैप डिस्क पर कॉपी नहीं किया जाता है।
  • इसी तरह जब भंडारण का एक नया ब्लॉक अनुरोध किया जाता है, तो सिस्टम वास्तविक मेमोरी में एक मुफ्त पेज को पकड़ लेता है, नहीं, डिस्क आईओ लेता है।
  • नींद और हाइबरनेट कार्य सभी मेमोरी को स्वैप स्थान पर कॉपी करने के लिए मजबूर करते हैं ताकि सभी वर्तमान प्रक्रियाएं और वर्तमान मेमोरी सामग्री को वेक-अप पर फिर से बनाया जा सके।

3
"लिनक्स के सभी सी प्रोग्राम एक ही पते पर शुरू होते हैं [मुख्य] ​​एक ही पते पर" पता नहीं लगता कि अंतरिक्ष लेआउट यादृच्छिकरण को ध्यान में रखता है। इसका उपयोग आज अधिक से अधिक विभिन्न स्टैक स्मैशिंग अटैक स्कीमों को विफल करने के लिए किया जाता है। अच्छा जवाब अन्यथा, +1।
बजे एक CVn

7

सबसे पहले, आपको कंप्यूटर मेमोरी पर अधिक पढ़ने की आवश्यकता है , क्योंकि आपको उस क्षेत्र में ज्ञान की कमी लगती है।

निष्पादन का एक धागा प्रसंस्करण की सबसे छोटी इकाई है जिसे एक ऑपरेटिंग सिस्टम द्वारा निर्धारित किया जा सकता है। धागे और प्रक्रियाओं का कार्यान्वयन एक ऑपरेटिंग सिस्टम से दूसरे में भिन्न होता है, लेकिन ज्यादातर मामलों में, एक प्रक्रिया के अंदर एक धागा निहित होता है। एकाधिक थ्रेड्स एक ही प्रक्रिया के भीतर मौजूद हो सकते हैं और संसाधनों को साझा कर सकते हैं जैसे कि मेमोरी, जबकि विभिन्न प्रक्रियाएं इन संसाधनों को साझा नहीं करती हैं।

तो, थ्रेड उपलब्ध मेमोरी का उपयोग करने जा रहे हैं - यह किसी भी तरह का उपलब्ध है। आप कितने धागे शुरू कर सकते हैं यह मेमोरी के आकार पर निर्भर करता है और प्रति थ्रेड के लिए कितनी मेमोरी की आवश्यकता होती है। यदि थ्रेड हीप का उपयोग करता है (केवल स्टैक नहीं), तो इसे अधिक मेमोरी की आवश्यकता होती है, और उस स्थिति में आप थ्रेड्स कम शुरू कर सकते हैं।


@VJonvic: मूल सूत्र स्पष्टीकरण के लिए +1।
Dragosrsupercool

6

आपके प्रश्न का सरल उत्तर है, वे वर्चुअल मेमोरी का उपयोग करते हैं। सब कुछOS से संबंधित कुछ मुट्ठी भर प्रक्रियाओं को छोड़कर वर्चुअल मेमोरी का उपयोग करता है।

दूसरी ओर, जब आपका धागा (या कोई भी धागा, किसी भी प्रक्रिया में) वास्तव में चल रहा होता है, तो यह भौतिक स्मृति का उपयोग कर रहा है। उस प्रक्रिया से जुड़े मेमोरी पेज को भौतिक मेमोरी में स्वैप किया जाता है, जहां प्रोसेसर अपना काम करता है।


3

वर्चुअल मेमोरी आपकी रैम और आपकी स्वैप स्पेस है। वर्चुअल का अर्थ है कि आपके प्रोग्राम को जो पता दिखता है वह रैम चिप के पते से अलग है। यदि आपको स्वैप में मेमोरी एक्सेस करने की आवश्यकता है, तो ओएस इसे पहले रैम में ले जाएगा। यदि आप कोई अदला-बदली नहीं चाहते हैं, तो इसे अक्षम करें। यदि आपके पास पर्याप्त रैम है तो आपको वास्तव में इसकी आवश्यकता नहीं है।

कहा जा रहा है, जब तक कि आपके पास 10,000 कोर प्रोसेसर नहीं है, 10,000 धागे तक बढ़ाना वास्तव में "अनुकूलन" नहीं है। एक बार जब आपके पास सभी कोर का उपभोग करने के लिए पर्याप्त थ्रेड होते हैं, और जब उन थ्रेड्स अवरुद्ध होते हैं, तो एक अतिरिक्त या दो के लिए, अधिक थ्रेड्स जोड़ने से स्विचिंग ओवरहेड और कैश मिस के कारण प्रदर्शन कम हो जाता है। यदि आप अपने प्रोग्राम लॉजिक को सरल बनाते हैं, तो आप अभी भी अधिक थ्रेड का उपयोग करना चाह सकते हैं, लेकिन आप प्रदर्शन को बंद कर देंगे।


हां, 10,000 बहुत ज्यादा है क्योंकि मेरा सर्वर 32 बिट सिंगल कोर मशीन है। दरअसल, धागे कुल सीपीयू चीज नहीं हैं। वे क्रॉलर थ्रेड हैं, इसलिए वे कभी-कभी सर्वर प्रतिक्रिया की प्रतीक्षा कर रहे हैं। मैं यह सुनिश्चित करने का लक्ष्य रखता हूं कि सीपीयू पूरी तरह से व्याप्त है, लेकिन अधिभार या अधिभार नहीं। लेकिन मैं अभी भी यह समझने में विफल हूं कि मुझे कैसे पता चलेगा कि सीपीयू मुफ्त या पूरी तरह से कब्जा है। क्या कोई टूल या कमांड है?
ड्रैगोस्रस्परकोल

मुझे लगता है कि आप उस जानकारी को topकमांड से प्राप्त कर सकते हैं ।
कार्ल बेवफेल्टट

@KarlBieledeldt: हाँ, यह वही था जो मैं चाह रहा था .. एक और अनुवर्ती प्रश्न: मैं बस रेंगने के लिए एक विचार के साथ आया था कि अगर कोई एक धागा urls के लिए अनुरोध भेज सकता है जबकि दूसरा धागा सर्वर प्रतिक्रिया प्राप्त करता है तो मैं रख सकता हूं बहुत सारे थ्रेड्स का उपयोग किए बिना CPU उपयोग उच्च। क्या यह संभव है? जैसे एक धागे से अनुरोध भेजना जबकि दूसरे धागे पर प्रतिक्रिया प्राप्त करना?
ड्रैगोस्रस्परकोल

2

प्रति प्रक्रिया 10,000 सूत्र को संभालने के लिए मेरे लिनक्स सर्वर का अनुकूलन करें

जैसा कि दूसरों ने समझाया, यह आमतौर पर गलत है। एक धागा एक महंगा संसाधन है , विशेष रूप से क्योंकि इसकी अपनी कॉल स्टैक (आमतौर पर, मेगाबाइट) है और क्योंकि यह कर्नेल द्वारा शेड्यूल किया गया कार्य है। खोले गए फ़ाइल डिस्क्रिप्टर की तुलना में थ्रेड्स अधिक महंगे हैं ।

ऑपरेटिंग सिस्टम पढ़ें : तीन आसान टुकड़े (स्वतंत्र रूप से डाउनलोड करने योग्य पाठ्यपुस्तक)।

अंगूठे के एक नियम के रूप में, आप कई धागे नहीं रखना चाहते हैं, और निश्चित रूप से बहुत सारे चलने योग्य धागे नहीं हैं। चल धागे की संख्या आमतौर पर कोर (या उस के एक छोटे से कई) की अधिकतम संख्या में होनी चाहिए , इसलिए लगभग एक दर्जन से अधिक। एक प्रक्रिया में थ्रेड्स की संख्या थोड़ी बड़ी हो सकती है। इसलिए जब तक आपके पास बहुत विस्तारक सर्वर (कई प्रोसेसर सॉकेट और कोर के साथ) नहीं है, आप अपनी प्रक्रिया में एक दर्जन से अधिक रन करने योग्य धागे और एक सौ धागे (उनमें से अधिकांश बेकार हो रहे हैं) को अपने डेस्कटॉप पर नहीं चाहते हैं ।

लिनक्स पर, थ्रेड और प्रक्रियाएं बहुत समान हैं (क्योंकि दोनों को क्लोन (2) द्वारा बनाया जा सकता है ) और दोनों कर्नेल द्वारा निर्धारित कार्य हैं। वास्तव में कर्नेल शेड्यूलर शेड्यूलिंग कार्य है जो कुछ बहु-थ्रेडेड प्रक्रिया के अंदर थ्रेड हो सकते हैं, या सिंगल-थ्रेडेड प्रक्रिया का एक ही मुख्य थ्रेड (उस स्थिति में, आप "प्रोसेस" उस सिंगल थ्रेड को नाम देंगे) या कर्नेल थ्रेड्स। आप शायद अपने डेस्कटॉप सिस्टम पर कुल एक हजार से अधिक शेड्यूल किए गए कार्य नहीं करना चाहते हैं।

लिनक्स पर, एक प्रक्रिया बस एक ही वर्चुअल एड्रेस स्पेस साझा करने वाले थ्रेड्स का एक समूह है (और कुछ अन्य चीजों को साझा करना, जैसे कि फाइल डिस्क्रिप्टर टेबल, आदि ...)। कुछ प्रक्रियाओं में केवल एक धागा होता है।

एक वर्चुअल ऐड्रेस स्पेस है परिभाषित के रूप में विकिपीडिया से

"वर्चुअल पतों की श्रेणियों का समूह जो एक ऑपरेटिंग सिस्टम एक प्रक्रिया को उपलब्ध कराता है"

(लेकिन इस उत्तर को यह समझाते हुए भी देखें कि शब्दावली सार्वभौमिक नहीं है, और कुछ Microsoft प्रलेखन एक अलग और असंगत परिभाषा का उपयोग करते हैं )।

लिनक्स पर, कुछ प्रक्रियाओं के वर्चुअल एड्रेस स्पेस को समझने के लिए proc (5) उपयोगी है। दोनों की कोशिश करो
cat /proc/self/mapsऔर cat /proc/$$/mapsएक टर्मिनल में। यह भी देखें इस , और pmap (1) और ps (1) और शीर्ष (1)

सभी उपयोगकर्ता-अंतरिक्ष कार्यक्रम किसी न किसी प्रक्रिया में चल रहे हैं और आभासी मेमोरी का उपयोग कर रहे हैं, इसलिए प्रत्येक प्रक्रिया का अपना वर्चुअल पता स्थान है। शारीरिक रैम एक संसाधन लिनक्स कर्नेल द्वारा प्रबंधित है, और अनुप्रयोगों रैम के लिए सीधी पहुँच नहीं है (के अलावा mmap (2) आईएनजी /dev/mem, देख मेम (4) )।

तो एक प्रक्रिया सीधे रैम का उपयोग नहीं करती है। यह वर्चुअल मेमोरी का उपयोग करता है और इसका अपना वर्चुअल एड्रेस स्पेस होता है। कर्नेल का उपयोग करता है पेजिंग शारीरिक रैम प्रबंधन करने के लिए पृष्ठों और वर्चुअल ऐड्रेस स्पेस और प्रक्रिया प्रदान कपोल-कल्पना । किसी भी समय (यहां तक ​​कि जब आपकी प्रक्रिया बेकार है, या जब यह चल रहा है) कर्नेल कुछ पृष्ठों को बाहर कर सकता है (जैसे डिस्क पर उन्हें स्वैप करें)। कर्नेल MMU को कॉन्फ़िगर कर रहा है (और कुछ मिस हैंडलर में पेज मिस हार्डवेयर अपवादों को हैंडल कर रहा है , या तो डिस्क से पेज को लाकर या प्रक्रिया में एक विभाजन दोष का प्रचार करके , संकेत (7) देखें )

आपके पास सिस्टम थ्रेड्स के ऊपर हरे रंग के धागे हो सकते हैं (लेकिन हरे रंग की थ्रेड लाइब्रेरी को लागू करना और डीबग करना मुश्किल है)। में देखो goroutines में इस्तेमाल जाओ एक फैंसी उदाहरण के लिए। Setcontext (3) भी देखें ।

कभी-कभी, आपका सिस्टम थ्रेशिंग का प्रयोग कर सकता है । यह तब होता है जब कुल वर्चुअल मेमोरी (सभी प्रक्रियाओं द्वारा आवश्यक) एक बड़े कारक-उपलब्ध भौतिक रैम से अधिक हो जाती है। तब आपका कंप्यूटर अनुत्तरदायी हो जाता है। रेजिडेंट सेट साइज़ , डिमांड पेजिंग , वर्किंग सेट , मेमोरी ओवरकमिटमेंट , एएसएलआर के बारे में पढ़ें ।

Linux- -किसी भी देखें कांटा (2) , क्लोन (2) , mmap (2) , madvise (2) , posix_fadvise (2) , mlock (2) , execve (2) , साख (7) , pthreads (7) , futex (7) , क्षमताएं (7)

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