You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FreeBSD13.2下启用OpenMP编译Imagick引发sched_yield()死锁?求解

FreeBSD 13.2下ImageMagick+OpenMP进程锁死问题解决指南

问题定位

升级至FreeBSD 13.2-RELEASE-p9后,启用OpenMP编译的ImageMagick 7.1.1-26(含PHP Imagick扩展)频繁出现进程锁死、CPU占用100%的情况,truss显示进程无限调用sched_yield()。该问题源于FreeBSD 13.2的ULE调度器与OpenMP的兼容性冲突,与PHP无关,直接使用convert命令重复加水印即可复现。

解决方案

1. 切换系统调度器(快速修复)

将调度器从ULE切换为BSD调度器可直接规避该问题:

  • 临时生效:
    sysctl kern.sched.name=BSD
    
  • 永久生效:
    在/etc/sysctl.conf中添加以下配置,执行sysctl -f /etc/sysctl.conf后重启系统:
    kern.sched.name=BSD
    

2. 调整ImageMagick编译参数

若需保留ULE调度器,可尝试以下编译优化:

  • 使用Clang编译器替代GCC编译ImageMagick(部分场景下Clang的OpenMP实现兼容性更好):
    CC=clang CXX=clang++ ./configure --enable-openmp [其他原有编译参数]
    make && make install
    
  • 编译时指定OpenMP线程绑定策略,避免调度器冲突:
    在编译前设置环境变量:
    export OMP_PROC_BIND=true
    
    再执行编译流程。

3. 等待官方修复

该问题已被FreeBSD官方纳入bug追踪,后续RELEASE补丁会包含修复,可通过freebsd-update fetch install定期更新系统。

验证方法

执行批量加水印任务验证修复效果:

for i in {1..100}; do convert input.jpg -draw "text 10,10 'watermark'" output_$i.jpg; done

观察是否再出现进程锁死、CPU占用异常的情况。


内容的提问来源于stack exchange,提问作者Adam Ellis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 10:59:50