electric-fence mprotect() failed的问题解决方法

    最近定位一个多线程内存malloc崩溃时的问题,这个问题内部测试的时候测不出来,业务刚上线压力规模较小时也没问题,后来随着业务量的增大,平均每2周会出现一次,生成的coredump文件每次都是挂在malloc函数,报错提示 malloc(): memory corruption (fast)。

    根据相关迹象,最大的怀疑点是使用野指针或内存写越界,导致malloc堆头的内部管理数据被破坏,从而发生的错误。

    根据以前的经验,第一反映是使用valgrind工具进行检测,valgrind工具功能全面,定位这种问题非常方便,遗憾的是,使用valgrind运行后,连续一个月都不出问题,并且没有给出任何内存的invalid read或invalid write信息。怀疑是valgrind会使程序运行性能下降,导致多线程内存问题的时序很难出现。

    继续使用大名鼎鼎的electric-fence进行检测,在运行一段时间后,electric-fence报错:mprotect() failed,查看electric-fence源码,发现是调用mprotect失败,跟踪errno,提示 ENOMEM Internal kernel structures could not be allocated。原来是内核默认设置的map个数为65535,我们的业务需要申请的map超过了系统限制,修改系统默认的最大map个数即可,修改方法如下:

    1)设置map最大个数: echo 128000 > /proc/sys/vm/max_map_count

    2)查看当前进程mmap的使用情况:cat /proc/$pid/maps

   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值