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

  1. more /proc/sys/vm/max_map_count

vm.max_map_count=128000直接写到/etc/sysctl.conf中,

然后运行

  1. sysctl -p

或者直接运行

  1. 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.计算积分 (1)计算定积分 from scipy import integrate #定义函数def half_circle(x): return (1-x**2)**0.5 pi_half, e ...

  2. CoffeeScript 学习笔记

    1.什么叫 CoffeeScript CoffeeScript 是一种新的编程语言,构建于 JavaScript 之上.CoffeeScript 提供了一种简洁的语法,对 Python 或 Ruby ...

  3. ISA2006安装和部署基础(虚拟机非域环境)

    0x00. 为了測试基于HTTP隧道的绕过ISA,必须搭建模拟环境,为了不麻烦,我们这里不配合域环境认证.本次实验利用Vmware 10.0搭建好开发环境,实现ISA2006安装和部署,同一时候设定基 ...

  4. 通过虚拟驱动vivi分析摄像头驱动

    Linux摄像头驱动学习之:(二)通过虚拟驱动vivi分析摄像头驱动 一.通过指令 "strace -o xawtv.log xawtv" 得到以下调用信息: // 1~7都是在v ...

  5. 459. Repeated Substring Pattern【easy】

    459. Repeated Substring Pattern[easy] Given a non-empty string check if it can be constructed by tak ...

  6. vm中安装ubuntu16

    安装完成后,开机出现 smbus host controller not enabled 上网照着网友的建议: 在grub界面选择高级选项 root shell 进入到shell之后 mount -o ...

  7. fstream之seekp/seekg/ios::ate/ios::app

    在程序开发中,IO处理无处不在,经常会在代码中遇到特殊的IO处理需求 1.描述 需求:如果文件不存在则创建,存在则打开,然后先读取文件的末行,然后在文件末尾写入. 代码: #include <i ...

  8. 解决android studio引用远程仓库下载慢(转)

    解决android studio引用远程仓库下载慢(JCenter下载慢) 第一种方法 使用开源中国的maven库 阿里云的(速度飞快):http://maven.aliyun.com/nexus/c ...

  9. crm操作电子邮件

    using System;     using Microsoft.Xrm.Sdk;     using Microsoft.Crm.Sdk.Messages;     using Microsoft ...

  10. SlidingMenu官方实例分析3——PropertiesActivity

    PropertiesActivity此类主要是对SlidingMenu设置的一些展示,也是为了使用者能快速的掌握SlidingMenu 的特点. 首先获得SlidingMenu对象: SlidingM ...