转自:https://blog.csdn.net/divlee130/article/details/47806551

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/divlee130/article/details/47806551
软死锁问题定位分析。
现象:服务器软死锁,增量数据无法下发。一直报cpu soft lockup

1.通过kxfr日志确认出问题出现的地方
通过对服务器分析可以看到出现问题的地方都是下发配置kxfr_id=2202438的地方由此大概定位出问题的域名。

2.进一步分析机器内核信息可以看到如下kxfr_add_rdset流程出了问题。

按理说简单的遍历比较不会出问题。这里怎么会有问题呢。没有思路看看crash吧。到网上学习
http://blog.csdn.net/fishermandong/article/details/12112381

进一步通过crash相应的命令查看find_rdset汇编代码并对照源码分析相应的内存信息。

分析到此处我们只需要知道R9里面的内容是什么即可
查看栈信息得知R9里面的内容为ffff881042ac5ce0这里个地址里面的内容减去0X38就是上面的RDSET的内容!首先查看R9寄存器内容得到地址ffff88085076de78所以我们查看ffff88085076de40地址里面的内容。

查看相应的内存中信息如下,可以看到相应的内存中的信息。正是我们猜的struct dns_rdset信息,可以看到相应的id 为317842中的数据有问题。发现他的指针prev 和next居然是自己这里面肯定有问题。

再进一步分析查看这个RDSET上一级rrset 信息,正式我们所猜测的的lianzhaobox.com这个域名!到此为止基本上可以确定这个问题是这个节点打环了。

那是什么原因打环呢。我们继续分析如下。

在代码中打印调试信息如下。
正如我们所料ffff88081371cd78这里面的数据已经有问题。里面打环的信息不止这一个我们找到第一个出现问题的点。

这个是第一次出现时刻的数据贴出相应的代码

可以看到里面有2个RDSET_ID相同的节点,通过进一步分析得知这个是增加KXFR_ID为2201768的时候出的问题,该流程如下首先查看是否存在相应的RDSET可以看出他找到了。然后走MNT流程,然后根据当前下发bitmap,判断rrset->view[i]相应的为是否等于找到的rdset,如果不相等就减相应的计数当计数减到0时释放相应的rdset,注意此时释放的是后一个rdset节点,所以经过释放后链表中只有一个节点了。而内核中巧合又将这个节点加入链表。由此出现问题。

这个问题出现的概率很小首先系统中同一个RDSET_ID如果已经配置,出现ADDRDSET的流程是不会有的。我们会生成MNTRDSET,或者DELCHILD,出问题的这个是用户批量操作的时候出现的问题, 而且恰好内存中只能有2个节点,再次触发ADDRDSET流程且命中的节点不是释放的节点时才会出现。且2个节点的bitmap必须互斥。

需要说明的是如果一个链表已经在链上了并且只有一个节点如果再次将自己加入节点肯定会有问题的。

修复办法

前端严格按照 线路 domain bitmap type 生成rdset_id 像图中的情况bitmap不同时rdset_id相同这个是不正确的。另外后面的ADDRDSET正常来说应该是MNTRDSET,但是我们给生成的确是ADDRDSET。

后端修复

如果是ADDRDSET流程,如果已经找到了则不再增加到相应RDSET链表。正常情况下是不会有这个流程的,ADDRDSET流程一般都不会找到相应的节点。都会重新分配内存。

后记
通过对这次问题分析让我体会很深刻。开始就分析代码始终想不通一个链表怎么会死锁。总结一点出现问题通过对问题的复现很重要。往往没有经过复现的分析都是不对的。还好我们选择了利用现网资源复现该问题。从而打印出相应出问题的关键点。如果自己构造是不可能构造出来这个问题的。
---------------------
作者:divlee130
来源:CSDN
原文:https://blog.csdn.net/divlee130/article/details/47806551
版权声明:本文为博主原创文章,转载请附上博文链接!

利用crash 分析软死锁问题【转】的更多相关文章

  1. 利用windbg分析崩溃,句柄泄漏,死锁,CPU高,内存泄漏

    Windbg的一些简单使用命令 一.崩溃 1.  输入.ecxr;kbn得到崩溃的堆栈 其中源代码如下 2.  查看堆栈和源代码,发现第0帧导致崩溃,代码也是本地代码 输入.frame  0,切到第0 ...

  2. iOS --------Crash 分析(一)

    iOS Crash 分析(文一)- 开始 1. 名词解释 1. UUID 一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID.目的是为了唯一识别这个文件. 2. dwarfdump 苹 ...

  3. iOS Crash 分析 符号化崩溃日志

    参考: http://blog.csdn.net/diyagoanyhacker/article/details/41247367 http://blog.csdn.net/diyagoanyhack ...

  4. 利用dotnet-dump分析docker容器内存泄露

    目录 一 运行官方示例 1,Clone代码并编译 2,创建Dockerfile构建镜像 3,启动容器 二 生成dump转储文件 1,制造问题 2,创建dump文件 三 分析dump文件 1,创建一个用 ...

  5. iOS开发之Crash分析,以及收集

    一  先谈谈iOS的Crash收集方式: 1. APP 发生crash,用户手机手机上肯定会有crash纪录,当然删除了该app,或是删了再装 crash纪录还是没了. 2. 如果用户设置-隐私  同 ...

  6. 线上centos6出现软死锁 kernel:BUG: soft lockup

    线上centos6出现软死锁 kernel:BUG: soft lockup 今天线上一台centos6机器用xshell一直连接不上,然后在xshell上显示 Message from syslog ...

  7. 利用BLKTRACE分析IO性能

    在Linux系统上,如果I/O发生性能问题,有没有办法进一步定位故障位置呢?iostat等最常用的工具肯定是指望不上的,[容易被误读的iostat]一文中解释过await表示单个I/O所需的平均时间, ...

  8. 利用 SPICE 分析理解心电图前端中的右腿驱动

      [导读] 心电图(ECG)学是一门将心脏离子去极(ionic depolarization) 后转换为分析用可测量电信号的科学.模拟电子接口到电极/患者设计中最为常见的难题之一便是优化右腿驱动 ( ...

  9. Java性能调优:利用JMC分析性能

    Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JMC分析 ...

随机推荐

  1. Python入门介绍

    Python入门介绍(人生苦短,我用 Python) Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹 ...

  2. Centos7下安装OpenLDAP+Phpldapadmin及主主同步

    1.环境介绍及初始化准备 server1:172.16.138.87 openldap01 server2:172.16.138.88 openldap02 配置yum源 wget -O /etc/y ...

  3. Hadoop记录-NameNode优化

    1.NameNode启动过程 加载FSImage: 回放EditLog: 执行CheckPoint(非必须步骤,结合实际情况和参数确定,后续详述): 收集所有DataNode的注册和数据块汇报. 采用 ...

  4. C#设计模式(1)——简单工厂模式

    1.什么是简单工厂 现实中的工厂负责生产产品,顾名思义,编程中的简单工厂就是一个生产对象的类,它的主要作用是创建具体的产品类实例.我们以一个生产鼠标为例来分析简单工厂的作用,鼠标有两种:戴尔鼠标和惠普 ...

  5. Web APi入门之Self-Host寄宿及路由原理

    前言 刚开始表面上感觉Web API内容似乎没什么,也就是返回JSON数据,事实上远非我所想,不去研究不知道,其中的水还是比较深,那又如何,一步一个脚印来学习都将迎刃而解. Self-Host 我们知 ...

  6. IDEA之debug的坑

    IDEA是一款火热的开发工具.debug谁都会,很简单?NO 一次不正常的关机,导致第二条上班debug失效,浪费两个小时.特做此记录. 1.如下图点击View Breakpoints进入可以到你设置 ...

  7. HDU 6345(子串查询 暴力)

    题意是每组给定一个字符串,在有限查询次数内输出所要查询区间的字典序最小的子串个数. 字典序最小的子串,就是所查询区间中字典序最小的单个字符,问题就转化成了求一段区间内字典序最小的字符个数. 开始时盲目 ...

  8. 三十一、Linux 进程与信号——SIGCHLD 信号、kill和raise函数以及alarm函数

    31.1 SIGCHLD 信号 子进程状态发生变化(子进程结束)产生该信号,父进程需要使用 wait 调用来等待子进程结束并回收它. 避免僵尸进程 #include <stdio.h> # ...

  9. bzoj 3620 暴力KMP

    十分暴力的KMP,枚举左端点,在向右侧推进的同时,取较小的la保证条件,n方暴力 #include<bits/stdc++.h> #define rep(i,j,k) for(int i= ...

  10. 卷积中的full、same、valid

    通常用外部api进行卷积的时候,会面临mode选择. 本文清晰展示三种模式的不同之处,其实这三种不同模式是对卷积核移动范围的不同限制. 设 image的大小是7x7,filter的大小是3x3     ...