大内存映射的 mmap 失败(Centos 7,内核 3.10.0-862.el7.x86_64)
mmap fails for large memory mappings (Centos 7, Kernel 3.10.0-862.el7.x86_64)
我试图 运行 MySQL 服务器 运行ning CentOS 7 中的一台服务器。如果 innodb_buffer_pool_size 设置为 120GB 以上,分配失败。在内部,它试图映射大缓冲区。机器有 256 GB RAM。所以我写了下面的测试代码,我认为 MySQL 也在做。此代码在大约 130 GB
时也会失败
#define SIZE 1 * 1024 * 1024 * 1024
int main() {
unsigned long i, k = 0;
void **ptr = NULL;
char *mvptr = NULL;
ptr = malloc(sizeof(void *) * 220);
for(i = 0; i < 220;i++){
ptr[i] = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1,0);
printf("%d : %lx\n",i, ptr[i]);
if ((ptr[i] == (void *)-1))
{
printf("error :%d\n",errno);
return 0;
}
else
{
mvptr = ptr[i];
for(k = 0; k < SIZE; k++)
mvptr[k] = 'a';
}
}
sleep(20);
for(i = 0; i < 220;i++){
munmap(ptr[i], SIZE);
}
free(ptr);
}
结果是
124 : 7fc8b2ada000
125 : 7fc872ada000
126 : 7fc832ada000
127 : 7fc7f2ada000
128 : 7fc7b2ada000
129 : ffffffffffffffff
error :12
而 运行ning free -g 显示
宁运行之前
total used free shared buff/cache available
Mem: 251 2 248 0 0 248
Swap: 3 0 3
而运行宁
total used free shared buff/cache available
Mem: 251 130 120 0 0 120
Swap: 3 0 3
我是不是做错了什么。由于仍有大量可用内存,这可能是什么原因?
因为/proc/sys/vm/overcommit_ratio是50,修改overcommit_ratio可以分配更高
我试图 运行 MySQL 服务器 运行ning CentOS 7 中的一台服务器。如果 innodb_buffer_pool_size 设置为 120GB 以上,分配失败。在内部,它试图映射大缓冲区。机器有 256 GB RAM。所以我写了下面的测试代码,我认为 MySQL 也在做。此代码在大约 130 GB
时也会失败 #define SIZE 1 * 1024 * 1024 * 1024
int main() {
unsigned long i, k = 0;
void **ptr = NULL;
char *mvptr = NULL;
ptr = malloc(sizeof(void *) * 220);
for(i = 0; i < 220;i++){
ptr[i] = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1,0);
printf("%d : %lx\n",i, ptr[i]);
if ((ptr[i] == (void *)-1))
{
printf("error :%d\n",errno);
return 0;
}
else
{
mvptr = ptr[i];
for(k = 0; k < SIZE; k++)
mvptr[k] = 'a';
}
}
sleep(20);
for(i = 0; i < 220;i++){
munmap(ptr[i], SIZE);
}
free(ptr);
}
结果是
124 : 7fc8b2ada000
125 : 7fc872ada000
126 : 7fc832ada000
127 : 7fc7f2ada000
128 : 7fc7b2ada000
129 : ffffffffffffffff
error :12
而 运行ning free -g 显示
宁运行之前
total used free shared buff/cache available
Mem: 251 2 248 0 0 248
Swap: 3 0 3
而运行宁
total used free shared buff/cache available
Mem: 251 130 120 0 0 120
Swap: 3 0 3
我是不是做错了什么。由于仍有大量可用内存,这可能是什么原因?
因为/proc/sys/vm/overcommit_ratio是50,修改overcommit_ratio可以分配更高