CentOS 7.9(内核5.16.11)出现soft lockup告警,是否可忽略及应对?
问题背景
运行环境
VMBox虚拟机中的CentOS 7.9(内核版本5.16.11),分配1G内存与8个CPU核心。
[root@dev236 ~]# uname -a Linux dev236 5.16.11-1.el7.elrepo.x86_64 #1 SMP PREEMPT Tue Feb 22 10:22:37 EST 2022 x86_64 x86_64 x86_64 GNU/Linux
问题现象
运行计算密集型程序,启动8个线程持续占用CPU,一段时间后操作系统发出告警:
[root@dev236 src]# ./server --p:command-threads-count=8 [31274.179023] rcu: INFO: rcu_preempt self-detected stall on CPU [31274.179039] watchdog: BUG: soft lockup - CPU#3 stuck for 210S! [server:1356] [31274.179042] watchdog: BUG: soft lockup - CPU#1 stuck for 210S! [server:1350] [31274.179070] watchdog: BUG: soft lockup - CPU#7 stuck for 210S! [server:1355] [31274.179214] rcu: 0-...!: (1 GPs behind) idle=52f/1/0x4000000000000000 softirq=10073864/10073865 fqs=0 Message from syslogd@dev236 at Jan 25 18:59:49 ... kernel:watchdog: BUG: soft lockup - CPU#3 stuck for 210S! [server:1356] Message from syslogd@dev236 at Jan 25 18:59:49 ... kernel:watchdog: BUG: soft lockup - CPU#1 stuck for 210S! [server:1350] Message from syslogd@dev236 at Jan 25 18:59:49 ... kernel:watchdog: BUG: soft lockup - CPU#7 stuck for 210S! [server:1355] ^C [root@dev236 src]#
程序日志仍在持续追加,说明程序仍在运行,疑问:是否可以忽略该告警?或者需要采取什么措施(比如降低计算强度、让CPU间歇运行、减少线程数)?
解答
不能直接忽略告警
软锁告警(soft lockup)是内核watchdog检测到CPU核心超过指定时长(这里达210秒)未响应调度,无法执行内核任务(如RCU清理、中断处理)。虽然当前程序还在运行,但长期下去会引发内核功能异常:比如内存回收延迟、系统响应变慢,甚至触发严重内核错误。同时RCU stall告警也说明内核RCU机制无法正常完成回调,会影响整个系统稳定性。推荐的解决措施
- 减少线程数:当前虚拟机分配8个CPU核心,程序占满所有核心持续计算,导致内核完全抢不到CPU时间片。建议将线程数降到6-7个,留1-2个核心给内核处理调度和系统任务,这是最直接有效的方案。
- 给计算线程插入间歇:在计算密集的代码循环中,周期性调用
sched_yield()或短暂休眠(如usleep(10)),主动让出CPU给内核执行任务,避免CPU被完全占死。 - 降低单线程计算强度:如果业务允许,拆分大计算任务为更小的块,让调度器有机会介入调度。
- 临时调整内核参数(仅缓解):可临时调大watchdog超时时间(如执行
echo 60 > /proc/sys/kernel/watchdog_thresh),但这只是掩盖问题,无法从根本解决,不推荐长期使用。
内容的提问来源于stack exchange,提问作者czg
相关产品推荐
相关产品推荐

