[deadlock]死锁导致的设备登录无响应问题
[deadlock]死锁导致的设备登录无响应问题
- 一、问题现象
- 二、初步观察
- 三、继续深挖
- 查看netlink相关信息
- 查看warnd进程栈
- 四、再接再厉
- 查看warnd 用户栈
- 后记
一、问题现象
实验室一台压力测试设备突然无法登录,无论web页面,ssh或者telnet登录,都是输入用户名密码后卡在哪里,无法进入管理页面。
如果这样子的话,根本无法调试。幸运的是,有个之前就打开的shell窗口可以使用。这给我们分析调试提供了方便。
二、初步观察
在shell中查看现存和hang住的命令行进程,看看有什么线索。
/var/log# ps | grep cli2812 root 720m S cli admin 1 admin telnet(10.10.20.11)
15126 root 720m S cli admin 1 admin telnet(10.10.20.11)
15264 root 720m S cli admin 0 admin console
21947 root 16448 S grep cli
这里有3个cli进程,有除了2812是我们当前在使用的,剩下两个都是无响应的。查看进程的内核栈信息。
/var/log# cat /proc/15264/stack
[<ffffffff8080a819>] netlink_attachskb+0x189/0x1d0
[<ffffffff8080a991>] netlink_unicast+0xa1/0x1f0
[<ffffffff8080ad81>] netlink_sendmsg+0x1c1/0x3e0
[<ffffffff80799b8a>] sock_sendmsg+0x1a/0x30
[<ffffffff8079a376>] ___sys_sendmsg+0x1e6/0x200
[<ffffffff8079b404>] SyS_sendmsg+0x44/0x80
[<ffffffff802016d5>] do_syscall_64+0x75/0x2c0
[<ffffffff80c0008d>] entry_SYSCALL_64_after_hwframe+0x59/0xbe
[<ffffffffffffffff>] 0xffffffffffffffff
/var/log# cat /proc/15126/stack
[<ffffffff8080a819>] netlink_attachskb+0x189/0x1d0
[<ffffffff8080a991>] netlink_unicast+0xa1/0x1f0
[<ffffffff8080ad81>] netlink_sendmsg+0x1c1/0x3e0
[<ffffffff80799b8a>] sock_sendmsg+0x1a/0x30
[<ffffffff8079a376>] ___sys_sendmsg+0x1e6/0x200
[<ffffffff8079b404>] SyS_sendmsg+0x44/0x80
[<ffffffff802016d5>] do_syscall_64+0x75/0x2c0
[<ffffffff80c0008d>] entry_SYSCALL_64_after_hwframe+0x59/0xbe
[<ffffffffffffffff>] 0xffffffffffffffff
/var/log# cat /proc/2812/stack
[<ffffffff80255f6a>] do_wait+0x1aa/0x210
[<ffffffff802570f7>] kernel_wait4+0x97/0x120
[<ffffffff802571ef>] SyS_wait4+0x6f/0x80
[<ffffffff802016d5>] do_syscall_64+0x75/0x2c0
[<ffffffff80c0008d>] entry_SYSCALL_64_after_hwframe+0x59/0xbe
[<ffffffffffffffff>] 0xffffffffffffffff
可以发现 15126和15264进程都卡在了 netlink发送等待上。怀疑netlink socket收包队列有积压,导致发送端处于等待发送状态。
三、继续深挖
查看netlink相关信息
/var/log# cat /proc/net/netlink
sk Eth Pid Groups Rmem Wmem Dump Locks Drops Inode
ffff88880b2cb000 0 2851 00000000 0 0 0 2 0 12002
ffff888806d6e800 0 2707076566 00000000 0 0 0 2 0 12784
ffff888806d6a000 0 3780 00000551 0 0 0 2 0 12810
ffff88885a980000 0 0 00000000 0 0 0 2 0 3
ffff88880a1b6000 0 2825818928 00000111 0 0 0 2 0 20919
ffff888806d6d800 0 3498 00000111 0 0 0 2 0 12783
ffff88880c210000 0 3410172620 00000000 0 0 0 2 0 12811
ffff88880b2cb800 0 2855 00000001 0 0 0 2 0 11851
ffff88880a5bf800 15 10000038 00000000 33557184 0 0 27 0 1652 --问题socket
//省略部分无关socket
发现socket ffff88880a5bf800 存在大量积压,基本确认是积压导致。
根据Eth 15 和Pid 10000038 ,对照代码发现是发送和接收告警信息的socket,负责接收处理的进程是warnd。
查看warnd进程栈
/var/log# ps | grep warnd2849 root 2325m S /bin/warnd
22135 root 16448 S grep warnd
/var/log# cat /proc/2849/stack
[<ffffffff802bfe03>] futex_wait_queue_me+0xc3/0x120
[<ffffffff802c01e2>] futex_wait+0x102/0x230
[<ffffffff802c275e>] do_futex+0x14e/0xc30
[<ffffffff802c32ab>] SyS_futex+0x6b/0x140
[<ffffffff802016d5>] do_syscall_64+0x75/0x2c0
[<ffffffff80c0008d>] entry_SYSCALL_64_a
发现warnd在等待futex 锁,是那个操作导致的呢,这就需要查看用户态的调用栈了。
四、再接再厉
查看warnd 用户栈
用gdb attach上warnd进程,查看当前栈
/var/log# gdb
GNU gdb (GDB) 11.2
Copyright (C) 2022 Free Software Foundation, Inc.
//省略无关部分
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) attach 2849
Attaching to process 2849
[New LWP 2945]
[New LWP 2946]
[New LWP 2947]
//省略无关部分
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
0x00007fcab97e4059 in ?? () from /lib/libc.so.6
(gdb) info threadId Target Id Frame
* 1 Thread 0x7fcab8929800 (LWP 2849) "warnd" 0x00007fcab97e4059 in ?? () from /lib/libc.so.62 Thread 0x7fcab8924640 (LWP 2945) "warnd" 0x00007fcab97e4059 in ?? () from /lib/libc.so.63 Thread 0x7fcab8123640 (LWP 2946) "warnd" 0x00007fcab97e4059 in ?? () from /lib/libc.so.64 Thread 0x7fcab7922640 (LWP 2947) "warnd" 0x00007fcab97e4059 in ?? () from /lib/libc.so.6
//省略无关部分34 Thread 0x7fcaa802b640 (LWP 8217) "warnd" 0x00007fcab97e4059 in ?? () from /lib/libc.so.635 Thread 0x7fcaa782a640 (LWP 8238) "warnd" 0x00007fcab9868add in sendmsg () from /lib/libc.so.636 Thread 0x7fcaa7029640 (LWP 8245) "warnd" 0x00007fcab97e4059 in ?? () from /lib/libc.so.637 Thread 0x7fcaa611f640 (LWP 8260) "warnd" 0x00007fcab97e4059 in ?? () from /lib/libc.so.638 Thread 0x7fcaa590d640 (LWP 8267) "warnd" 0x00007fcab97e4059 in ?? () from /lib/libc.so.639 Thread 0x7fcaa510c640 (LWP 8268) "warnd" 0x00007fcab9867196 in epoll_wait () from /lib/libc.so.6
除了线程35和39外,其他线程全部卡在相同的位置。
查看线程1,可以知道系统调用线程读写锁的写锁时因为得不到调度进入了休眠。那么这个锁被那个线程占有了呢?
(gdb) thread 1
[Switching to thread 1 (Thread 0x7fcab8929800 (LWP 2849))]
#0 0x00007fcab97e4059 in ?? () from /lib/libc.so.6
(gdb) bt full
#0 0x00007fcab97e4059 in ?? () from /lib/libc.so.6
No symbol table info available.
#1 0x00007fcab97ed4f1 in pthread_rwlock_wrlock () from /lib/libc.so.6
No symbol table info available.
#2 0x000000000040d5d3 in ?? ()
No symbol table info available.
#3 0x0000000000404ad9 in ?? ()
No symbol table info available.
#4 0x00007fcab978b1f7 in ?? () from /lib/libc.so.6
No symbol table info available.
#5 0x00007fcab978b2ac in __libc_start_main () from /lib/libc.so.6
No symbol table info available.
#6 0x0000000000404b01 in ?? ()
No symbol table info available.
我们再查看看35线程。通过查看代码发现,在sendmsg之前,线程已经持通过pthread_rwlock_wrlock 持有了写锁。也就是其他线程都在等待35线程释放写锁。那么35线程为什么不释放写锁呢?
(gdb) thread 35
[Switching to thread 35 (Thread 0x7fcaa782a640 (LWP 8238))]
#0 0x00007fcab9868add in sendmsg () from /lib/libc.so.6
(gdb) bt full
#0 0x00007fcab9868add in sendmsg () from /lib/libc.so.6
No symbol table info available.
#1 0x00007fcab967f81d in fun_nl_sendto0 () from /lib/libfun_nl_ipc.so
No symbol table info available.
#2 0x00007fcab9b2a61a in send_warn () from /lib/libwarnapi.so
No symbol table info available.
#3 0x00000000004159d0 in ?? ()
No symbol table info available.
#4 0x0000000000415dbc in ?? ()
No symbol table info available.
#5 0x000000000040c9c5 in ?? ()
No symbol table info available.
#6 0x00007fcab9b62067 in ?? () from /lib/libevent.so
No symbol table info available.
#7 0x00007fcab9b62314 in ?? () from /lib/libevent.so
No symbol table info available.
#8 0x00007fcab9b62568 in ?? () from /lib/libevent.so
No symbol table info available.
#9 0x000000000040ca8e in ?? ()
No symbol table info available.
#10 0x00007fcab97e731a in ?? () from /lib/libc.so.6
No symbol table info available.
#11 0x00007fcab9866db0 in clone () from /lib/libc.so.6
查代码发现35线程sendmsg就是向 已经积压的netlink socket 发送warn消息。因为netlink socket积压,导致35线程进入休眠等待。
分析到这里,基本逻辑差不多通顺了。
- 压力测试导致netlink socket积压
- 35线程获取写锁后,向netlink socket发送消息。因为积压导致休眠。
- 其他线程包括netlink socket消息接受处理的线程因为获取不到写锁,导致休眠。
- 此时:线程35发送消息持有写锁,等待netlink socket buffer空闲。处理netlink socket消息的线程,等待写锁。–根因
- cli命令行进程会向warnd发送netlink消息,因为netlink socket消息积压(消息没有得到及时处理),导致发送进程进入等待休眠。
后记
warnd进程主要处理其他进程发来的warn消息,自己也发送warn消息。在锁的处理上不够完善,导致压力测试下,socket接收队列打满后,形成了死锁。
相关文章:
[deadlock]死锁导致的设备登录无响应问题
[deadlock]死锁导致的设备登录无响应问题 一、问题现象二、初步观察三、继续深挖查看netlink相关信息查看warnd进程栈 四、再接再厉查看warnd 用户栈 后记 一、问题现象 实验室一台压力测试设备突然无法登录,无论web页面,ssh或者telnet登录,…...
2024年10月21日计算机网络,乌蒙第一部分
【互联网数据传输原理 |OSI七层网络参考模型】 https://www.bilibili.com/video/BV1EU4y1v7ju/?share_sourcecopy_web&vd_source476fcb3b552dae37b7e82015a682a972 mac地址相当于是名字,ip地址相当于是住址,端口相当于是发送的东西拿什…...
ESlint代码规范
这里写目录标题 ESlint代码规范解决代码规范错误 ESlint代码规范 代码规范:一套写代码的约定规则。例如:“赋值符号左右是否需要空格” “一行代码结束是否要加分号” JavaScript Standard Style规范说明:https://standardjs.com/rules-zhc…...
【Vue.js设计与实现】第三篇第11章:渲染器-快速 Diff 算法-阅读笔记
文章目录 11.1 相同的前置元素和后置元素11.2 判断是否需要进行 DOM 移动操作11.3 如何移动元素11.4 总结 系列目录:【Vue.js设计与实现】阅读笔记目录 非常快的Diff算法。 11.1 相同的前置元素和后置元素 不同于简单 Diff 算法和双端 Diff 算法,…...
材质变体 PSO学习笔记
学习笔记 参考各路知乎大佬文章 首先是对变体的基本认知 概括就是变体是指根据引擎中上层编写(UnityShaderLab/UE连连看)中的各种defines情况,根据不同平台编译成的底层shader,OpenGL-glsl/DX(9-11)-dxbc DX12-dxil/Vulkan-spirv,是打到游…...
2024年【烟花爆竹储存】考试及烟花爆竹储存复审模拟考试
题库来源:安全生产模拟考试一点通公众号小程序 烟花爆竹储存考试参考答案及烟花爆竹储存考试试题解析是安全生产模拟考试一点通题库老师及烟花爆竹储存操作证已考过的学员汇总,相对有效帮助烟花爆竹储存复审模拟考试学员顺利通过考试。 1、【单选题】( …...
文件夹操作
文件夹操作 opendir closedir readdir write(fd,buf,strlen(buf)); return 0; } 作用 : 打开目录 opendir 所有头文件 : #include <sys/types.h> #include <dirent.h> 函数 : DIR *opendir(const char *name); 参数: name :目…...
如何制作一台自己想要的无人机?无人机改装调试技术详解
制作一台符合个人需求的无人机并对其进行改装调试,是一个既具挑战性又充满乐趣的过程。以下是从设计、选购材料、组装、调试到改装的详细步骤: 一、明确需求与设计 1. 明确用途与性能要求: 确定无人机的使用目的,如航拍、比赛、…...
Linux -- 进程间通信、初识匿名管道
目录 进程间通信 什么是进程间通信 进程间通信的一般规律 前言: 管道 代码预准备: 如何创建管道 -- pipe 函数 参数: 返回值: wait 函数 参数: 验证管道的运行: 源文件 test.c : m…...
网站的SSL证书快到期了怎么办?怎么续签?
网站的SSL证书即将到期时,需要续签一个新的证书以保持网站的安全性和信任度。以下是续签SSL证书的一般步骤: 1. 选择证书提供商 如果您之前使用的是免费证书,您可以选择继续使用同一提供商的免费证书服务进行续签。如果您需要更高级别的证书…...
解決爬蟲代理連接的方法
爬蟲在運行過程中常常會遇到代理連接的問題,這可能導致數據抓取的效率降低甚至失敗。 常見的代理連接問題 代理IP失效:這是最常見的問題之一。有些代理IP可能在使用一段時間後失效,導致連接失敗。 連接超時:由於網路不穩定或代…...
Prometheus 监控Harbor
你好!今天分享的是基于Prometheus监控harbor服务。 在之前的文章中分别介绍了harbor基于离线安装的高可用汲取设计和部署。那么,如果我们的harbor服务主机或者harbor服务及组件出现异常,我们该如何快速处理呢? Harbor v2.2及以上…...
SQL 干货 | SQL 半连接
大多数数据库开发人员和管理员都熟悉标准的内、外、左和右连接类型。虽然可以使用 ANSI SQL 编写这些连接类型,但还有一些连接类型是基于关系代数运算符的,在 SQL 中没有语法表示。今天我们将学习一种这样的连接类型:半连接(Semi …...
洛谷 P1226:【模板】快速幂
【题目来源】https://www.luogu.com.cn/problem/P1226【题目描述】 给你三个整数 a,b,p,求 a^b mod p。【输入格式】 输入只有一行三个整数,分别代表 a,b,p。【输出格式】 输出一行一个字符串 a^b mod ps&a…...
nginx常规操作
Linux下查找Nginx配置文件位置 1、查看Nginx进程 ps -aux | grep nginx 圈出的就是Nginx的二进制文件 2、测试Nginx配置文件 /usr/sbin/nginx -t 可以看到nginx配置文件位置 3、nginx的使用(启动、重启、关闭) 首先利用配置文件启动nginx。 nginx -c /usr/local/nginx/conf…...
Docker镜像不能访问
Get "https://registry-1.docker.io/v2/": dial tcp 192.168.10.194:443: connect: connection refused Idea推送镜像至Harbor私服,报以上错误,Docker镜像地址不能访问,更新Harbor服务器Docker镜像地址,重启Docker服务…...
TCP simultaneous open测试
源代码 /*************************************************************************> File Name: common.h> Author: hsz> Brief:> Created Time: 2024年10月23日 星期三 09时47分51秒**********************************************************************…...
Spring 配置文件动态读取pom.xml中的属性
需求: 配置文件中的 spring.profiles.active${env}需要打包时动态绑定。 一、方案: 在pom.xml文件中配置启用占位符替换 <profiles><!-- 本地开发 --><profile><id>dev</id><properties><env>dev</env>…...
Konva 组,层级
代码: <template><div class"rect"><div class"header"> <!-- <el-button type"primary" click"show">展示</el-button>--> <!-- <el-button type"success&quo…...
vue图片加载失败的图片
1.vue图片加载失败的图片 这个问题发生在测试环境和开发本地,线上环境是可以的,测试环境估计被第三方屏蔽了 2.图片有,却加载不出来 <template v-slot:imageUrlsSlots"{ row }"><div class"flexRow rowCenter"&…...
终止,半成收入来自海外,收入可持续性被质疑
芬尼科技终止原因如下:芬尼科技4年期间经历了两次IPO失败,公司半成收入来自海外,然而公司泳池收入面临欧洲地区冲突冲击及德国新节能措施影响。交易所质疑其收入是否具有可持续性。 作者:Eric 来源:IPO魔女 9月25日&a…...
日常记录,使用springboot,vue2,easyexcel使实现字段的匹配导入
目前的需求是数据库字段固定,而excel的字段不固定,需要实现excel导入到一个数据库内。 首先是前端的字段匹配,显示数据库字段和表头字段 读取表头字段: 我这里实现的是监听器导入,需要新建一个listen类。 读Excel …...
Unable to open nested entry ‘********.jar‘ 问题解决
今天把现网版本的task的jar拖回来然后用7-zip打开拖了一个jar进去替换mysql-connector-java-5.1.47.jar 为 mysql-connector-java-5.1.27.jar 启动微服务的时候就报错下面的 Exception in thread "main" java.lang.IllegalStateException: Failed to get nested ar…...
反编译华为-研究功耗联网监控日志
摘要 待机功耗中联网目前已知的盲点:App自己都不知道的push类型的被动联网、app下载场景所需时长、组播联网、路由器打醒AP。 竞品 策略 华为 灭屏使用handler定时检测(若灭屏30分钟内则周期1分钟,否则为2分钟),检…...
线程池——Java
一、前言 在字符串常量池中,字符串常量在java程序运行之前就已经创建好了,等程序运行起来后,就可以直接从常量池中拿到字符串并加载到内存中,这样的设计就省下了字符串的构造与销毁的内存开销。 二、优势 操作系统由内核与应用程…...
java 17天 TreeSet以及Collections
SortedSet TreeSet Collections 所有单值集合 1 SortedSet 特点:有序 唯一 实现类:TreeSet 利用TreeSet特有的对数据进行升序,再放到ArryList进行for下标倒序打印,或者利用自身的pollLast()取出最后元…...
JavaScript 第27章:构建工具与自动化
在现代JavaScript开发中,构建工具、代码转换工具、代码质量和代码格式化工具对于提高开发效率、保持代码整洁以及确保代码质量有着至关重要的作用。下面将分别介绍Webpack、Babel、ESLint和Prettier的配置与使用,并给出一些示例。 1. 构建工具ÿ…...
Android原生ROM出现WIFI显示网络连接受限,网络无法连接的问题
Android原生ROM出现WIFI显示网络连接受限,网络无法连接的问题 最近手里一台乐视的手机root后, 连接wifi时一直提示网络连接受限,wifi图标显示叹号. 但是不影响正常的网络访问. 解决办法: adb shell settings delete global captive_portal_modeadb shell settings put globa…...
如何实现网页上的闪烁效果
在网页上实现闪烁效果通常可以通过CSS或者JavaScript来完成。有两种方法:一种是使用纯CSS,另一种是结合JavaScript来创建更复杂的闪烁效果。 方法一:使用纯CSS CSS中可以使用animation属性来创建简单的动画效果,包括闪烁效果。这…...
事件总线—Event Bus 使用及讲解
一、工作原理 事件总线,主要用来实现非父子组件之间的传值。 它的工作原理:通过new Vue()再创建一个新的 Vue 实例对象bus,将这个新的实例对象作为桥梁,来实现两个组件之间的传值。 二、工作步骤 1、创建事件总线 bus 我们可以…...
wordpress 隐藏模板/全国31省市疫情最新消息今天
今天使用SERVER 2008,做Citrix 5.0实验,一路安装完成后,打开客户端登录,点击发布的应用程序,没任何反应。 查看应用程序日志同时引出31003和30016两个错误,查询CITRIX网站指出是XML服务异常或farm配置不正确导致。检查…...
制作好网站/市场营销策划方案3000字
题目描述 现在棋盘的大小不一定,由p,q给出,并且在棋盘中将出现障碍物(限制马的行动,与象棋走法相同) 输入 第一行输入n表示有n组测试数据。 每组测试数据第一行输入2个整数p,q,表示棋盘的大…...
厦门微信商城网站建设/信息流推广渠道
“… fflush和fpurge将丢弃缓冲区中任何未写入或未读的数据……”:不.> fflush:The function fflush forces a write of all buffered data for the given output or update stream via the stream’s underlying write function. The open status of…...
无锡食品网站设计/免费游戏推广平台
这个例子可以没有表,但是库必须有;没有表通过hibernate的 update配置去创建表 public void test2(){Customer cnew Customer();c.setCustName("赵宇集团");c.setCustAddress("海南省市");c.setCustPhoen("2522700");c.se…...
网站地址解析/免费b站推广网站不用下载
这两天 公司有个需求 需要将原来的python写的图像检测功能改成C版本 之前只是听过opencv 没怎么实际用过,这两天经过一番百度 摸索 终于搭建好了环境 由于之前嵌入式的开发经验,习惯于将这些第三方的库什么的编译成静态库 即.a文件 opencv4 比较折腾&…...
中山市区做网站公司/亚马逊的免费网站
导读:高考专业解读,计算机科学与技术国家重点学科,21所高校获评!计算机科学与技术专业一直以来都是报考的热门,计算机科学与技术(0821)下设3个二级学科081201计算机系统结构;081202计算机软件与理论&#x…...