转自: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. SpringMVC简单项目配置

    一.首先,SpringMVC框架使用分层开发,分层是为了实现“高内聚,低耦合”.采用“分而治之”的思想,把问题划分开来各个解决,易于控制,延展和分配资源,最重要的是有利于后期项目维护.MVC是指Mod ...

  2. ES DSL 基础查询语法学习笔记

    1.查询数量 1 2 3 4 5 6 7 curl -XGET 'http://192.168.6.97:9200/_count?pretty' -d ' {     "query" ...

  3. 利用salt搭建hadoop集群

    自动化工具有很多..今天总结一下salt安装hadoop 步骤,学习过程. 1,机器列表 hosts文件    只需要将namenode的两台机器上配置 ,不解释了. 2.salt-master在10 ...

  4. cmd 开启热点

    开启热点,需要先打开Wifi,ssid 为 WiFi 名称,key 为密码 netsh wlan set hostednetwork mode=allow ssid=123 key=12345678 ...

  5. python 面向对象(三)类与类之间的关系 初始化方法一些类

    ###################总结################# 面试的时候 让写python一些特殊方法 __init__ 创建对象的时候初始化 __new__对象实例化调用第一个方法 ...

  6. Kafka技术内幕 读书笔记之(六) 存储层——服务端处理读写请求、分区与副本

    如下图中分区到 日 志的虚线表示 : 业务逻辑层的一个分区对应物理存储层的一个日志 . 消息集到数据文件的虚线表示 : 客户端发送的消息集最终会写入日志分段对应的数据文件,存储到Kafka的消息代理节 ...

  7. gcc编译出现dlopen、dlerror、dlsym、dlcolse的解决方法

      ➜  test_sqlite3 gcc *.c -I . -o xixi -pthread      /tmp/cckGKTrr.o: In function `unixDlOpen': sqli ...

  8. zepto.min.js

    /* Zepto v1.1.3 - zepto event ajax form ie - zeptojs.com/license */var Zepto=function(){function L(t ...

  9. golang实现tcp编程

    实现简单的tcp服务 package main import ( "fmt" "net" ) func main() { fmt.Println("服 ...

  10. 标签中的onclick调用js方法传递多个参数的解决方案

    1.JS方法 <script type="text/javascript"> funcation cc(parameter1,parameter2,parameter3 ...