使用Windows 7/64上的VirtualAllocExNuma缓存内存访问时间
问题描述:
在我们的应用程序中,我们运行双Xeon服务器,内存配置为每个处理器本地12GB,并且内存总线连接两个Xeon。出于性能方面的原因,我们想要控制分配一个大块(> 6GB)的内存块的位置。以下是简化代码 -使用Windows 7/64上的VirtualAllocExNuma缓存内存访问时间
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-2mba)的缓存存储,通常存储在硬盘上。我的问题是,当我们使用memcpy将数据传输到缓存区时,它比使用new char[xxxx]
分配内存的时间长10倍以上。并没有其他代码改变。
我们不知道为什么会发生这种情况。任何关于去哪里看的建议?
答
PAGE_NOCACHE在perf上是谋杀,它会禁用CPU缓存。那是故意的吗?
不,那不是我想要的。我曾经想过禁用内存块的磁盘缓存,而不是CPU。这确实解决了我的大部分性能问题。谢谢。 – 2010-09-21 18:50:39