在我们的应用程序中,我们在双 Xeon 服务器上运行,每个处理器的内存配置为 12gb 本地,并且连接两个 Xeon 的内存总线。出于性能原因,我们希望控制分配大(>6gb)内存块的位置。以下是简化代码 -
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-2mb ea)的缓存存储。我的问题是,当我们使用 memcpy 将数据传输到缓存区域时,它所花费的时间是使用new char[xxxx]
. 并且没有其他代码更改。
我们不知道为什么会发生这种情况。关于在哪里看的任何建议?