使用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缓存。那是故意的吗?

+1

不,那不是我想要的。我曾经想过禁用内存块的磁盘缓存,而不是CPU。这确实解决了我的大部分性能问题。谢谢。 – 2010-09-21 18:50:39