linux内核中watchdog、lockup、stall、hung等检测
目录
lockup
一、watchdog看门狗
二、soft /hard lockup
1、soft lockup
2、hard lockup
三、kernel's hung task
四、workqueue stall
lockup
系统(在一个或多个CPU核上)保持在长时间无反应状态。可检测类型有watchdog、soft lockup、hard lockup、 hung task、workqueue stall 等。
一、watchdog看门狗
检测系统的健康状态,有能力重启系统。
CONFIG_SOFT_ WATCHDOG=m
查看内核中看门狗的运行
#ps -e | grep watch103 ? 00:00:00 watchdogd
二、soft /hard lockup
Kernel hacking | Debug Oops, Lockups and Hangs
看门狗的配置
# sysctl -a | grep watchdog
//0:关闭NMI看门狗和硬件lockup检测
kernel.nmi_watchdog = 0
//开启软件lockup检测
kernel.soft_watchdog = 1
//1 开启两者(软/硬)
kernel.watchdog = 1
//
kernel.watchdog_cpumask = 0-127
//硬件lockup 超时,软件lockup 2*10
kernel.watchdog_thresh = 10
1、soft lockup
内核处于紧密的循环中,长时间不让其他任务得到调度
当检测到软锁定时
- panic (内核配置nmi_watchdog=1;kernel.hardlockup_panic sysctl=1;BOOTPARAM_ SOFTLOCKUP_PANIC=1)
- 发出大量的警告
测试程序 :自旋spin_(un)lock()
kernel_thread 线程中有如下循环,CPU密集型spin_lock(&spinlock);while (i < 10000000000) { i ++;if (!(i%50000000))PRINT_CTX();}spin_unlock(&spinlock);
检测输出
[ 312.261567] watchdog: BUG: soft lockup - CPU#1 stuck for 22s! [lkd/kt_stuck:589][ 354.256680] kthread_stuck:simple_kthread(): 001) [lkd/kt_stuck]:589 | .N.0 /* simple_kthread() */
[ 354.722453] kthread_stuck:simple_kthread(): 001) [lkd/kt_stuck]:589 | .N.0 /* simple_kthread() */
2、hard lockup
在内核模式下运行的CPU内核仍处于紧密循环状态,不允许其他硬件中断运行;
系统检测到硬锁时
- panic (内核配置nmi_watchdog=1;kernel.hardlockup_panic sysctl=1;BOOTPARAM_ SOFTLOCKUP_PANIC=1)
- 发出大量的警告
内核配置
1、硬锁定只能由NMI,在本机x86_64上检测到;
2、必须启用NMI和NMI看门狗 nmi_ watchdog=1
3、CONFIG_RCU_CPU_STALL_TIMEOUT 值的范围 (3~300)在此时间内一定能检测到
4、CONFIG_RCU_STALL_COMMON=y
测试程序 自旋转IRQs、禁止抢占 spin_(un)lock_irq()
kernel_thread 线程中有如下循环,CPU密集型spin_lock_irq(&spinlock);while (i < 10000000000) { i ++;if (!(i%50000000))PRINT_CTX();}spin_unlock_irq(&spinlock);
检测输出
[ 4557.452812] rcu: INFO: rcu_sched detected stalls on CPUs/tasks:
[ 4557.454426] rcu: 1-...0: (1 ticks this GP) idle=43e/1/0x4000000000000000 softirq=6242/6242 fqs=2599
[ 4557.455684] rcu: (detected by 2, t=5252 jiffies, g=13033, q=119)
[ 4557.457412] Task dump for CPU 1:
[ 4557.458131] lkd/kt_stuck R running task 0 793 2 0x0000002a
[ 4557.459379] Call trace:
[ 4557.460526] __switch_to+0xd0c/0xd44
[ 4557.461157] logbuf_lock+0x0/0x4
[ 4557.464316] kthread_stuck:simple_kthread(): 001) [lkd/kt_stuck]:793 | dN.0 /* simple_kthread() */
三、kernel's hung task
内核设置
Kernel hacking | Debug Oops, Lockups and Hangs | Detect Hung Tasks
配置见图二
参数解析
# sudo sysctl -a|grep hung_task
//如果设置1 则内核给所有核发送NMI中断,触发堆栈追溯
kernel.hung_task_all_cpu_backtrace = 0
//检测任务数的上线
kernel.hung_task_check_count = 4194304
//0 意味着挂起任务的值是kernel.hung_task_timeout_secs
kernel.hung_task_check_interval_secs = 0
//1:kernel panix 0:任务维持挂起状态
kernel.hung_task_panic = 0
//设置0 则禁止检测
kernel.hung_task_timeout_secs = 120
//报告的最大经过数
kernel.hung_task_warnings = 10
四、workqueue stall
内核设置
Kernel hacking | Debug Oops, Lockups and Hangs | Detect Workqueue Stalls
配置见图二
参数解析
检测时间workqueue.watchdog_thresh 默认30秒,设置0 禁止检测
测试例子:在workqueue回调函数中,添加CPU密集型函数
static void work_func(struct work_struct *work)
{struct st_ctx *priv = container_of(work, struct st_ctx, work);u64 i = 0;PRINT_CTX();//CPU密集型执行while (1)i += 3;
}static int __init workq_simple_init(void)
{ctx.data = INITIAL_VALUE;//初始化workqueueINIT_WORK(&ctx.work, work_func);return 0;
}
测试输出
[ 580.742603] BUG: workqueue lockup - pool cpus=1 node=0 flags=0x0 nice=0 stuck for 73s!
[ 529.474102] rcu: INFO: rcu_sched self-detected stall on CPU
[ 529.474499] rcu: 1-....: (20464 ticks this GP) idle=fc6/1/0x4000000000000002 softirq=4407/4408 fqs=9074
linux内核中watchdog、lockup、stall、hung等检测相关推荐
- 2021-12-10 Linux内核中watchdog,用户层喂狗程序分析
一.我这里是MTK平台,喂狗的代码在\system\core\watchdogd\,实际测试,如果write(fd, "", 1);注释掉,开机后过段时间会reboot. 1.\s ...
- 制造linux内核异常,了解Linux内核中的异常
我想在非常低的温度下调试我们的嵌入式Linux系统(< 40C).问题是,它并不总是正确启动,我试图找出原因.经过一番分析,我看到内核启动了下面的输出期间进入恐慌:了解Linux内核中的异常 c ...
- Linux内核中锁机制之完成量、互斥量
在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...
- 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定
众所周知,创建一个套接字可以bind到一个特定的ip地址和端口,实际上套接字这一概念代表了TCP/IP协议栈的应用层标识,协议栈中的应用层就是通过一个ip地址和一个端口号标识的,当然这仅仅是对于TCP ...
- Linux 内核中的 Device Mapper 机制
本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...
- 如何放出Linux内核中的链表大招
前言 上回,我们说到Linux内核中max()宏的终极奥义,Linux内核链表也不甘示弱,那么接下来,让我们看看Linux内核中的链表大招. 如何放出Linux内核中的链表大招 前言 一.链表简介 ( ...
- Linux内核中max()宏的奥妙何在?(一)
Linux内核中max()宏的奥妙何在?(一) 1.max()宏那点事 在Linux内核中,有这样四个比较大小的函数,如下: max(x,y) //两个数求最大值 min(x,y) //两个数求最小值 ...
- Linux内核中max()宏的奥妙何在?(二)——大神Linus对这个宏怎么看?
最新max()宏 上回,我们在<Linux内核中max()宏的奥妙何在?(一)>一文中说到,在3.18.34版Linux内核源码中的max()宏,采用了GCC的扩展特性,可以避免一些错误. ...
- Linux中文件描述符1,linux内核中的文件描述符(一)--基础知识简介
原标题:linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blo ...
最新文章
- 《Python面向对象编程指南》——1.2 基类中的__init__()方法
- python黑科技库:FuckIt.py,让你代码从此远离bug
- 面试必过之消息中间件RabbitMQ面试总结大全!
- 【正一专栏】孙杨累了就休息下吧!放弃也是一种完美!
- Spring学习12之AOP2
- 【Tools】怎样转载博客到CSDN博客(很实用)
- Leetcode题库 32.从上到下打印二叉树(层次遍历 C实现)
- [Leedcode][JAVA][第15题][三数之和][数组][双指针]
- 开启docker中MongoDB的认证授权
- 全新拟态个人主页/引导页源码
- 振型矩阵与正则振型矩阵
- 文件服务器登入,密钥文件登录云服务器
- angularjs config_AngularJS依赖注入
- 史上最简单的 SpringCloud 教程
- 微博用户信息源代码爬取_爬取微博用户公开信息,分析为周杰伦打榜的夕阳红老年团,告诉你他们真实年龄!...
- ios html 图片旋转了,解决移动端iOS下上传图片被旋转问题。
- linux命令大全---入门篇(菜鸟必会)
- hdjs---laravel 框架使用hdjs 实现多图上传功能
- 1024献礼,全栈工程师进击
- 实现简易版vue2(数据劫持,观察者,发布订阅)
热门文章
- 某腾讯程序员,在深圳月薪6w,然而却要被断供了?是如何一步步走向破产边缘?...
- android avd极限精简,【图片】【02-12技术】MIUI V5极限精简列表 不仅仅只是精简app【android吧】_百度贴吧...
- 落谷P1008三连击(C++)
- 【牛投客】:股票资金流入是股市常用术语
- Android设备支持
- 为Garmin Edge 520码表添加地图,创建路线,导入路线
- D29:Post Office(邮局,翻译)
- 安装cuda+cuDNN
- 论文阅读笔记:Self-Attention with Relative Position Representations
- Linux九阴真经之九阴白骨爪残卷10(MySQL架构、缓存及索引)