linux 性能自我学习 ———— 不可中断进程和僵尸进程 [四]

Posted 程序员其实就是一个写文档的工作,代码只是文档的一部分,一切皆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 性能自我学习 ———— 不可中断进程和僵尸进程 [四]相关的知识,希望对你有一定的参考价值。

前言

简单介绍一下不可中断进程和僵尸进程。

正文

先来看下进程的状态:

那么这一列的状态是什么呢?

R 是Running 或 Runnable 的缩写, 表示进程在cpu 的就绪队列中,正在运行或者正在等待运行。

D 是disk sleep 的缩写,也就是不可中断睡眠,一般表示进程正在跟硬件交互,并且交互过程不允许其他进程或者中断打断。

Z 是Zombie 的缩写,表示僵尸进程,表示进程已经介绍了,但是父进程还没有回收它的资源

S 是interruptible sleep 缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时, 他会被唤醒并进入R状态

I 是 idle的缩写, 也就是空闲状态,用在不可中断睡眠的内核线程上。前面说了,硬件交互导致不可中断进程用D 表示,但是某些内核线程来说,他们可能实际并没有任何负载,用idle 就是为了区分。

D 状态的进程会导致平均负载升高,i 状态的进程不会。

还有两种状态,一种是T 状态,另外一种是X状态。

X 是状态为死亡,一般看不到。

另外一种是T 状态,表示是stopped 或者 traced 状态。

比如我们进程调试就是T状态,发送一个信号sigstop,然后就会停止。再发送sigcont 信号,这个时候就会继续运行。

该篇的主题是不可中断进程和僵尸进程。

前面结束了,不可中断进程,一般是在进行系统调用。

僵尸进程是怎么样的呢? 僵尸进程在多进程中可能遇到。

正常情况下,当用给进程创建了子进程后,它应该通过系统调用wait() 或者 waitpid() 等待子进程结束,回收子进程资源。

而子进程结束时候,会向父进程发送sigchld信号,所以父进程还可以注册sigchld 信号的畜栏里函数,异步回收资源。

如果父进程没有那么做,或者子进程执行太快。父进程还没来得及处理子进程状态,那么子进程就已经提前推出,那么这个时候子进程就会变成僵尸进程。

通常,僵尸进程持续时间很短,如果父进程一直没有处理子进程的终止,那么就会一直保持运行状态,这个时候就会占用pid 进程号,导致新的进程不能创建。

实验

docker run --privileged --name=app -itd feisky/app:iowait

top 一下:

僵尸进程特别多。

然后我们还发现了,Ss+ 和D+

这个+ 是什么意思呢?

有两个概念。

进程组表示一组相互关联的进程,比如每个子进程都是父进程所在组的成员

会话指共享一个控制终端的一个或者多个进程组。

那么这个时候,我们如何来分析呢?

yum install dstat

当iowait 升高时候,read 会很大,说明iowait 升高跟磁盘的读请求相关,可能是磁盘读导致的。

那么可以使用top 命令,观察d状态的进程。

然后通过pidstat

pidstat -d -p 4344 1 3

发现其并不高。

那么直接用pidstat 查看全部的:

pdistat -d 1 20

发现的确是app导致的。

然后就可以用strace 追踪代码了。

strace -p 6082

这种情况如果是root 用户查看不了的话,那么可能这个进程不存在或者已经Z状态了。

那么这个时候可以使用perf来搞定。

这个时候你就的确发现其在系统读取了。

那么僵尸进程怎么解决呢?

前面已经发现了僵尸进程了。

那么可以找到其父进程:

pstree -aps 3084

可以看到程序还是app进程了。

然后就可以去检查代码部分了。

下一节linux 软中断。

linux查看是不是有某个运行的进程命令

ps命令用于查看系统中的进程状态,格式为:“ps [参数]”;

-a 显示所有的进程(包括其他用户的)

-u 用户以及其他详细信息

-x 显示没有控制终端的进程

Linux系统中时刻运行着许许多多的进程,如果能够合理的管理它们,绝对有益于对系统的性能优化,Linux系统中进程最常见的5种不同的状态是运行、中断、不可中断、僵死与停止,它们的含义分别是:

R(运行):正在运行或在运行队列中等待。

S(中断):休眠中, 在等待某个条件的形成或接收到信号。

D(不可中断):收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。

Z:(僵死):进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。

T:(停止):进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOUlinuxprobe/com/chapter-02,html信号后停止运行。

当执行"ps aux"命令后通常会看到下面格式的进程状态,表格中只是列举了部分输出值,而且正常的输出值中不包括中文注释部分:

参考技术A 查看所有进程:

1.ps -ef
2.ps -aux
e = all processes 显示所有进程
f = full全格式
a = show processes for all users 显示所有用户的进程
u = display the process's user/owner 显示用户
x = also show processes not attached to a terminal 显示无控制终端的进程
查看单个进程是否运行:
ps -ef|grep 进程
ps -aux|grep 进程
ps -ef显示参数详解:
UID 用户ID
PID 进程ID
PPID 父进程ID
C CPU占用率
STIME 开始时间
TTY 开始此进程的TTY
TIME 此进程运行的总时间
CMD 命令名

ps -aux显示参数详解:
PID 进程的ID;
PPID 父进程;
%CPU 进程占用的CPU百分比;
%MEM 占用内存的百分比;
NI 进程的NICE值,数值大,表示较少占用CPU时间;
VSZ 进程虚拟大小;
RSS 驻留中页的数量;
TTY 终端ID
STAT 进程状态(有以下几种)
D 无法中断的休眠状态(通常 IO 的进程);
R 正在运行可中在队列中可过行的;
S 处于休眠状态;
T 停止或被追踪;
W 进入内存交换(从内核2.6开始无效);
X 死掉的进程(从来没见过);
Z 僵尸进程;
< 优先级高的进程
N 优先级较低的进程
L 有些页被锁进内存;
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ 位于后台的进程组;
WCHAN 正在等待的进程资源;
START 启动进程的时间;
TIME 进程消耗CPU的时间;
COMMAND 命令的名称和参数;
ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 工具.

以上是关于linux 性能自我学习 ———— 不可中断进程和僵尸进程 [四]的主要内容,如果未能解决你的问题,请参考以下文章

linux负载均衡与性能监控

Linux性能优化实战:负载均衡与CPU使用率(01)

linux查看是不是有某个运行的进程命令

linux 性能优化之路: 什么是平均负载, 如何判断是哪种负载过高(cpu密集, io密集, 大量进程)

linux 性能优化之路: 什么是平均负载, 如何判断是哪种负载过高(cpu密集, io密集, 大量进程)

linux性能优化不可中断进程和僵尸进程的问题