目录

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等检测相关推荐

  1. 2021-12-10 Linux内核中watchdog,用户层喂狗程序分析

    一.我这里是MTK平台,喂狗的代码在\system\core\watchdogd\,实际测试,如果write(fd, "", 1);注释掉,开机后过段时间会reboot. 1.\s ...

  2. 制造linux内核异常,了解Linux内核中的异常

    我想在非常低的温度下调试我们的嵌入式Linux系统(< 40C).问题是,它并不总是正确启动,我试图找出原因.经过一番分析,我看到内核启动了下面的输出期间进入恐慌:了解Linux内核中的异常 c ...

  3. Linux内核中锁机制之完成量、互斥量

    在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...

  4. 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定

    众所周知,创建一个套接字可以bind到一个特定的ip地址和端口,实际上套接字这一概念代表了TCP/IP协议栈的应用层标识,协议栈中的应用层就是通过一个ip地址和一个端口号标识的,当然这仅仅是对于TCP ...

  5. Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

  6. 如何放出Linux内核中的链表大招

    前言 上回,我们说到Linux内核中max()宏的终极奥义,Linux内核链表也不甘示弱,那么接下来,让我们看看Linux内核中的链表大招. 如何放出Linux内核中的链表大招 前言 一.链表简介 ( ...

  7. Linux内核中max()宏的奥妙何在?(一)

    Linux内核中max()宏的奥妙何在?(一) 1.max()宏那点事 在Linux内核中,有这样四个比较大小的函数,如下: max(x,y) //两个数求最大值 min(x,y) //两个数求最小值 ...

  8. Linux内核中max()宏的奥妙何在?(二)——大神Linus对这个宏怎么看?

    最新max()宏 上回,我们在<Linux内核中max()宏的奥妙何在?(一)>一文中说到,在3.18.34版Linux内核源码中的max()宏,采用了GCC的扩展特性,可以避免一些错误. ...

  9. Linux中文件描述符1,linux内核中的文件描述符(一)--基础知识简介

    原标题:linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blo ...

最新文章

  1. 《Python面向对象编程指南》——1.2 基类中的__init__()方法
  2. python黑科技库:FuckIt.py,让你代码从此远离bug
  3. 面试必过之消息中间件RabbitMQ面试总结大全!
  4. 【正一专栏】孙杨累了就休息下吧!放弃也是一种完美!
  5. Spring学习12之AOP2
  6. 【Tools】怎样转载博客到CSDN博客(很实用)
  7. Leetcode题库 32.从上到下打印二叉树(层次遍历 C实现)
  8. [Leedcode][JAVA][第15题][三数之和][数组][双指针]
  9. 开启docker中MongoDB的认证授权
  10. 全新拟态个人主页/引导页源码
  11. 振型矩阵与正则振型矩阵
  12. 文件服务器登入,密钥文件登录云服务器
  13. angularjs config_AngularJS依赖注入
  14. 史上最简单的 SpringCloud 教程
  15. 微博用户信息源代码爬取_爬取微博用户公开信息,分析为周杰伦打榜的夕阳红老年团,告诉你他们真实年龄!...
  16. ios html 图片旋转了,解决移动端iOS下上传图片被旋转问题。
  17. linux命令大全---入门篇(菜鸟必会)
  18. hdjs---laravel 框架使用hdjs 实现多图上传功能
  19. 1024献礼,全栈工程师进击
  20. 实现简易版vue2(数据劫持,观察者,发布订阅)

热门文章

  1. 某腾讯程序员,在深圳月薪6w,然而却要被断供了?是如何一步步走向破产边缘?...
  2. android avd极限精简,【图片】【02-12技术】MIUI V5极限精简列表 不仅仅只是精简app【android吧】_百度贴吧...
  3. 落谷P1008三连击(C++)
  4. 【牛投客】:股票资金流入是股市常用术语
  5. Android设备支持
  6. 为Garmin Edge 520码表添加地图,创建路线,导入路线
  7. D29:Post Office(邮局,翻译)
  8. 安装cuda+cuDNN
  9. 论文阅读笔记:Self-Attention with Relative Position Representations
  10. Linux九阴真经之九阴白骨爪残卷10(MySQL架构、缓存及索引)