用strace查找进程卡死的原因分析
目录
- 用strace查找进程卡死原因
- 首先我们用ps auxf
- 然后我们进一步通过
- 这里可以看到死在了系统回调read这里
- 分割线,后面再次出现这个问题
- 继续用strace -p 27678跟踪
- 接着我们cd /proc/27678/
- 查看进程的内核堆栈的调试信息
- 现在我们查看一下进程打开的文件描述符14代表什么
- 其实在这里我们也可以使用lsof来定位
- 也可以直接查看进程27678打开的
- 总结
用strace查找进程卡死原因
最近遇到进程卡死的情况,但是自己调试的过程中并不一定能复现,都是需要运行一段时间某些条件下才会触发,对于这种运行着不能破坏现场的情况,我们可以使用gdb -p和strace -p来跟踪。
首先我们用ps auxf
查看我们的进程执行到了哪一步:

可以看到执行到了docker exec -i 178.20.1.229_0115034556 ls然后就卡死了
然后我们进一步通过
strace查看执行这个操作死在哪个系统回调了:

这里可以看到死在了系统回调read这里
描述符19的具体意义我们可以进入/proc/pid/fd再查看一下:

我们可以发现,19代表的是pipe,我们这里是死在了读pipe上面。
/************************************************/
分割线,后面再次出现这个问题
我们先用ps auxf查看进程号和进程执行到了哪一步,可以看到进程号是27678,卡在docker exec
root 27678 0.3 0.4 512172 16500 Sl python /wns/cloud/app/com_host/main.pyc root 25011 0.0 0.0 4332 652 S \_ /bin/sh -c docker exec -i mongo_docker_master ls root 25014 0.0 0.2 136592 10600 Sl \_ docker exec -i mongo_docker_master ls
继续用strace -p 27678跟踪
发现卡在read,文件描述符是14
root@localhost:/# strace -p 27678 Process 27678 attached read(14,
接着我们cd /proc/27678/
在这里我们可以查看进程状态
root@localhost:/proc/27678# cat status Name: python State: S (sleeping) Tgid: 27678 Ngid: 0 Pid: 27678 PPid: 27677
查看进程的内核堆栈的调试信息
wchan表示导致进程睡眠或者等待的函数
root@localhost:/proc/27678# cat stack [] pipe_wait+0x6b/0x90 [ ] pipe_read+0x344/0x4f0 [ ] do_sync_read+0x7f/0xb0 [ ] vfs_read+0xb1/0x130 [ ] SyS_read+0x80/0xe0 [ ] system_call_fastpath+0x16/0x1b [ ] 0xffffffffffffffff root@localhost:/proc/27678# cat wchan pipe_wait
现在我们查看一下进程打开的文件描述符14代表什么
pipe文件
root@localhost:/proc/27678# ls -l ./fd total 0 lr-x------ 1 root root 64 Mar 26 17:19 0 -> pipe:[30690124] l-wx------ 1 root root 64 Mar 26 17:19 1 -> pipe:[30690125] lrwx------ 1 root root 64 Mar 26 17:19 10 -> socket:[30691732] lr-x------ 1 root root 64 Mar 26 17:19 11 -> /dev/urandom lrwx------ 1 root root 64 Mar 26 17:19 12 -> socket:[30719611] lrwx------ 1 root root 64 Mar 26 17:19 13 -> socket:[30719610] lr-x------ 1 root root 64 Mar 26 17:19 14 -> pipe:[38483750]
我们已经可以确定main创建子进程执行shell命令docker exec -i mongo_docker_master ls,同时通过pipe和子进程通信,结果卡在了read pipe上。
其实在这里我们也可以使用lsof来定位
可以看到进程27678打开的FD 14是pipe,这里u代表可读可写,r代表可读
sangfor ~ # lsof -d 14 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mongod 1907 root 14u REG 251,0 36864 130683 /wns/data/mongodb/db/collection-7--588642557116981989.wt syslog-ng 3446 root 14u unix 0xffff88012227d800 0t0 40557736 /dev/log dockerd 4025 root 14u unix 0xffff8800b8d5d800 0t0 13941 /run/docker/libnetwork/a73bd949b5fbb89c2b8bec3b4ac6af0a948a944958c8b037d9e6c9b324b44331.sock docker-co 9382 root 14u 0000 0,9 0 9553 anon_inode docker-co 21204 root 14u 0000 0,9 0 9553 anon_inode python 27678 root 14r FIFO 0,8 0t0 38483750 pipe
也可以直接查看进程27678打开的
可以看到14是pipe
sangfor ~ # lsof -p 27678 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME python 27678 root 0r FIFO 0,8 0t0 30690124 pipe python 27678 root 1w FIFO 0,8 0t0 30690125 pipe python 27678 root 2w FIFO 0,8 0t0 30690126 pipe python 27678 root 3u 0000 0,9 0 9553 anon_inode python 27678 root 4u 0000 0,9 0 9553 anon_inode python 27678 root 5u pack 30691718 0t0 unknown type=SOCK_RAW python 27678 root 6w REG 251,0 76106652 130565 /wns/data/com_host/etc/config/err.log python 27678 root 7u IPv4 30691716 0t0 TCP Sangfor:53102->Sangfor:42457 (ESTABLISHED) python 27678 root 8u IPv4 30691717 0t0 TCP Sangfor:42457->Sangfor:53102 (ESTABLISHED) python 27678 root 9u IPv4 30691731 0t0 TCP db.sdwan:54072->sdwan.io:27017 (ESTABLISHED) python 27678 root 10u IPv4 30691732 0t0 TCP db.sdwan:54074->sdwan.io:27017 (ESTABLISHED) python 27678 root 11r CHR 1,9 0t0 30690329 /dev/urandom python 27678 root 12u IPv4 30719611 0t0 TCP db.sdwan:51404->db.sdwan:37017 (ESTABLISHED) python 27678 root 13u IPv4 30719610 0t0 TCP db.sdwan:47124->db.sdwan:27017 (ESTABLISHED) python 27678 root 14r FIFO 0,8 0t0 38483750 pipe
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇:nginx location指令(匹配顺序匹配冲突)实战示例详解
栏 目:其它服务器
本文标题:用strace查找进程卡死的原因分析
本文地址:https://zz.feitang.co/server/29857.html
您可能感兴趣的文章
- 12-20Kubernetes中使用临时容器进行故障排查的方法
- 12-20Nginx设置HTTPS的方法步骤
- 12-20二进制方式安装 Kubernetes1.18.3版本实现脚本
- 12-20Nginx工作模式及代理配置的使用细节
- 12-20ZooKeeper分布式协调服务设计核心概念及安装配置
- 12-20Kubernetes部署可视化地图的十个步骤
- 12-20关于docker清理Overlay2占用磁盘空间的问题(亲测有效)
- 12-20Docker compose配置文件写法及命令使用示例
- 12-20openwrt安装docker并启动的操作方法
- 12-20云原生Kubernetes初始化容器Init使用教程


阅读排行
推荐教程
- 12-07一文教你怎么选择Tomcat对应的JDK版本
- 12-07新版Eclipse集成Tomcat时找不到server选项的解决方法
- 12-06IIS7 应用程序池自动回收关闭的解决方案
- 12-05Windows Server 2019安装VMware
- 12-05Windows服务器默认IE浏览器无法下载文件的解决方法
- 12-05Docker安装Jenkins全过程
- 12-19Zabbix SAML SSO 登录绕过漏洞的操作流程
- 12-15Docker-Compose搭建Spark集群的实现方法
- 12-14Docker Desktop无法正常启动解决(failed to start...)
- 12-14k8s 与docker空间使用分析与清理方法





