用strace查找進(jìn)程卡死的原因分析
用strace查找進(jìn)程卡死原因
最近遇到進(jìn)程卡死的情況,但是自己調(diào)試的過(guò)程中并不一定能復(fù)現(xiàn),都是需要運(yùn)行一段時(shí)間某些條件下才會(huì)觸發(fā),對(duì)于這種運(yùn)行著不能破壞現(xiàn)場(chǎng)的情況,我們可以使用gdb -p和strace -p來(lái)跟蹤。
首先我們用ps auxf
查看我們的進(jìn)程執(zhí)行到了哪一步:
可以看到執(zhí)行到了docker exec -i 178.20.1.229_0115034556 ls然后就卡死了
然后我們進(jìn)一步通過(guò)
strace查看執(zhí)行這個(gè)操作死在哪個(gè)系統(tǒng)回調(diào)了:
這里可以看到死在了系統(tǒng)回調(diào)read這里
描述符19的具體意義我們可以進(jìn)入/proc/pid/fd再查看一下:
我們可以發(fā)現(xiàn),19代表的是pipe,我們這里是死在了讀pipe上面。
/************************************************/
分割線,后面再次出現(xiàn)這個(gè)問(wèn)題
我們先用ps auxf查看進(jìn)程號(hào)和進(jìn)程執(zhí)行到了哪一步,可以看到進(jìn)程號(hào)是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
繼續(xù)用strace -p 27678跟蹤
發(fā)現(xiàn)卡在read,文件描述符是14
root@localhost:/# strace -p 27678 Process 27678 attached read(14,
接著我們cd /proc/27678/
在這里我們可以查看進(jìn)程狀態(tài)
root@localhost:/proc/27678# cat status Name: python State: S (sleeping) Tgid: 27678 Ngid: 0 Pid: 27678 PPid: 27677
查看進(jìn)程的內(nèi)核堆棧的調(diào)試信息
wchan表示導(dǎo)致進(jìn)程睡眠或者等待的函數(shù)
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
現(xiàn)在我們查看一下進(jìn)程打開(kāi)的文件描述符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]
我們已經(jīng)可以確定main創(chuàng)建子進(jìn)程執(zhí)行shell命令docker exec -i mongo_docker_master ls,同時(shí)通過(guò)pipe和子進(jìn)程通信,結(jié)果卡在了read pipe上。
其實(shí)在這里我們也可以使用lsof來(lái)定位
可以看到進(jìn)程27678打開(kāi)的FD 14是pipe,這里u代表可讀可寫(xiě),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
也可以直接查看進(jìn)程27678打開(kāi)的
可以看到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
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux上通過(guò)SSH掛載遠(yuǎn)程文件系統(tǒng)方法詳解
在本篇內(nèi)容里小編給大家整理了關(guān)于在Linux上通過(guò)SSH掛載遠(yuǎn)程文件系統(tǒng)的相關(guān)知識(shí)點(diǎn),需要的朋友們跟著學(xué)習(xí)下。2019-03-03詳解CentOS7 FTP服務(wù)搭建(虛擬用戶訪問(wèn)FTP服務(wù))
Liunx外部文件的傳輸,避免不了使用FTP服務(wù),所以現(xiàn)在就整理下,CentOS7環(huán)境下,F(xiàn)TP服務(wù)的搭建。有興趣的可以了解一下。2017-01-01centos 6.9 升級(jí)glibc動(dòng)態(tài)庫(kù)的詳細(xì)過(guò)程
glibc是gnu發(fā)布的libc庫(kù),即c運(yùn)行庫(kù),glibc是linux系統(tǒng)中最底層的api,幾乎其它任何運(yùn)行庫(kù)都會(huì)依賴于glibc。這篇文章主要介紹了centos 6.9 升級(jí)glibc動(dòng)態(tài)庫(kù)的詳細(xì)過(guò)程,需要的朋友可以參考下2019-11-11ubuntu16.04自動(dòng)設(shè)置行號(hào)的步驟詳解
這篇文章主要介紹了ubuntu16.04自動(dòng)設(shè)置行號(hào)的步驟,文中給大家提到了Ubuntu vi設(shè)置行號(hào)的方法,感興趣的朋友跟隨腳本之家小編一起看看吧2018-08-08Deepin系統(tǒng)中g(shù)rub配置的說(shuō)明和修改方式
GRUB是一種多操作系統(tǒng)啟動(dòng)程序,主配置文件位于/boot/grub/grub.cfg,但通常通過(guò)編輯/etc/default/grub文件來(lái)修改配置,該文件允許用戶設(shè)置默認(rèn)啟動(dòng)操作系統(tǒng)、啟動(dòng)超時(shí)時(shí)間等,修改后需運(yùn)行特定命令更新配置2024-09-09CentOS 6/7環(huán)境下通過(guò)yum安裝php7的方法
這篇文章主要介紹了CentOS 6/7環(huán)境下通過(guò)yum安裝php7的方法,簡(jiǎn)單分析了CentOS 6/7服務(wù)器環(huán)境下使用yum安裝php7的相關(guān)命令與操作步驟,需要的朋友可以參考下2018-03-03Linux下php連接SQLServer 2000數(shù)據(jù)庫(kù)的配置方法
Linux服務(wù)器中的php程序能夠連接到Windows服務(wù)器中的SQL Server 2000數(shù)據(jù)庫(kù),這里分享下配置方法,需要的朋友可以參考下2013-06-06