遇到这个问题是在測试项目的性能时发现的,每一个对象分配一页大小的空间然后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的更多相关文章

  1. 解决Failed to allocate memory: 8转

    解决Failed to allocate memory: 8 昨天换了x64的Win7,发现在Eclipse上启动模拟器的时候存在问题,当设置的模拟器分辨率大于400×800的时候会出现 Failed ...

  2. Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示的原因及解决办法

    某天,Android 启动模拟器是出现“Failed to allocate memory: 8”错误,模拟器无法启动,如下图: 原因:设置了不正确AVD显示屏模式,4.0版默认的模式为WVGA800 ...

  3. Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8 (转)

    Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8http://www.crifan.com/android_emulator_ ...

  4. Failed to allocate memory: 8

    Failed to allocate memory: 8This application has requested the Runtime to terminate it in an unusual ...

  5. 【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8

    [问题] 折腾: [已解决]Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 8 过程中,增大对应AVD的内存为2G后,结果无法启 ...

  6. 关于阿里云ESC上go语言项目编译6l: running gcc failed: Cannot allocate memory

    (1)前段时间将自己的阿里云服务器上的系统由centos 6.5换为了ubuntu 14,其他的硬件配置都没有发生改变,将服务器上的数据恢复并且重新安装了golang的编译环境后,发现使用go bui ...

  7. fork failed.: Cannot allocate memory

    在做压力测试时候: [root@666 ok]# webbench -c 5000 -t30 http://10.100.0.61/ Webbench - Simple Web Benchmark 1 ...

  8. 【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory

    [已解决]Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory 结论是: 当前有个bug: 默认是通过 hw.ramSize=1024 ...

  9. 解决Zend OPcache huge_code_pages: mmap(HUGETLB) failed: Cannot allocate memory报错

    前几日看到鸟哥介绍的 <让你的PHP7更快之Hugepage>, 于是想试试手给服务器加上,参照格式安装好扩展,调整好配置文件,然后重启php-fpm,结果启动一直报Zend OPcach ...

随机推荐

  1. python 学习方法

    依据本人的学习经验,我总结了下面十点和大家分享: 1)学好python的第一步.就是立即到www.python.org站点上下载一个python版本号.我建议刚開始学习的人,不要下载具有IDE功能的集 ...

  2. 使用pycharm手动搭建python语言django开发环境(三) 使用django的apps应用 添加应用静态文件

    1)在django 工程目录中使用cmd命令行 敲入"python manage.py startapp app名称(例子为blog)" 2)在django工程目录中应该生成了bl ...

  3. UI-9-UITableView

    课程要点: UITableView及其两种风格和三部分 UITableViewController UITableViewCell及其四种风格 通过代理给UITableView设置cell 性能优化 ...

  4. OC-7-内存管理

    课程要点: 内存管理的必要性 MRC(手动管理) 自动释放池 ARC是怎么对内存进行管理的 内存管理的必要性 OC是一门面向对象的语言,在软件运行过程中会创造大量的对象,每创建一个对象系统就会给其分配 ...

  5. FreeMarker调用Java静态方法以及静态变量的方法

    这里介绍下在类似 Spring+FreeMarker 的架构中如何在FreeMarker中访问Java中的静态方法以及静态变量. 一.首先为了方便以及可复用我们创建一个工具类 /** * FreeMa ...

  6. android studio中如何替换gradle以防下载卡住

    我们在开发过程中需要导入别人的demo工程,那么你有事就会下载gradle构建文件,然而有时下载会一直卡住,那么这时候你就会想,我自己用迅雷去下载gradle文件然后不就行了,然后问题就来了 1.我们 ...

  7. java 定时器

    import java.io.IOException; import java.util.Timer; public class TimerTest { public static void main ...

  8. RL for Robots

    1.Robot gains Social Intelligence through Multimodal Deep Reinforcement Learning 这篇文章使用DQN去训练一个机器人,使 ...

  9. Python之图片格式转换

    import os import shutil from PIL import Image def getAllFiles(dirName, houzhui=' '): results = [] fo ...

  10. 第一百八十一节,jQuery-UI,知问前端--自动补全 UI--邮箱自动补全

    jQuery-UI,知问前端--自动补全 UI--邮箱自动补全 学习要点: 1.调用 autocomplete()方法 2.修改 autocomplete()样式 3.autocomplete()方法 ...