【环境信息】
系统:arm,x86虚拟机
内存:4g
cpu:4核
OS版本:
openeulerversion=openEuler-22.03-LTS
compiletime=2022-02-25-07-53-11
gccversion=10.3.1-20220223.7.oe1
kernelversion=5.10.0-59.0.0.32.oe1
openjdkversion=1.8.0.312.b07-11.oe1
【问题复现步骤】
1、安装jemalloc和php相关的包
dnf install jemalloc* php php-fpm lsof -y
2、通过LD_PRELOAD加载jemalloc动态库
export LD_PRELOAD=/usr/lib64/libjemalloc.so
3、创建/run/php-fpm/目录为地址"/run/php fpm/www.sock"绑定socket
mkdir -p /run/php-fpm/
4、启动php-fpm 预期结果1
/usr/sbin/php-fpm
5、查看php-fpm是否启动成功 预期结果2
ps -ef | grep -E 'php-fpm|apache'
6、查看jemalloc是否生效 预期结果3
lsof -n | grep jemalloc | grep php-fpm
【预期结果】
1、启动php-fpm成功,没有报错返回
2、有php-fpm进程生成
3、jemalloc生效
【实际结果】
1、启动php-fpm报错,返回:free(): invalid pointer 已放弃(核心已转储)
2、因为启动php-fpm报错,没有php-fpm进程生成
3、因为启动php-fpm报错,jemalloc没有生效
【备注】
附件中有messages日志
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
问题情况说明:
1.导致问题的直接原因:设置LD_PRELOAD=/usr/lib64/libjemalloc.so 程序前期的内存管理使用了这个库里的函数,而coredump的时候free()函数调用的却是libc.so库中的函数。free()在做对齐比较的时候,失败导致的
2.也就是说libjemalloc.so的优先没有一直生效,中途又被libc.so替换了回来。使用动态库调试工具,观看调试日志:程序在加载库libbz2.so的时候执行的这个替换。
3.执行替换的原因是dlopen库加载函数传入了flag RTLD_DEEPBIND,这个符号的作用是深度绑定,会使前期设置的LD_PRELOAD失效,继续使用libc.so
4.库加载传入RTLD_DEEPBIND的原因是系统设置了配置项:CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS
处理方案:在配置了CONFIG_CC_HAS_WORKING_NOSANITIZE_ADDRESS的系统中运行php不建议jemalloc.so库
登录 后才可以发表评论