【发布时间】:2015-12-29 18:13:48
【问题描述】:
我在使用 Wine 在具有 128 GB RAM 的 Ubuntu amazon EC2 云上分配超过 32 GB 的内存来运行 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 的内存......
【问题讨论】:
-
你能给出一个简短的示例代码吗?
-
使用链接中的代码更新了帖子。
-
我在 WINE 方面做得很少,但这对我来说听起来像是一个NUMA 问题。 NUMA 系统在处理器之间分配了内存库,默认情况下,操作系统可能只为一个进程分配与请求进程正在运行的处理器连接的内存......因此 16 核 128GB 机器可能有4 个物理 CPU 上各有 4 个内核,因此有 32GB 的限制……但应该是可配置的。
-
@Michael-sqlbot:我查看了设置并使用了 numactl 命令,但它仍然不起作用。可以看看上面的Edit吗?
-
是的,看来我的猜测是错误的。对此表示歉意。我想至少,现在,你知道一件事,它不是。 :/ 不确定
strace是否可用,看看wine 是否要求更多内存,系统是否在拒绝它,或者wine 是否因为内部原因而懒得问,但这是我唯一的另一个想法有。
标签: memory-management amazon-ec2 ubuntu-14.04 wine