【linux】soft or hard lockup

本文探讨了Linux内核中的软死锁现象,包括其定义、产生原因及检测方法。通过对watchdog机制的介绍,解释了如何通过监控进程运行状态来判断是否存在软死锁,并分析了常见引发软死锁的因素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内核软死锁(soft lockup)bug原因分析

Soft lockup名称解释:所谓,soft lockup就是说,这个bug没有让系统彻底死机,但是若干个进程(或者kernel thread)被锁死在了某个状态(一般在内核区域),很多情况下这个是由于内核锁的使用的问题。

Linux内核对于每一个cpu都有一个监控进程,在技术界这个叫做watchdog(看门狗)。通过ps –ef | grep watchdog能够看见,进程名称大概是watchdog/X(数字:cpu逻辑编号1/2/3/4之类的)。这个进程或者线程每一秒钟运行一次,否则会睡眠和待机。这个进程运行会收集每一个cpu运行时使用数据的时间并且存放到属于每个cpu自己的内核数据结构。在内核中有很多特定的中断函数。这些中断函数会调用soft lockup计数,他会使用当前的时间戳与特定(对应的)cpu的内核数据结构中保存的时间对比,如果发现当前的时间戳比对应cpu保存的时间大于设定的阀值,他就假设监测进程或看门狗线程在一个相当可观的时间还没有执。Cpu软锁为什么会产生,是怎么产生的?如果linux内核是经过精心设计安排的CPU调度访问,那么怎么会产生cpu软死锁?那么只能说由于用户开发的或者第三方软件引入,看我们服务器内核panic的原因就是qmgr进程引起。因为每一个无限的循环都会一直有一个cpu的执行流程(qmgr进程示一个后台邮件的消息队列服务进程),并且拥有一定的优先级。Cpu调度器调度一个驱动程序来运行,如果这个驱动程序有问题并且没有被检测到,那么这个驱动程序将会暂用cpu的很长时间。根据前面的描述,看门狗进程会抓住(catch)这一点并且抛出一个软死锁(soft lockup)错误。软死锁会挂起cpu使你的系统不可用。

如果是用户空间的进程或线程引起的问题backtrace是不会有内容的,如果内核线程那么在soft lockup消息中会显示出backtrace信息。

 

????

 

ref1: http://blog.youkuaiyun.com/wanweiaiaqiang/article/details/8302064

ref2: http://blog.youkuaiyun.com/tronteng/article/details/7891940

 

hard lockup

 

hard lockup的发生是由于禁止了CPU的所有中断超过一定时间(几秒)这种情况下,外部设备发生的中断无法处理,内核认为此时发生了所谓的hard lockup. 由于NMI( Non Mask Interrup)中断是不可屏蔽的中断,因此可以用来检测是否发生了hard lockup, NMI中断是周期性发生的,在相应的中断处理函数中检测一个全局变量的值(这个全局变量的值是由CPU本地定时器的中断处理程序改动的),判断该变量是否和上次保存的值相等,若相等,则认为系统发生了某种异常(中断禁止的时间超过了上限),然后调用panic函数重启系统,显示hard lockup. 出现这种情况的可能原因是由于spin_lock_irqsave(内部实现有一个反复delay的操作https://lkml.org/lkml/2012/9/13/656) 导致的,如果一个线程反复获取同一个spinlock, 跑在另一个CPU的线程尝试获取该spinlock时,会禁止中断然后一直等待,如果超过一定的时间,就会导致NMI中断处理程序调用panic重启系统。

### Linux Soft Lockup 原因 Soft lockup 是指某些进程或内核线程被卡在特定状态下无法继续执行,尽管系统其他部分仍能正常运作[^1]。这种状况通常是由于以下几个原因之一: - **内核锁争用**:当多个进程试图获取同一个资源上的互斥锁时可能发生死锁情况。 - **无限循环**:如果程序陷入了一个不会退出的循环中,并且该循环不包含任何可打断点,则可能导致处理器持续占用而不响应外部请求。 - **硬件故障**:偶尔也会因为底层硬件层面的问题引起此错误。 具体来说,在Linux环境中遇到 `BUG: soft lockup` 错误提示意味着某颗CPU核心已经停止响应超过一定时间长度(默认为20秒),这期间它既没有处理新的任务也没有完成当前正在做的工作[^2]。 ### 解决方案概述 针对上述提到的各种可能成因,可以采取如下措施来预防和修复soft lockup问题: #### 调试与诊断工具的应用 利用诸如 perf、ftrace 或者 SystemTap 这样的性能分析工具可以帮助定位哪些函数调用路径消耗了大量的CPU周期而未能及时返回控制权给调度器[^3]。 ```bash perf record -g sleep 60; perf report ``` 这段命令会收集一分钟内的采样数据并生成报告用于后续审查。 #### 修改内核参数配置 调整一些关键性的内核参数有助于缓解由竞争条件引发的竞争态异常行为。例如增加最大允许等待的时间间隔(`watchdog_thresh`)可以让系统有更多机会自行恢复而不是立即触发警报;设置更激进的任务迁移策略能够减少跨NUMA节点间通信延迟带来的负面影响等。 ```bash echo "10" > /proc/sys/kernel/watchdog_thresh ``` 通过修改 `/etc/sysctl.conf` 文件中的相应条目实现永久生效。 #### 更新驱动程序版本 对于那些怀疑是由设备驱动缺陷所造成的案例而言,尝试升级到最新稳定版往往可以获得更好的兼容性和稳定性表现。特别是涉及到网络接口控制器(Network Interface Controller, NIC)以及存储子系统的组件时更是如此。 #### 定期维护检查 定期重启服务端机器以清除累积下来的临时文件缓存和其他潜在隐患同样重要。此外还需关注官方安全公告列表里是否有针对性补丁发布可供应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值