北京中科医院都是假的 https://m.39.net/baidianfeng/a_5212076.html之前有段时间实验室服务器运行的python程序经常被kill掉,同学的NLP实验无法进行。我经过一波操作之后发现了问题,修复了机器。这篇文章是对当时诊断和修复的复盘,并介绍相应的诊断工具。好奇怪,程序怎么挂了由于当时情景难以复现,我手动模拟当时情况。使用python启动程序,大约过来十几秒钟时间,发现程序打印出killed,然后退出了,如下所示:~python3test.pyKilledwhat!重试多次,依然如此。这种每次已启动没多久就挂掉应该不是人为的。使用strace追踪一下strace常用来跟踪进程执行时的系统调用和所接收的信号。在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须通过系统调用,借助于内核来完成。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。Linux上最常用的命令ls,用来查看指定目录下面的内容,我们用strace来看看发生了哪些系统调用。~stracelsexecve(/usr/bin/ls,[ls],0x7ffecaafb/*51vars*/)=0brk(NULL)=0x55dcfarch_prctl(0x/*ARCH_???*/,0x7fffb57aba10)=-1EINVAL(Invalidargument)access(/etc/ld.so.preload,R_OK)=-1ENOENT(Nosuchfileordirectory)openat(AT_FDCWD,/etc/ld.so.cache,O_RDONLY
O_CLOEXEC)=3fstat(3,{st_mode=S_IFREG
,st_size=,...})=0mmap(NULL,,PROT_READ,MAP_PRIVATE,3,0)=0x7fdc...这里execve是加载可执行文件,将/usr/bin/ls路径下的可执行加载到内存。brk一般是修改堆顶,在申请内存时候使用,access用于文件何查,等等。系统调用是内核的进出口,通过这些系统调用大致能猜出程序发送了什么。除了strace+命令常见使用方式。strace还可以追踪一个活着的进程。采用-p参数指定进程Id。如下代码块所示。~sudostrace-pstrace:Processattachedselect(0,NULL,NULL,NULL,{tv_sec=59,tv_usec=}我们来跟踪一下python程序,看看到底发生了什么。~sudostrace-pstrace:Processattachedselect(0,NULL,NULL,NULL,{tv_sec=59,tv_usec=})=0(Timeout)select(0,NULL,NULL,NULL,{tv_sec=,tv_usec=0}unfinished...)=?+++killedbySIGKILL+++最后显示killedbySIGKILL。通过查资料发现,原来程序收到kill-9这个信号。程序死因终于找到了,可是谁发出的这个信号,到底是谁干的!接下来如何追踪。插个探针看看我们在动态追踪技术原理里面讲到一些探针技术。这些技术看上去挺底层的,实际上都有前端工具。今天我们使用的是BCC软件包,首先要安装BCC(
转载请注明:http://www.aierlanlan.com/cyrz/7273.html