Domanda

Nella nostra applicazione ci sono in esecuzione su un server dual Xeon con memoria configurata come 12GB locale per ogni processore e un bus di memoria che collega i due Xeon. Per motivi di prestazioni, vogliamo controllare dove destiniamo un grande blocco di memoria (> 6 Gb). codice qui sotto è semplificata -

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);

Il codice così com'è, funziona correttamente utilizzando VS2008 su Win 7/64.

Nella nostra applicazione questo blocco di memoria funziona come un negozio cache per oggetti statici (EA 1-2mb) che sono normalmente memorizzati sul disco rigido. Il mio problema è che quando il trasferimento dei dati nell'area cache utilizzando memcpy, ci vuole> 10 volte più a lungo se allocare la memoria utilizzando new char[xxxx]. E nessun altro modifiche al codice.

Siamo in perdita per capire perché questo sta accadendo. Eventuali suggerimenti su dove cercare?

È stato utile?

Soluzione

PAGE_NOCACHE è un omicidio su perf, si disabilita la cache della CPU. Era intenzionale?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top