2010-09-21 10 views
7

पर वर्चुअलएलोकएक्सनुमा के साथ मेमोरी एक्सेस टाइम धीमा है हमारे आवेदन में हम दो प्रोऑन सर्वर पर 12 जीबी स्थानीय के रूप में कॉन्फ़िगर किए गए मेमोरी के साथ दोहरी ज़ीऑन सर्वर पर चल रहे हैं और दो ज़ीऑन को जोड़ने वाली मेमोरी बस पर चल रहे हैं। प्रदर्शन कारणों से, हम नियंत्रित करना चाहते हैं कि हम स्मृति के बड़े (> 6 जीबी) ब्लॉक को आवंटित करते हैं। नीचे सरलीकृत कोड है -विंडोज 7/64

DWORD processorNumber = GetCurrentProcessorNumber(); 
UCHAR nodeNumber = 255; 
GetNumaProcessorNode((UCHAR)processorNumber, &nodeNumber); 
// get amount of physical memory available of node. 
ULONGLONG availableMemory = MAXLONGLONG; 
GetNumaAvailableMemoryNode(nodeNumber, &availableMemory) 
// make sure that we don't request too much. Initial limit will be 75% of available memory 
_allocateAmt = qMin(requestedMemory, availableMemory * 3/4); 
// allocate the cached memory region now. 
HANDLE handle = (HANDLE)GetCurrentProcess(); 
cacheObject = (char*) VirtualAllocExNuma (handle, 0, _allocateAmt, 
      MEM_COMMIT | MEM_RESERVE , 
      PAGE_READWRITE| PAGE_NOCACHE , nodeNumber); 

जैसा कोड है, Win 7/64 पर VS2008 का उपयोग करके सही तरीके से काम करता है।

हमारे आवेदन में स्मृति की यह ब्लॉक स्थिर वस्तुओं (1-2 एमबी ईए) के लिए कैश स्टोर के रूप में कार्य करती है जो आमतौर पर हार्ड ड्राइव पर संग्रहीत होती हैं। मेरी समस्या यह है कि जब हम memcpy का उपयोग कर कैश क्षेत्र में डेटा स्थानांतरित करते हैं, तो यह new char[xxxx] का उपयोग करके स्मृति आवंटित करने से 10 गुना अधिक समय लेता है। और कोई अन्य कोड नहीं बदलता है।

हमें यह समझने में कमी है कि यह क्यों हो रहा है। कहां देखना है इसके बारे में कोई सुझाव?

उत्तर

7

PAGE_NOCACHE परफ पर हत्या है, यह सीपीयू कैश को अक्षम करता है। क्या वह जानबूझकर था?

+1

नहीं। यह मेरा इरादा नहीं है। मैंने सोचा था कि स्मृति ब्लॉक की अक्षम डिस्क कैशिंग, सीपीयू नहीं। इससे मेरे अधिकांश प्रदर्शन मुद्दों को हल किया गया। धन्यवाद। –