TOP -H
日常开发中多使用Top 或者Top -H来查看内存和CPU使用情况,一般排查系统崩溃时先考虑的两个命令行是 top -H 或者 df -H,后者是为了查看磁盘占用率。
(也可以使用ps查看正处于Running的进程,ps aux或者 ps -el查看所有的进程)
使用该命令行后会第二行有展示当前线程状态,Running(R), Sleeping(S),Stopped(T)& Zombie(Z)。其中zombie为僵尸线程。 还有一种状态不可中断 uninterruptible sleep (D),没有又在Top -H中展示,需要后续去看下什么原因。
zombie 僵尸线程
1.什么是僵尸进程?
UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,而父进程还没有结束,那么他将变成一个僵尸进程.
如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程,因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程,看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init来接管他,成为他的父进程,从而保证每个进程都会有一个父进程.而Init进程会自动wait其子进程,因此被Init接管的所有进程都不会变成僵尸进程.
2.子进程结束后为什么要进入僵尸状态?
因为父进程可能要取得子进程的退出状态等信息。
3.僵尸状态是每个子进程比经过的状态吗?
是的。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个 子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。
如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。
PSTACK
pstack命令 可显示每个进程的栈跟踪
pstack是gdb的一部分 如果需要可以通过yum install gbd
使用方法
pstack pid
ps -eLo pid,lwp,pcpu |grep pid #