在Ubuntu Amazon EC2上,Wine不能使用超过32GB的RAM

时间:2015-12-29 18:13:48

标签: memory-management amazon-ec2 ubuntu-14.04 wine

我遇到的问题是,在拥有128 GB RAM的Ubuntu amazon EC2云上运行使用Wine的超过32GB内存运行RAM密集型Windows应用程序。当我在linux中运行c ++代码here时,它可以工作。

如果我运行执行相同操作的.exe,我最多只能分配32GB。我尝试过Wine 1.6,1.7和1.9。我也在使用64位版本。有什么想法吗?

#include <stdlib.h>
#include <iostream>

int main()
{
   size_t gb_in_bytes = size_t(1)<<size_t(30); // 1 GB in bytes (2^30).
   // try to allocate 1 block of 'i' GB.
   for (size_t i = 25; i < 35; ++ i) {
      size_t n = i * gb_in_bytes;
      void *p = ::malloc(n);
      std::cout << "allocation of 1 x " << (n/double(gb_in_bytes)) << " GB of data. Ok? " << ((p==0)? "nope" : "yes") << std::endl;
      ::free(p);
   }
}

修改

我尝试使用Mongo网站上的建议播放NUMA的设置。

numactl --interleave=all wine test.exe

但这没有用。这是我在服务器上的NUMA设置转储:

$ numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 20 21 22 23 24 25 26 27 28 29
node 0 size: 80555 MB
node 0 free: 75980 MB
node 1 cpus: 10 11 12 13 14 15 16 17 18 19 30 31 32 33 34 35 36 37 38 39
node 1 size: 80631 MB
node 1 free: 79686 MB
node distances:
node   0   1
  0:  10  20
  1:  20  10

看起来每个节点的内存超过32GB ......

1 个答案:

答案 0 :(得分:0)

感谢Alexandre Julliard提示,我能够将dlls / ntdll / virtual.c中的VIRTUAL_HEAP_SIZE常量修改为2倍。

亚历山大说:

  

虚拟堆空间不足。存储32Gb的页面保护标志需要8Mb,这是堆限制。您可以在dlls / ntdll / virtual.c中增加VIRTUAL_HEAP_SIZE来解决它,但我们可能需要一种不同的机制来处理这种情况。

我在dlls / ntdll / virtual.c中的第144行进行了更改:

#define VIRTUAL_HEAP_SIZE (sizeof(void*)*1024*1024)

到此:

#define VIRTUAL_HEAP_SIZE (sizeof(void*)*1024*1024*2)

在我的葡萄酒源(版本1.9.0)中本地并重新编译。这解决了我的问题。