如何在指定Ubuntu X86_64平台用用户态C程序触发CPU soft lockup
用户态C程序触发4.15.0-142-generic Ubuntu内核CPU soft lockup实现方法
实现原理
CPU soft lockup是内核看门狗机制检测到某CPU核心连续超过阈值(默认20秒)没有发生进程调度时上报的异常状态。用户态程序只要绑定到固定CPU核心、抢占CPU不让出调度权,即可触发该异常。
前置校验
先确认内核参数配置符合要求,执行以下命令校验:
- 确认看门狗已开启:
sysctl kernel.watchdog输出应为1 - 确认soft lockup阈值:
sysctl kernel.watchdog_thresh输出默认值为10,对应实际检测阈值为2倍参数值即20秒 - 确认soft lockup不会触发系统重启:
sysctl kernel.panic_on_softlockup输出应为0,否则会导致触发后系统直接重启
完整C代码
文件名trigger_softlockup.c:
#define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <sched.h> #include <unistd.h> int main() { int cpu_id = 1; // 绑定到CPU核心1,可自行修改为空闲核心编号 cpu_set_t cpuset; struct sched_param sched_p; // 1. 设置CPU亲和性,绑定到指定核心 CPU_ZERO(&cpuset); CPU_SET(cpu_id, &cpuset); if (sched_setaffinity(0, sizeof(cpu_set_t), &cpuset) != 0) { perror("sched_setaffinity failed"); return -1; } // 2. 设置进程为最高优先级的FIFO实时调度,避免被其他进程抢占 sched_p.sched_priority = sched_get_priority_max(SCHED_FIFO); if (sched_setscheduler(0, SCHED_FIFO, &sched_p) != 0) { perror("sched_setscheduler failed, need root permission"); return -1; } printf("Process bound to CPU %d, entering dead loop to trigger soft lockup...\n", cpu_id); // 3. 纯用户态死循环,不执行任何系统调用,完全占用CPU不让出调度权 while(1); return 0; }
编译运行步骤
- 编译命令:
gcc trigger_softlockup.c -o trigger_softlockup -lpthread - 执行命令(需要root权限):
sudo ./trigger_softlockup - 等待20~30秒后,执行
dmesg即可看到内核输出的BUG: soft lockup - CPU#1 stuck for Xs!类报错,代表触发成功
注意事项
- 尽量绑定到空闲的CPU核心运行,避免影响系统其他进程运行
- 触发完成后直接按
Ctrl+C终止进程即可恢复,不会造成系统永久损坏 - 不要在生产环境执行该操作
内容的提问来源于stack exchange,提问作者Franc
相关产品推荐
相关产品推荐

