fork - In multi-core machine, Linux OS, when process scheduler will migrate one process to another cpu -


मेरे प्रोग्राम में, जिसका आरएसएस 65G है, जब कॉल फोर्क , sys_clone-> gt ; Dup_mm- & gt; कॉपी_पृष्ठ_आरेन्ज 2 सेकंड से अधिक का उपभोग करेगा इस मामले में, एक सीपीयू 100% sys जब निष्पादित कांटा, एक ही समय में, एक धागा काँक खत्म होने तक सीपीयू का समय नहीं मिल सकता है। मशीन में 16 सीपीयू हैं, अन्य सीपीयू बेकार है।

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

  • आरएसएस 65G है, जब कॉल फोर्क, sys_clone- & gt; dup_mm- & gt; copy_page_range 2 सेकंड से अधिक का उपभोग करेगा

    मौजूदा कोड की कांका (या क्लोन ) कर रही है, तो नई प्रक्रिया के रूप में प्रतिलिपि होना चाहिए। नया मिमी बनाता है और वास्तविक प्रतिलिपि बनाएं। copy_page_range पर कोई प्रत्यक्ष कॉल नहीं है, लेकिन मुझे लगता है कि इसे dup_mm में लिखे जा सकता है और इसे copy_page_range पर कॉल किया गया है। < dup_mmap में

      नया  mm  और पुराने  oldmm  दोनों में लॉक कई ताले हैं, 356 डाउन_लिटेक्ट (& amp; पुराने-> एमएमएपी_एसएएम);   

    mmap_sem रीडर / लेखक सिकंदरा लेने के बाद, सभी मेटैप्स पर अपने मेटाइआइमेन्शन की प्रतिलिपि बनाने के लिए एक लूप है:

      381 लूप के बाद (यह आपके मामले में लंबे समय तक है),  mmap_sem      कोड> अनलॉक किया गया है:  
      465 बाहर: 468 up_write (& oldmm- & gt; mmap_sem);   

    जबकि rwlock mmap_sep लेखक के नीचे है, कोई भी अन्य पाठक या लेखक पुराने एमएम में mmaps के साथ कुछ भी कर सकता है।

    एक धागा कांटा खत्म होने तक सीपीयू का समय नहीं मिल सकता है तो मेरा प्रश्न एक सीपीयू कांटा में व्यस्त था, क्यों अनुसूचक इस सीपीयू पर अन्य निष्क्रिय सीपीयू पर प्रतीक्षा कर रहा है?

    क्या आप निश्चित हैं, कि दूसरे धागे को चलने के लिए तैयार है और मम्मा के साथ कुछ भी नहीं करना चाहता है, जैसे:

    • कुछ नया या अनमाइमिंग कुछ नहीं
    • इसके ढेर को बढ़ाना या सिकुड़ना ( brk ),
    • इसके स्टैक को बढ़ाना,
    • पेजफॉल्टिंग
    • या कई अन्य गतिविधियों ...?

      असल में, प्रतीक्षा-सीपीयू धागा मेरा आईओ धागा है, जो ग्राहक से पैकेज भेजता / प्राप्त करता है, मेरे अवलोकन में, पैकेज हमेशा मौजूद है, लेकिन IO धागा इसे प्राप्त नहीं कर सकता।

      आपको अपनी प्रतीक्षा-सीपीयू थ्रेड (इसके लिए भी SysRq है) का ढेर और I / O का प्रकार चेक करना चाहिए फ़ाइल का mmap आईजी I / O का प्रकार है जो कि mmap_sem पर फोर्क द्वारा अवरुद्ध किया जाएगा।

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

      यदि आप केवल exec , यह उपयोगी हो सकता है:

      • या तो vfork + exec पर स्विच करें (या सिर्फ posix_spawn )। आपकी प्रक्रिया (लेकिन) जब तक कि नई प्रक्रिया exec या बाहर निकलना नहीं करती है, लेकिन नकल की जाने वाली 65 जीबी के मिमी के इंतजार के मुकाबले चलने में तेज़ हो सकता है।
      • या कई सक्रिय धागे और बहु-जीबी वर्चुअल मेमोरी के साथ मल्टीथ्रेडेड प्रक्रिया से कांटा नहीं कर रहा है। आप छोटे (बहु-एमबीएमपीड के बिना) सहायक प्रक्रिया बना सकते हैं, आईपीसी या सॉकेट या पाइप का उपयोग करके उससे संचार कर सकते हैं और इसे कांटा में पूछ सकते हैं और जो कुछ भी आप चाहते हैं वह कर सकते हैं।

  • Comments

    Popular posts from this blog

    Java - Error: no suitable method found for add(int, java.lang.String) -

    java - JPA TypedQuery: Parameter value element did not match expected type -

    c++ - static template member variable has internal linkage but is not defined -