精华内容
下载资源
问答
  • Linux 内核死锁

    2017-11-23 23:46:00
    死锁是指多个进程(线程)因为长久...所以内核中设计了内核死锁检测机制,一旦发现死锁进程,就重启OS,快刀斩乱麻解决问题。之所以使用重启招数,还是在于分布式系统中可以容忍单点崩溃,不能容忍单点进程计算异常...

    死锁是指多个进程(线程)因为长久等待已被其他进程占有的的资源而陷入阻塞的一种状态。当等待的资源一直得不到释放,死锁会一直持续下去。死锁一旦发生,程序本身是解决不了的,只能依靠外部力量使得程序恢复运行,例如重启,开门狗复位等。

     

    所以内核中设计了内核死锁检测机制,一旦发现死锁进程,就重启OS,快刀斩乱麻解决问题。之所以使用重启招数,还是在于分布式系统中可以容忍单点崩溃,不能容忍单点进程计算异常,否则进行死锁检测重启OS就得不偿失了。

    转载于:https://www.cnblogs.com/linhaostudy/p/7887660.html

    展开全文
  • Linux内核死锁检测

    2018-07-23 15:26:52
    这种故障现象,可能是因为Linux内核死锁导致。由于无任何有效打印信息,内核日志中也没有记录,就无法定位故障根因。  如何让Linux内核在僵死前打印相关信息,对问题定位尤为关键。其中一个有效手段是打开“Kernel ...

           实际产品运行过程中,Linux系统僵死,屏幕无任何有效串口打印信息,网络中断、键盘鼠标没有任何响应。这种故障现象,可能是因为Linux内核死锁导致。由于无任何有效打印信息,内核日志中也没有记录,就无法定位故障根因。
           如何让Linux内核在僵死前打印相关信息,对问题定位尤为关键。其中一个有效手段是打开“Kernel Hacking”选项,然后重新编译内核。对于Linux(3.14.28)内核死锁有帮助的几个配置选项有:

       Kernel hacking  --->Debug Lockups and Hangs  --->      

                                   [*] Detect Hard and Soft Lockups                                                                                     
                                   [*]   Panic (Reboot) On Soft Lockups             
                                   [*] Detect Hung Tasks                                                                                                 
                                  (120) Default timeout for hung task detection (in seconds)                                      
                                   [*]   Panic (Reboot) On Hung Tasks   

     

     

    展开全文
  • linux内核死锁调试

    千次阅读 2018-01-04 10:16:00
    内核死锁调试

    使用内核的kernel hacking功能
    打开以下配置:

    CONFIG_PROVE_LOCKING=y
    CONFIG_LOCK_STAT=y
    CONFIG_DEBUG_LOCKDEP=y

    重新编译内核后,proc目录下会有lockdep lockdep_stats lockdep_chains说明lockdep模块已经生效

    测试code:

    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/init.h>
    #include <linux/slab.h>
    
    
    static DEFINE_SPINLOCK(hack_spinA);
    static DEFINE_SPINLOCK(hack_spinB);
    #ifdef MEMORY_TEST
    static char* buf;
    static void create_slue_err(void){
        buf = kmalloc(32,GFP_KERNEL);
        if(buf)  {
            /*memset(buf,0x00,33);*/
        /*  kfree(buf);
            printk("%s\n","free buf" );*/
            /*kfree(buf);*/
            memset(buf,0x00,33);
        }
    
        return;
    }
    #endif
    void hack_spinBA(void) {
        printk("%s\n","hack_spin:B=>A\n" );
        spin_lock(&hack_spinA);
        spin_lock(&hack_spinB);
    }
    
    void hack_spinAB(void) {
        printk("%s\n","hack_spin:A=>B\n" );
        spin_lock(&hack_spinB);
    }
    
    static int __init my_test_init(void) {
        printk("init %s\n", "my_test_init 1");
    #ifdef MEMORY_TEST 
        create_slue_err();
    #endif
        hack_spinBA();
        hack_spinAB();
        printk("init %s\n", "my_test_init 2");
        return 0;
    }
    
    static void __exit my_test_exit(void) {
        printk("%s\n","my_test_exit" );
        return ;
    }
    MODULE_LICENSE("GPL");
    module_init(my_test_init);
    module_exit(my_test_exit);
    

    测试打印

    [  188.596504@1] init my_test_init 1
    [  188.596548@1] hack_spin:B=>A
    [  188.596548@1] 
    [  188.598679@1] hack_spin:A=>B
    [  188.598679@1] 
    [  189.920389@1] BUG: spinlock lockup suspected on CPU#1, insmod/6999
    [  189.920943@1]  lock: hack_spinB+0x0/0xfffffffffffffef4 [slub_test], .magic: dead4ead, .owner: insmod/6999, .owner_cpu: 1
    [  189.931758@1] CPU: 1 PID: 6999 Comm: insmod Tainted: G           O 3.14.29 #6
    [  189.938784@1] Call trace:
    [  189.941406@1] [<ffffffc0010893f8>] dump_backtrace+0x0/0x144
    [  189.946896@1] [<ffffffc001089558>] show_stack+0x1c/0x28
    [  189.952120@1] [<ffffffc001b5b480>] dump_stack+0x74/0xb8
    [  189.957247@1] [<ffffffc0010fb6d4>] spin_dump+0x78/0x98
    [  189.962369@1] [<ffffffc0010fb904>] do_raw_spin_lock+0x170/0x1a8
    [  189.968199@1] [<ffffffc001b670a8>] _raw_spin_lock+0x68/0x88
    [  189.973764@1] [<ffffffbffc00507c>] hack_spinAB+0x30/0x3c [slub_test]
    [  189.980015@1] [<ffffffbffc00d028>] $x+0x28/0x4c [slub_test]
    [  189.985566@1] [<ffffffc0010816d4>] do_one_initcall+0xd4/0x13c
    [  189.991257@1] [<ffffffc00112c2f8>] load_module+0x16d8/0x1e08
    [  189.996834@1] [<ffffffc00112cba0>] SyS_finit_module+0x80/0x90
    
    
    
    [  211.641019@1] INFO: rcu_sched detected stalls on CPUs/tasks: { 1} (detected by 2, t=2104 jiffies, g=18446744073709551337, c=18446744073709551336, q=4)
    [  211.648804@2] Task dump for CPU 1:
    [  211.652167@2] insmod          R  running task        0  6999   5821 0x0000000a
    [  211.659325@2] Call trace:
    [  211.661920@2] [<ffffffc001085f10>] __switch_to+0x74/0x8c

    很明显可以看出死锁的发生路径与调用栈
    hack_spinAB在申请spin_lock(&hack_spinB)时死锁了

    展开全文
  • 死锁就是多个进程(线程...所以内核中设计了内核死锁检测机制,一旦发现死锁进程,就重启OS,快刀斩乱麻解决问题。之所以使用重启招数,还是在于分布式系统中可以容忍单点崩溃,不能容忍单点进程计算异常,否则进行死...

    死锁就是多个进程(线程)因为等待别的进程已占有的自己所需要的资源而陷入阻塞的一种状态,死锁状态一旦形成,进程本身是解决不了的,需要外在的推动,才能解决,最重要的是死锁不仅仅影响进程业务,而且还会占用系统资源,影响其他进程。所以内核中设计了内核死锁检测机制,一旦发现死锁进程,就重启OS,快刀斩乱麻解决问题。之所以使用重启招数,还是在于分布式系统中可以容忍单点崩溃,不能容忍单点进程计算异常,否则进行死锁检测重启OS就得不偿失了。

    内核提供自旋锁、信号量等锁形式的工具,具体不再赘述。

    Linux内核死锁主要分为分为两种:D状态死锁和R状态死锁。

    一、D状态死锁检测

    D状态死锁:进程长时间处于TASK_UNINTERRUPTIBLE而不恢复的状态。进程处于TASK_UNINTERRUPTIBLE状态,不响应其他信号(kill -9),保证一些内核原子操作不被意外中断。但这种状态时间长就表示进程异常了,需要处理。

    内核D状态死锁检测就是hung_task机制,主要代码就在kernel/hung_task.c文件。

    具体实现原理:

    1.创建Normal级别的khungtaskd内核线程,在死循环中每隔sysctl_hung_task_timeout_secs时间后check一下,用schedule_timeout定时(节约定时器浪费的CPU)。

    2.调用do_each_thread,while_each_thread宏遍历所有的进程信息,如果有D状态进程,则检查最近切换次数和task计算是否一致,即最近是否有调度切换,如果一致,则没有切换,打印相关信息,并根据sysctl_hung_task_panic开关决定是否重启。

    对应用户态控制的proc接口有:

    /proc/sys/kernel/hung_task_timeout_secs,hung_task_panic等。

    二、R状态死锁检测

    R状态死锁:进程长时间处于TASK_RUNNING 状态抢占CPU而不发生切换,一般是,进程关抢占后一直执行任务,或者进程关抢占后处于死循环或者睡眠,此时往往会导致多个CPU互锁,整个系统异常。

    补充:lockdep不是所谓的死锁。

    内核R状态死锁检测机制就是lockdep机制,入口即是lockup_detector_init函数。

    1.通过cpu_callback函数调用watchdog_enable,在每个CPU core上创建SCHED_FIFO级别的实时线程watchdog,其中使用了hrtimer定时器,控制检查周期。

    2.hrtimer定时器调用watchdog_timer_fn进行清狗的时间检查,而线程则每次重置清狗时间,如果watchdog_timer_fn发现狗的重置时间已经和当前时间差出危险值,则根据开关进行panic处理。

    对应用户态控制的proc接口有:

    /proc/sys/kernel/watchdog_thresh,softlockup_panic等。

    整个死锁检测机制比较简单,但cpu_callback函数结构性设计巧妙,可以在很多地方参考使用。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    static int __cpuinit

    cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)

    {

    int hotcpu = (unsigned long)hcpu;

    switch (action) {

    case CPU_UP_PREPARE:

    case CPU_UP_PREPARE_FROZEN:

    watchdog_prepare_cpu(hotcpu);

    break;

    case CPU_ONLINE:

    case CPU_ONLINE_FROZEN:

    if (watchdog_enabled)

    watchdog_enable(hotcpu);

    break;

    #ifdef CONFIG_HOTPLUG_CPU

    case CPU_UP_CANCELED:

    case CPU_UP_CANCELED_FROZEN:

    watchdog_disable(hotcpu);

    break;

    case CPU_DEAD:

    case CPU_DEAD_FROZEN:

    watchdog_disable(hotcpu);

    break;

    #endif /* CONFIG_HOTPLUG_CPU */

    }

    /*

    * hardlockup and softlockup are not important enough

    * to block cpu bring up.  Just always succeed and

    * rely on printk output to flag problems.

    */

    return NOTIFY_OK;

    }

    —结束—

    Linux 内核死锁

    死锁是指多个进程(线程)因为长久等待已被其他进程占有的的资源而陷入阻塞的一种状态.当等待的资源一直得不到释放,死锁会一直持续下去.死锁一旦发生,程序本身是解决不了的,只能依靠外部力量使得程序恢复运行, ...

    Linux内核中锁机制之RCU、大内核锁

    在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核锁(BKL).文章的最后对

    大话Linux内核中锁机制之RCU、大内核锁

    大话Linux内核中锁机制之RCU.大内核锁 在上篇博文中笔者分析了关于完成量和互斥量的使用以及一些经典的问题,下面笔者将在本篇博文中重点分析有关RCU机制的相关内容以及介绍目前已被淘汰出内核的大内核 ...

    Linux内核抢占实现机制分析【转】

    Linux内核抢占实现机制分析 转自:http://blog.chinaunix.net/uid-24227137-id-3050754.html [摘要]本文详解了Linux内核抢占实现机制.首先介 ...

    Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

    在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论内存屏障的相关内容. 三.内存屏障 不知读者是是否记得在笔 ...

    Linux内核中锁机制之信号量、读写信号量

    在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实际上它是与自旋锁类似的概念,只有得到信号量的进程 ...

    Linux内核中锁机制之原子操作、自旋锁

    很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态.这其中包括了我们所熟知的SMP系统,多 ...

    大话Linux内核中锁机制之信号量、读写信号量

    大话Linux内核中锁机制之信号量.读写信号量 在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实 ...

    大话Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

    大话Linux内核中锁机制之内存屏障.读写自旋锁及顺序锁 在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论 ...

    随机推荐

    SQL Server中可能为null的变量逻辑运算的时候要小心

    DECLARE @a int declare @b int IF(@a<>@b) print('@a<>@b') else print('@a=@b') ) print('b& ...

    嵌入式Linux驱动开发日记

    嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...

    Mariadb 10&period;1 joiner节点加入报错WSREP&colon; Failed to prepare for incremental state transfer

    Mariadb 10.1 galera cluster 集群joiner 节点加入集群 会出现这种报错,导致mysql一直点点点,这里我贴出报错.2016年04月19日13:34:58 2016-04 ...

    json字符串转json对象的方法

    在使用$.ajax()方法时,我们可以设置dataType:'json'的参数,便可以拿到后台返回的json数据对应的json对象.但有时,我们拿到的是json字符串,需要将它再转成json对象来使用 ...

    Java 需要记得、了解的关键词 (Java 学习中的小记录)

    Java 需要记得.了解的关键词 (Java 学习中的小记录)     作者:王可利(Star·星星) 总结:本次随笔,仅且拿来平时翻阅记忆用

    Android小项目之十二 设置中心的界面

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 按惯例,写在前面的:可能在学习Android的过程中,大家会和我一样,学习过大量的基础知识,很多的知识点 ...

    ES6学习笔记(二)

    1.数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. var a = 1; va ...

    iOS 切割图片

    - (UIImage *)CutImageWithImage:(UIImage *)image withRect:(CGRect)rect { //使用CGImageCreateWithImageIn ...

    Vue-vue-cli初始化项目

    一.下载安装node.js下载地址:https://nodejs.org/en/download/,选择合适自己的版本下载,我下载的是Windows Installer (.msi)    32.bi ...

    keras系列︱迁移学习:利用InceptionV3进行fine-tuning及预测、完美案例(五)

    引自:http://blog.csdn.net/sinat_26917383/article/details/72982230 之前在博客

    展开全文
  • 这种故障现象,可能是因为Linux内核死锁导致。由于无任何有效打印信息,内核日志中也没有记录,就无法定位故障根因。 如何让Linux内核在僵死前打印相关信息,对问题定位尤为关键。其中一个有效手段是打开“Kernel...
  • Linux内核死锁(deadlock)检测

    千次阅读 2013-01-06 09:23:20
    这种故障现象,可能是因为Linux内核死锁导致。由于无任何有效打印信息,内核日志中也没有记录,就无法定位故障根因。   如何让Linux内核在僵死前打印相关信息,对问题定位尤为关键。其中一个有效手段是...
  • 死锁就是多个进程(线程)因为等待别的进程已占有的自己所需要的资源而陷入阻塞的一种状态,死锁状态一旦形成,进程本身是解决不了的,需要外在的推动,才能解决,最...所以内核中设计了内核死锁检测机制,一旦发...
  • 本文简介:内核死锁问题一般是读写锁(rw_semaphore)和互斥锁(mutex)引起的,本文主要讲如何通过ramdump+crash工具来分析这类死锁问题。作者简介:朴英敏,现就职于...
  • 本文简介:内核死锁问题一般是读写锁(rw_semaphore)和互斥锁(mutex)引起的,本文主要讲如何通过ramdump+crash工具来分析这类死锁问题。作者简介:朴英敏,现就职于国内一家手机研发公司,任职资深系统工程师,主要...
  • https://blog.csdn.net/juS3Ve/article/details/79428049
  • 一、前言 1.自旋锁与信号量 自旋锁:当不能获得自旋锁时一直忙等待,既不睡眠、也不执行调度。 信号量:当不能获得信号量时,...1.Linux2.6.29内核开启内核抢占 make menuconfig Kernel Features->Preemptible Kerne
  • Linux死锁检测 小狼@http://blog.csdn.net/xiaolangyangyang
  • 内核死锁的debug方法

    2021-03-03 17:18:05
    上次我们讲了死锁的本质,这次我们讲下发生死锁时用什么方法可以发现并解决相关问题。lockdep 死锁检测模块 Linux内核提供死锁调试模块Lockdep,跟踪每个锁的自身状态和各个锁之间...
  • Linux fdisk -l查看分区,结果打印一个分区后引起内核死锁。 打印 root@www:~# fdisk -l Disk /dev/mtdblock0: 2 MB, 2621440 bytes 255 heads, 63 sectors/track, 0 cylinders Units = cylinders of 16065 * ...
  • Linux开启Lockdep检测内核死锁

    千次阅读 2017-08-13 11:29:00
    Lockdep是内核检测deadlock的手段,默认没有开启,需要make menuconfig增加配置开启, https://stackoverflow.com/questions/20892822/how-to-use-lockdep-feature-in-linux-kernel-for-deadlock-detection
  • 一、死锁的概念  1.什么是死锁:  死锁 (deadlocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态...
  • linux死锁检测与调试

    千次阅读 2017-09-20 21:56:21
    linux内核死锁如何调试 相关内核配置选项 Linux检测死锁实现分析 soft lockup检测原理 hard lockup检测原理 常见死锁错误 如何避免死锁 参考资料linux死锁检测与调试什么是死锁? 死锁是指多个进程(线程)因为长久...
  • 【推荐阅读】什么是死锁?内核死锁的debug方法上文讲了通过lockdep的方式可以debug出死锁的信息,但是如果出问题的系统没有lockdep的配置,或者没有相关的日志该怎么办?这里分...
  • 引用 Linux内核调试技术——进程D状态死锁检测 Linux内核调试方法总结之死锁问题分析 Linux死锁调试之hardlockup ... 朴英敏: 用crash工具分析Linux内核死锁的一次实战 【嵌入式Linux学习七步曲之第五篇 Linu
  • 在开发内核模块或驱动时,如果处理失误,导致内核线程中出现死锁或者死循环,你会发现,除了重启之外,你没有任何可以做的。这时你的输入不起任何作用,终端(不是指远程的ssh工具)只会在那重复的输出类似“BUG: ...
  • 在开发内核模块或驱动时,如果处理失误,导致内核线程中出现死锁或者死循环,你会发现,除了重启之外,你没有任何可以做的。这时你的输入不起任何作用,终端(不是指远程的ssh工具)只会在那重复的输出类似“BUG: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,165
精华内容 9,666
关键字:

linux内核死锁

linux 订阅