用strace查找进程卡死的原因分析

 更新时间:2023年06月21日 09:39:47   作者:SoulNov23  
这篇文章主要介绍了用strace查找进程卡死的原因分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

用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 
[<ffffffff811a91ab>] pipe_wait+0x6b/0x90
[<ffffffff811a9c04>] pipe_read+0x344/0x4f0
[<ffffffff811a00bf>] do_sync_read+0x7f/0xb0
[<ffffffff811a0681>] vfs_read+0xb1/0x130
[<ffffffff811a1110>] SyS_read+0x80/0xe0
[<ffffffff818d4c49>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • linux 服务器安装gcc8的问题记录

    linux 服务器安装gcc8的问题记录

    我原本安装了gcc13.0版本,但是版本太高了,导致我安装cuda报错gcc版本太高,所以就安装低版本的gcc,下面通过本文给大家分享linux 服务器安装gcc8的问题记录,感兴趣的朋友一起看看吧
    2024-07-07
  • Linux上通过SSH挂载远程文件系统方法详解

    Linux上通过SSH挂载远程文件系统方法详解

    在本篇内容里小编给大家整理了关于在Linux上通过SSH挂载远程文件系统的相关知识点,需要的朋友们跟着学习下。
    2019-03-03
  • Linux shell利用sed如何批量更改文件名详解

    Linux shell利用sed如何批量更改文件名详解

    最近在学习shell,为了练习sed,写了个简单的批量修改文件名的脚本,所以下面这篇文章主要给大家介绍了关于Linux shell利用sed如何批量更改文件名的相关资料,需要的朋友们可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • 详解CentOS7 FTP服务搭建(虚拟用户访问FTP服务)

    详解CentOS7 FTP服务搭建(虚拟用户访问FTP服务)

    Liunx外部文件的传输,避免不了使用FTP服务,所以现在就整理下,CentOS7环境下,FTP服务的搭建。有兴趣的可以了解一下。
    2017-01-01
  • centos8 安装 nginx的详细教程(图文)

    centos8 安装 nginx的详细教程(图文)

    Nginx是一个web服务器也可以用来做负载均衡及反向代理使用,目前使用最多的就是负载均衡,这篇文章主要介绍了centos8 安装 nginx ,需要的朋友可以参考下
    2019-11-11
  • centos 6.9 升级glibc动态库的详细过程

    centos 6.9 升级glibc动态库的详细过程

    glibc是gnu发布的libc库,即c运行库,glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。这篇文章主要介绍了centos 6.9 升级glibc动态库的详细过程,需要的朋友可以参考下
    2019-11-11
  • ubuntu16.04自动设置行号的步骤详解

    ubuntu16.04自动设置行号的步骤详解

    这篇文章主要介绍了ubuntu16.04自动设置行号的步骤,文中给大家提到了Ubuntu vi设置行号的方法,感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-08-08
  • Deepin系统中grub配置的说明和修改方式

    Deepin系统中grub配置的说明和修改方式

    GRUB是一种多操作系统启动程序,主配置文件位于/boot/grub/grub.cfg,但通常通过编辑/etc/default/grub文件来修改配置,该文件允许用户设置默认启动操作系统、启动超时时间等,修改后需运行特定命令更新配置
    2024-09-09
  • CentOS 6/7环境下通过yum安装php7的方法

    CentOS 6/7环境下通过yum安装php7的方法

    这篇文章主要介绍了CentOS 6/7环境下通过yum安装php7的方法,简单分析了CentOS 6/7服务器环境下使用yum安装php7的相关命令与操作步骤,需要的朋友可以参考下
    2018-03-03
  • Linux下php连接SQLServer 2000数据库的配置方法

    Linux下php连接SQLServer 2000数据库的配置方法

    Linux服务器中的php程序能够连接到Windows服务器中的SQL Server 2000数据库,这里分享下配置方法,需要的朋友可以参考下
    2013-06-06

最新评论