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

如何在指定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;
}

编译运行步骤

  1. 编译命令:gcc trigger_softlockup.c -o trigger_softlockup -lpthread
  2. 执行命令(需要root权限):sudo ./trigger_softlockup
  3. 等待20~30秒后,执行dmesg即可看到内核输出的BUG: soft lockup - CPU#1 stuck for Xs!类报错,代表触发成功

注意事项

  • 尽量绑定到空闲的CPU核心运行,避免影响系统其他进程运行
  • 触发完成后直接按Ctrl+C终止进程即可恢复,不会造成系统永久损坏
  • 不要在生产环境执行该操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 22:18:01