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

   

 

你可能感兴趣的:(electric-fence mprotect() failed的问题解决方法)