Wine 在 Ubuntu Amazon EC2 上不能使用超过 32GB 的内存
Wine can't use more than 32GB of RAM on Ubuntu Amazon EC2
我在 Ubuntu 具有 128 GB RAM 的 Ubuntu Amazon EC2 云上使用 Wine 分配超过 32GB 的内存 运行ning 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 的内存....
感谢 Alexandre Julliard 的提示,我能够将 dlls/ntdll/virtual.c 中的 VIRTUAL_HEAP_SIZE 常量修改为 2 倍大。
亚历山大说:
The virtual heap is running out of space. Storing the page protection flags for 32Gb requires 8Mb, which is the heap limit. You can increase VIRTUAL_HEAP_SIZE in dlls/ntdll/virtual.c to work around it, but we probably want a different mechanism for such cases.
我在 dlls/ntdll/virtual.c:
中的第 144 行进行了更改
#define VIRTUAL_HEAP_SIZE (sizeof(void*)*1024*1024)
对此:
#define VIRTUAL_HEAP_SIZE (sizeof(void*)*1024*1024*2)
在我的 wine 源(版本 1.9.0)中本地并重新编译。这解决了我的问题。
我在 Ubuntu 具有 128 GB RAM 的 Ubuntu Amazon EC2 云上使用 Wine 分配超过 32GB 的内存 运行ning 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 的内存....
感谢 Alexandre Julliard 的提示,我能够将 dlls/ntdll/virtual.c 中的 VIRTUAL_HEAP_SIZE 常量修改为 2 倍大。
亚历山大说:
The virtual heap is running out of space. Storing the page protection flags for 32Gb requires 8Mb, which is the heap limit. You can increase VIRTUAL_HEAP_SIZE in dlls/ntdll/virtual.c to work around it, but we probably want a different mechanism for such cases.
我在 dlls/ntdll/virtual.c:
中的第 144 行进行了更改#define VIRTUAL_HEAP_SIZE (sizeof(void*)*1024*1024)
对此:
#define VIRTUAL_HEAP_SIZE (sizeof(void*)*1024*1024*2)
在我的 wine 源(版本 1.9.0)中本地并重新编译。这解决了我的问题。