mprotect() failed: Cannot allocate memory
遇到这个问题是在測试项目的性能时发现的,每一个对象分配一页大小的空间然后mprotect() 保护起来,当系统分配3W多个页的时候会出现这个问题。
google到在一份邮件列表中也曾提到该问题.https://sourceware.org/ml/libc-help/2010-04/msg00026.html
摘抄部分例如以下:
----------------------------------------------------------------------------------------------------------------------
On Wed, 2010-04-21 at 01:05 +0200, PaweÅ Sikora wrote:
> hi,
>
> i'm trying to debug an ugly application with ElectricFence.
> in fact, on x86-64 box with 8GB ram and 16GB swap i'm getting following error:
>
> "ElectricFence Exiting: mprotect() failed: Cannot allocate memory"
>
> the program has been compiled with gcc-4.5, glibc-2.11.1, kernel-2.6.32.
> did you ever come across such (kernel/glibc) limitations?
>
> here's a simple testcase which triggs -ENOMEM in mprotect().
You probably depleted the max map count, see:
/proc/sys/vm/max_map_count
We have a limit on the number of maps you can have, those mprotect()
calls split you maps like crazy, see also /proc/$pid/maps.
eg. change your second test program to include something like:
char buf[128];
snprintf(buf, sizeof(buf), "cat /proc/%d/maps", (int)getpid());
system(buf);
at the end after lowering your NN count to fit, and observe the result
of those mprotect() calls.
yes, that is the clue :)
the limit in /proc/sys/vm/max_map_count was set to 65530.
with `echo 128000 > /proc/sys/vm/max_map_count` the testcase passes.
----------------------------------------------------------------------------------------------------------------------
所以 解决方式是设置/proc/sys/vm/max_map_count为更大的值。
查看 max_map_count值:
more /proc/sys/vm/max_map_count
vm.max_map_count=128000直接写到/etc/sysctl.conf中,
然后运行
sysctl -p
或者直接运行
echo 128000 > /proc/sys/vm/max_map_count
OK 到这里问题就攻克了。总结一下原因:
proc文件系统给用户提供了非常多内核信息帮助,使得用户能够通过改动内核參数达到提高系统性能的目的.
-----------------------------------------------------------------------------------------------------------------------------------------------------
wangtao@wangtao-Z87X-UD5H:/proc/sys/vm$ ls
block_dump legacy_va_layout oom_dump_tasks
compact_memory lowmem_reserve_ratio oom_kill_allocating_task
dirty_background_bytes max_map_count overcommit_memory
dirty_background_ratio memory_failure_early_kill overcommit_ratio
dirty_bytes memory_failure_recovery page-cluster
dirty_expire_centisecs min_free_kbytes panic_on_oom
dirty_ratio min_slab_ratio percpu_pagelist_fraction
dirty_writeback_centisecs min_unmapped_ratio scan_unevictable_pages
drop_caches mmap_min_addr stat_interval
extfrag_threshold nr_hugepages swappiness
extra_free_kbytes nr_hugepages_mempolicy vfs_cache_pressure
hugepages_treat_as_movable nr_overcommit_hugepages would_have_oomkilled
hugetlb_shm_group nr_pdflush_threads zone_reclaim_mode
laptop_mode numa_zonelist_order
---------------------------------------------------------------------------------
/proc/sys/vm 下每一个文件的信息详见http://www.linuxinsight.com/proc_sys_vm_hierarchy.html
max_map_count : This file contains the maximum number of memory map areas a process may have. Memory map areas are used as a side-effect of calling
malloc, directly by mmap and mprotect, and also when loading shared libraries. While most applications need less than a thousand maps, certain programs, particularly malloc debuggers, may consume lots of them, e.g., up to one or two maps per allocation. The
default value is 65536.
mprotect() failed: Cannot allocate memory的更多相关文章
- 解决Failed to allocate memory: 8转
解决Failed to allocate memory: 8 昨天换了x64的Win7,发现在Eclipse上启动模拟器的时候存在问题,当设置的模拟器分辨率大于400×800的时候会出现 Failed ...
- Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示的原因及解决办法
某天,Android 启动模拟器是出现“Failed to allocate memory: 8”错误,模拟器无法启动,如下图: 原因:设置了不正确AVD显示屏模式,4.0版默认的模式为WVGA800 ...
- Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8 (转)
Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8http://www.crifan.com/android_emulator_ ...
- Failed to allocate memory: 8
Failed to allocate memory: 8This application has requested the Runtime to terminate it in an unusual ...
- 【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8
[问题] 折腾: [已解决]Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8 过程中,增大对应AVD的内存为2G后,结果无法启 ...
- 关于阿里云ESC上go语言项目编译6l: running gcc failed: Cannot allocate memory
(1)前段时间将自己的阿里云服务器上的系统由centos 6.5换为了ubuntu 14,其他的硬件配置都没有发生改变,将服务器上的数据恢复并且重新安装了golang的编译环境后,发现使用go bui ...
- fork failed.: Cannot allocate memory
在做压力测试时候: [root@666 ok]# webbench -c 5000 -t30 http://10.100.0.61/ Webbench - Simple Web Benchmark 1 ...
- 【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory
[已解决]Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 结论是: 当前有个bug: 默认是通过 hw.ramSize=1024 ...
- 解决Zend OPcache huge_code_pages: mmap(HUGETLB) failed: Cannot allocate memory报错
前几日看到鸟哥介绍的 <让你的PHP7更快之Hugepage>, 于是想试试手给服务器加上,参照格式安装好扩展,调整好配置文件,然后重启php-fpm,结果启动一直报Zend OPcach ...
随机推荐
- spring揭秘读书笔记----ioc的基本概念
在看ico概念之前,先想一下我们平常需要依赖某个类时会怎么做? 无非是在要用到的地方写如下代码: Person person = new Person(); //然后就可以用person对象来获取Pe ...
- 20180113Go匿名函数和闭包
最近codereview看到闭包,得学习下 https://studygolang.com/articles/5057 匿名函数:没有函数名的函数 闭包:外部函数定义的内部函数. 闭包给访问外部函数定 ...
- 转 spring官方文档中文版
转 http://blog.csdn.net/tangtong1/article/details/51326887另附码云地址 https://gitee.com/free/spring-framew ...
- Atitit.手机验证码的破解---伪随机数
Atitit.手机验证码的破解---伪随机数 1. 手机验证码几乎都是伪随机数1 2. 伪随机数1 2.1. 生成方法编辑1 2.2. 随机数的计算方法在不同的计算机中是不同的,即使在相同的计算机中安 ...
- Angularjs学习笔记2_添加删除DOM元素
1.调用element方法 angular.element(html) 把字符串或dom对象转化成一JQuery对象, angular.element(document.getElementB ...
- UVA 11014 - Make a Crystal(容斥原理)
UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, ...
- C#中基本类型占用字节数
bool -> System.Boolean (布尔型,其值为 true 或者 false) byte -> System.Byte (字节型,占 1 字节,表示 8 位正整数,范围 0 ...
- GoWeb编程之HelloWorld
使用Go实现我们的第一个Web服务器程序 package main import "net/http" import "fmt" //打印HelloWorld ...
- C# - Passing Reference-Type Parameters
A variable of a reference type does not contain its data directly; it contains a reference to its da ...
- ImageData
http://www.html5china.com/HTML5features/canvas/20120501_3591.html 1.上下文对象 Context 有三个方法用来创建.读取和设置 Im ...