Linux性能优化-不可中断和僵尸进程


进程的状态
R,表示进程正在CPU就绪队列中,正在运行或正在等待运行
D,不可中断状态睡眠,一般表示进程正在跟硬件交互,并且交互过程中不允许被其他进程或中断打断
Z,是僵尸进程,子进程结束了但相应资源还没被父进程回收
S,是可中断状态睡眠,表示进程正在等待某个事件而被系统挂Q,当进程等待的事件发生时会进入R状态
I,是idle的缩写就是空闲进程,用在不可中断睡眠的内核线程上,硬件交互导致的不可中断进程用D表示,但对
   某些内核线程来说,他们有可能实际上并没有任何负载,用Idle正式为了区分这种情况,注意D状态
   的进程会导致平均负载升高,I状态的进程不会
T,stopped或者trace的缩写,表示进程处于暂停或跟踪状态,向一个进程法送SIGSTOP他就会影响这个状态,
   再发送SIGCONT信号,又会变成恢复状态,用gdb打断点就会使这个进程变成t状态
X,表示进程已经消亡,所以不会在top或者ps中看到ta

man ps的结果
 

PROCESS STATE CODES
       Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a
       process.
       D    Uninterruptible sleep (usually IO)
       R    Running or runnable (on run queue)
       S    Interruptible sleep (waiting for an event to complete)
       T    Stopped, either by a job control signal or because it is being traced.
       W    paging (not valid since the 2.6.xx kernel)
       X    dead (should never be seen)
       Z    Defunct ("zombie") process, terminated but not reaped by its parent.

       For BSD formats and when the stat keyword is used, additional characters may be displayed:
       <    high-priority (not nice to other users)
       N    low-priority (nice to other users)
       L    has pages locked into memory (for real-time and custom IO)
       s    is a session leader
       l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
       +    is in the foreground process group

不可中断进程是为了保证进程数据与硬件状态一直,在正常情况下,不可中断在很短时间内就会结束,所以
短时间的不可中断可以忽略
但如果系统或硬件发生了故障,进程可能会在不可中断状态保持很久,甚至导致系统中出现大量不可中断进程,
这时,就需要注意了,系统是不是出现了I/O性能问题

僵尸进程,父进程没有及时回收导致的
子进程结束后会向父进程法送SIGCHLD信号,父进程接受此信号后会回收
父进程也可以屏蔽这个信号,让init去处理


进程组 和 会话
进程组 表示一组相互关联的进程,比如每个子进程都是父进程所在组的成员
会话   是指共享同一个控制终端的一个或多个进程组
通过SSH登录服务器,打开一个控制终端TTY,这个控制终端就对应一个会话,在终端中运行的命令以及他们的子进程就够成了一个个的进程组,其中在后台运行的命令构成后台进程组,在前台运行的命令构成前台进程组


iowait高不一定代表I/O有性能瓶颈,当系统中只有I/O类型的进程在运行时,iowait也会很高,但实际上,磁盘的读写远没有达到性能瓶颈的程序
因此,碰到iowait升高时,需要先用dstat,pidstat等工具,确认是不是磁盘I/O的问题,然后再找到是哪些进程导致了I/O问题

等待I/O的进程一般是不可中断状态,所以用ps命令找到D状态(不可中断状态)的进程,多位可疑进程
如果是僵尸进程,可疑用perf工具,来分析系统的CPU时钟事件,在参考的例子中,是直接I/O导致的问题
对应源码找到位置中的问题
僵尸进程可以用perf top,再加上pstree找出父进程,检查wait/waitpid调用,或者SIGCHLD信号处理函数注册

参考

iowait 使用率过高案例

猜你喜欢

转载自blog.csdn.net/hixiaoxiaoniao/article/details/85067249