2010-06-22 10 views
12

16 जीबी रैम के साथ विंडोज सर्वर 2008 x64 पर एक .NET अनुप्रयोग चला रहा है। इस एप्लिकेशन को बहुत बड़ी मात्रा में डेटा (लगभग 64 जीबी) लाने और विश्लेषण करने की आवश्यकता है, और इसे एक ही समय में स्मृति में रखें।.NET कचरा कलेक्टर और x64 वर्चुअल मेमोरी

मुझे क्या देखने की उम्मीद है: प्रक्रिया का आकार पिछले 16 जीबी से 64 जीबी तक फैलता है। विंडोज़ आवश्यकतानुसार डिस्क से अतिरिक्त डेटा को पृष्ठ पर वर्चुअल मेमोरी का उपयोग करता है। यह क्लासिक वर्चुअल मेमोरी उपयोग केस है।

जो मैं वास्तव में देखता हूं: प्रक्रिया का आकार भौतिक स्मृति (16 जीबी) की मात्रा तक ही सीमित है। आवेदन कचरा कलेक्टर में अपने समय का 99.8% खर्च करता है।

हमारा एप्लिकेशन वर्चुअल मेमोरी का उपयोग करने में विफल क्यों है? क्या यह .NET कचरा कलेक्टर की कॉन्फ़िगरेशन में या Windows x64 वर्चुअल मेमोरी मैनेजर में एक समस्या है? भौतिक स्मृति तक सीमित होने के बजाय वर्चुअल मेमोरी का उपयोग करने के लिए हमारे आवेदन को प्राप्त करने के लिए मैं क्या कर सकता हूं?

धन्यवाद।

- ब्रायन

अद्यतन:

using System; 

namespace GCTest 
{ 
    class Program 
    { 
     static void Main() 
     { 
      byte[][] arrays = new byte[100000000][]; 
      for (int i = 0; i < arrays.Length; ++i) 
      { 
       arrays[i] = new byte[320]; 
       if (i % 100000 == 0) 
       { 
        Console.WriteLine("{0} arrays allocated", i); 
        System.Threading.Thread.Sleep(100); 
       } 
      } 
     } 
    } 
} 

यदि आप इसे करने की कोशिश करना चाहते हैं, 64 के लिए निर्माण करने के लिए सुनिश्चित करें: मैं एक बहुत छोटे से प्रोग्राम है जो एक ही व्यवहार दिखाता लिखा है। आपको अपने सिस्टम को तनाव देने के लिए स्थिरांक को थोड़ा सा संशोधित करना पड़ सकता है। मैं जो व्यवहार देखता हूं वह यह है कि प्रक्रिया 16 जीबी के आकार तक पहुंच जाती है। कोई त्रुटि संदेश या अपवाद फेंक दिया गया है। प्रदर्शन मॉनिटर रिपोर्ट करता है कि जीसी में सीपीयू समय का% 100% तक पहुंचता है।

क्या यह अस्वीकार्य नहीं है? वर्चुअल मेमोरी सिस्टम कहां है?

+0

प्रक्रिया का आकार निर्धारित करने के लिए आप क्या उपयोग कर रहे हैं? (आइए बस पहले आसान विकल्पों को खत्म करें :)) – Paolo

+0

विंडोज टास्क मैनेजर से "कमिट आकार"। प्रदर्शन मॉनिटर में "# कुल प्रतिबद्ध बाइट्स" का भी उपयोग करना। मुझे पूरा यकीन है कि मैं अपने भौतिक कामकाजी सेट की बजाय प्रक्रिया के वर्चुअल मेमोरी आकार को माप रहा हूं। – brianberns

+0

क्या मैं स्पष्ट पूछ सकता हूं? क्या आपको _really_ को यह सब एक बार में स्मृति में लोड करने की आवश्यकता है? क्या यह एक और दृष्टिकोण लेना संभव है और अपने आप पर कुछ प्रकार के मैन्युअल पेजिंग करना संभव है? – CodingGorilla

उत्तर

2

ऐसा लगता है कि आप बड़े डेटा का संदर्भ नहीं रख रहे हैं। कचरा कलेक्टर संदर्भित वस्तुओं को एकत्र नहीं करेगा।

+0

मुझे नहीं लगता कि यह प्रासंगिक है। डेटा में से कोई भी वास्तव में कचरा नहीं है - यह सब संदर्भित है। इस प्रकार, मैं जीसी को किसी भी स्मृति को इकट्ठा करने की उम्मीद नहीं कर रहा हूं। ऐसा प्रतीत होता है कि जीसी 100% CPU का उपभोग कर रहा है क्योंकि प्रक्रिया भौतिक स्मृति से बाहर हो गई है और .NET कुछ मुक्त करने का प्रयास कर रहा है।हालांकि, मुक्त होने के लिए कुछ भी नहीं है - आदर्श रूप से, प्रक्रिया को जीसी में अपना पूरा समय मुफ्त (गैर-मौजूद) अप्रयुक्त वस्तुओं की कोशिश करने के बजाय वर्चुअल मेमोरी का उपयोग करके विस्तार करना चाहिए। – brianberns

+0

यदि आप 64 जीबी के डेटा आवंटित कर रहे हैं, लेकिन केवल 16 जीबी वास्तव में आवंटित किया जाता है, तो बाकी के संदर्भ में संदर्भित नहीं किया जा रहा है और जीसी'एड किया गया है। जब तक मैं आपका प्रश्न समझ नहीं पा रहा हूं। –

+0

आप सवाल समझ नहीं रहे हैं। मैं 64 जीबी डेटा आवंटित करने की कोशिश कर रहा हूं, लेकिन 16 जीबी डेटा आवंटित करने के बाद प्रक्रिया कम हो गई है। मुझे शेष डेटा आवंटित करने का मौका कभी नहीं मिला। – brianberns

10

क्या आपने यह सुनिश्चित करने के लिए जांच की है कि आपकी पेजिंग फ़ाइल कॉन्फ़िगर की गई है ताकि वह उस आकार में विस्तार कर सके?

अद्यतन

मैं चारों ओर इस के साथ अपने दिए गए उदाहरण के साथ काफ़ी खेल रहा है, और यहाँ मैं क्या देखते हैं।

सिस्टम: विंडोज 7 64 बिट, 6 जीबी ट्रिपल-चैनल रैम, 8 कोर।

  1. आपको अपने ओएस से किसी अन्य स्पिंडल पर एक अतिरिक्त पेजिंग फ़ाइल की आवश्यकता है या इस तरह की जांच आपकी मशीन को नली करेगी। अगर सब कुछ एक ही पेजिंग फ़ाइल पर लड़ रहा है, तो इससे चीजें बदतर हो जाती हैं।

  2. मुझे जीसी में पीढ़ी से पीढ़ी तक बड़ी संख्या में डेटा को बढ़ावा दिया जा रहा है, साथ ही बड़ी संख्या में जीसी स्वीप \ संग्रह, और बड़ी संख्या में पृष्ठ दोषों के परिणामस्वरूप शारीरिक स्मृति सीमाएं पहुंच गई हैं। मैं केवल यह मान सकता हूं कि जब भौतिक स्मृति \ बहुत अधिक समाप्त हो जाती है, तो यह ट्रिगर्स पीढ़ी के झाड़ू और प्रचार को ट्रिगर करता है जिससे बड़ी मात्रा में पेज्ड-आउट मेमोरी को छुआ जा सकता है जिससे मृत्यु की सर्पिल हो जाती है क्योंकि स्पर्श स्मृति को पग किया जाता है और अन्य मेमोरी मजबूर किया गया है। पूरी चीज एक सूजी गड़बड़ी में समाप्त होता है। ऐसा लगता है कि बड़ी वस्तुएं लंबे समय तक रहने वाली वस्तुओं को आवंटित करती हैं जो छोटे ऑब्जेक्ट हीप में समाप्त होती हैं।

अब एक फैशन में वस्तुओं का आवंटन उन्हें बड़े वस्तु ढेर में सीधे आवंटित करेगा (जो एक ही व्यापक और बढ़ावा देने के मुद्दों कष्ट नहीं होता है) को यह तुलना:

private static void Main() 
{ 
    const int MaxNodeCount = 100000000; 
    const int LargeObjectSize = (85 * 1000); 

    LinkedList<byte[]> list = new LinkedList<byte[]>(); 

    for (long i = 0; i < MaxNodeCount; ++i) 
    { 
     list.AddLast(new byte[LargeObjectSize]); 

     if (i % 100000 == 0) 
     { 
      Console.WriteLine("{0:N0} 'approx' extra bytes allocated.", 
       ((i + 1) * LargeObjectSize)); 
     } 
    } 
} 

यह उम्मीद यानी रूप में काम करता वर्चुअल मेमोरी का उपयोग किया जाता है और फिर अंततः समाप्त हो जाता है - मेरे पर्यावरण \ 54 में 54 जीबी।

तो ऐसा प्रतीत होता है कि दीर्घकालिक छोटी वस्तुओं के द्रव्यमान को आवंटित करने से अंततः जीसी में एक दुष्चक्र का कारण बन जाएगा क्योंकि पीढ़ी के सफाई और प्रचार तब किए जाते हैं जब भौतिक स्मृति समाप्त हो जाती है - यह एक पृष्ठ-फ़ाइल मौत सर्पिल है।

अद्यतन 2

मुद्दा मैं विकल्पों में से एक नंबर \ विन्यास जो कोई सराहनीय फर्क पड़ा साथ खेला जांच कर रही जबकि:

  • सर्वर जीसी मोड मजबूर।
  • कम विलंबता जीसी को कॉन्फ़िगर करना।
  • जीसी को अमूर्त करने की कोशिश करने के लिए जीसी को मजबूर करने के विभिन्न संयोजन।
  • न्यूनतम \ अधिकतम प्रक्रिया कार्य सेट।
+0

नहीं, लेकिन विंडोज वर्चुअल मेमोरी मैनेजर स्वचालित रूप से पेजिंग शुरू नहीं कर सकता है, कम से कम 16 जीबी की कुछ डिग्री के लिए? वर्चुअल मेमोरी होने का क्या मतलब है यदि यह भौतिक स्मृति की मात्रा से सीमित है? – brianberns

+0

यह विन्यास योग्य है - जांच करने लायक है। समस्याएं एक अप्रत्याशित नीति से हो सकती हैं, कुछ उज्ज्वल स्पार्क मोड़ने वाले पेजिंग बंद हो सकती हैं। –

+0

ठीक है, मैंने पेजफाइल को 30 जीबी तक बढ़ा दिया, लेकिन इसका कोई प्रभाव नहीं पड़ा। मुझे लगता है कि .NET कचरा कलेक्टर मुझे 16 जीबी से अधिक वस्तुओं की आवंटित करने से रोक रहा है, इसलिए विंडोज वर्चुअल मेमोरी सिस्टम को कभी भी पेजिंग शुरू करने का मौका नहीं मिला है। – brianberns

संबंधित मुद्दे