记一次内核soft lockup的定位记录

在大用户场景下,产品出现内核soft lockup错误,原因是CPU在获取读写锁时发生问题。通过分析内核代码和日志,排除了多锁操作顺序不当和链表过长的原因。发现锁获取后进行的kmalloc操作由于使用GFP_ATOMIC不会引起睡眠。启用内核的lockdep调试特性,重新编译内核后,发现在获取锁的任务被中断,且中断处理程序中又尝试获取锁,导致死锁。解决方案是改用关闭中断的read_lockirqsave和write_lockirqsave接口。

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

   产品大用户场景下运行一段时间即报“Aug  7 19:19:58 localhost kernel: NMI watchdog: BUG: soft lockup - CPU#7 stuck for 23s! [xxxx:80779]" 错误,内核日志调用栈显示是在获取锁时失败,该锁是读写锁,使用read_lock或者write_lock获取锁,锁使用情况如下所示,如图所示锁用在桶深256的HASH表下挂链表插入删除时的竞争保护。刚开始按照用户态经验加锁时锁不可用不是被挂起睡眠吗?等待锁可用再被唤醒,怎么会一直占有CPU20多秒,通过分析内核读写锁函数发现内核读写锁类似spin_lock死等,所以应该是该锁被其他人长时间占用,到了调用栈所示的调用时一直无法获取锁导致的,死等20多秒超时导致该CPU的watchdog发现(watchdog是IRQ所以不会因为死等锁而不能调度),同时可以确定用户态死锁不会导致soft lockup。


    结合产品内核代码进而分析可能原因: 1) 多个内核锁的PV操作顺序不当导致死锁; 2) HASH链上的节点太多,导致获取锁的任务处理时间超过20s;3)某任务获取锁之后睡眠(同spin_lock后不能睡眠)4) 其他原因死锁

    分析代码排除1,增加调试手段查看所有HASH链的长度排除2,分析代码发现操作HASH表时

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值