top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28961 root 20 0 43816 3148 4040 R 3.2 0.0 0:00.01 top 620 root 20 0 37280 33676 908 D 0.3 0.4 0:00.01 app 1 root 20 0 160072 9416 6752 S 0.0 0.1 0:37.64 systemd 1896 root 20 0 0 0 0 Z 0.0 0.0 0:00.00 devapp 2 root 20 0 0 0 0 S 0.0 0.0 0:00.10 kthreadd 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq 7 root 20 0 0 0 0 S 0.0 0.0 0:06.37 ksoftirqd/0
向一个进程发送SIGSTOP 信号,它就会因响应这个信号变成暂停状态(Stopped);再向它发送 SIGCONT 信号,进程又会恢复运行(若是进程是终端里直接起动的,docker
则须要你用fg命令,回复到前台运行)
浏览器
而当你的用的调试器调试一个进程是,在使用断点中断进程后,进程就会变成跟踪状态,这其实也就是一种特殊的暂停状态,只不过你能够用调试器
来跟踪并按需控制进程的运行bash
了解了这些,咱们再回到今天的主题,先看不可终端状态,这实际上是为了保证进程数据与硬件状态一直,而且增加状况下,不可终端状态在很短期内会结束,服务器
因此短时的不可终端进程咱们通常可忽略微信
但若是系统或硬件发生了故障,进程可能会在不可中断状态保持好久,甚至致使系统中出现大量不可中断进程,这时,你就得注意下,系统时不时出现了I/O 等性能问题。app
再看僵尸进程,这是多进程应用很容易碰到的问题,正常状况下,当一个进程建立了子进程后,它应该经过系统调用 wait() 或者 waitpid() 等待子进程结束,回收子进程的资源;
而子进程在结束时,会向它的父进程发送SIGCHLD 信号,因此,父进程还能够注册 SIGCHLD信号的处理函数,异步回收资源
异步
若是父进程这么作,或是子进程执行太快,父进程尚未来得及处理子进程状态,子进程就已经提早退出,那这时的紫禁城就会变成僵尸进程,换句话说,父亲应该一直对儿子负责,有始有终,若是不做为或者跟不上、都会致使"问题少年"的出现函数
一般、僵尸进程持续的时间都比较短,在父进程回收它的资源后就会消亡;或者在父进程推出后,由init进程回收后也会消亡性能
一旦父进程没有处理子进程的种植,还一直保持运行状态,那么子进程就会一直处于僵尸状态,大量的僵尸进程会用尽PID进程号,
致使新进程不能建立,因此这种状况必定要避免学习
docker run --privileged --name=app -itd feisky/app:iowait
ps aux | grep /app root 4009 0.0 0.0 4376 1008 pts/0 Ss+ 05:51 0:00 /app root 4287 0.6 0.4 37280 33660 pts/0 D+ 05:54 0:00 /app root 4288 0.6 0.4 37280 33668 pts/0 D+ 05:54 0:00 /app
一、s 和 + 是什么意思呢?
s 表示这个进程是一个会话的领导进程,而 + 表示前台进程组
这里又出现了两个新概念,进程组和会话,他们用来管理一组相互关联的进程,意思其实很好理解
二、什么是进程组?
进程组表示一组相互关联的进程,好比每一个子进程都是父进程所在组的成员;而会话是只共享同一个控制终端的一个或多个进程组
三、什么是会话?
好比,我么经过SSH登陆服务器,就会打开一个控制终端(TTY),这个控制终端就对应一个会话,而我咱们在终端中运行的命令以及他们的子进程
就构成了一个个的进程组,其中,在后台运行的命令,构成后台进程组;在前台运行的命令,就构成前台进程组
# 按下数字 1 切换到全部 CPU 的使用状况,观察一下子按 Ctrl+C 结束 $ top top - 05:56:23 up 17 days, 16:45, 2 users, load average: 2.00, 1.68, 1.39 Tasks: 247 total, 1 running, 79 sleeping, 0 stopped, 115 zombie %Cpu0 : 0.0 us, 0.7 sy, 0.0 ni, 38.9 id, 60.5 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu1 : 0.0 us, 0.7 sy, 0.0 ni, 4.7 id, 94.6 wa, 0.0 hi, 0.0 si, 0.0 st ... PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4340 root 20 0 44676 4048 3432 R 0.3 0.0 0:00.05 top 4345 root 20 0 37280 33624 860 D 0.3 0.0 0:00.01 app 4344 root 20 0 37280 33624 860 D 0.3 0.4 0:00.01 app 1 root 20 0 160072 9416 6752 S 0.0 0.1 0:38.59 systemd ...
从这里你能看出什么问题吗?逐行观察,别放过任何一个地方,忘了哪行参数意思的话,也要及时返回去复习
先看第一行平均负载,过去一、五、15分钟内的平均负载依次减少,说明平均负载正在升高,而1分钟内的平均负载已经达到了系统CPU的个数,说明系统可能已经有了性能瓶颈
Tasks 有1个正在运行的进程,但僵尸进程比较多,并且还在不停增长,说明有子进程在退出时没有没清理
CPU使用率:用户CPU和系统CPU都不高,但iowait分别是60.5%和94.6%好像有点不正常
每一个进程的状况:CPU使用率最高的进程只有0.3%,看起来并不高;可是有两个进程处于D状态,它们可能在等待I/O,但光凭这里并不能肯定是它们致使了 iowait 升高
咱们把这四个问题在汇总一下,就能够获得很明确的两点:
第一点:iowait过高了,致使系统的平均负载生该,甚至达到系统CPU的个数
第二点:僵尸进程在不断增多,说明程序没能正确清理子进程的资源
老师说多是案例里I/O线程还不够多,效果不明显,等着老师修改案例从新发镜像,再实验。
在和老师屡次交流下,终于逼得老师发布一个把本身机器跑死的镜像,就能够了,结果和老师的温和了。
[root@luoahong ~]# docker run --privileged --name=app -itd feisky/app:iowait-new2 Unable to find image 'feisky/app:iowait-new2' locally iowait-new2: Pulling from feisky/app 32802c0cfa4d: Already exists da1315cffa03: Already exists fa83472a3562: Already exists f85999a86bef: Already exists f69cb5280862: Pull complete Digest: sha256:9fc8b013aff0bc2c1b1dc41a33989a8ddd4ed7da56f53f6559bbc76836041dc2 Status: Downloaded newer image for feisky/app:iowait-new2 00ed5564248127a98c467eb99f8b32d3dc3ebc5d7f47563d6617ccfd7348b10b [root@luoahong ~]# ps aux | grep /app root 11798 0.1 0.0 4368 380 pts/0 Ss+ 09:54 0:00 /app root 11851 0.0 0.8 70040 65776 pts/0 R+ 09:55 0:00 /app root 11852 0.0 0.8 70040 65776 pts/0 R+ 09:55 0:00 /app root 11854 0.0 0.0 112708 980 pts/0 S+ 09:55 0:00 grep --color=auto /app
top截图
执行这个镜像,iowait打满,直接把个人微信给挤掉了,浏览器都打不开了,不过结果是好的。
用我么最熟悉的ps或者top,能够直接查看进程的状态,这些状态包括运行(R)、空闲(I)、不可中断睡眠(D)、可中断睡眠(S)、僵尸(Z)以及暂停(T)等
其中,不可中断状态和僵尸状态,是咱们今天学习的重点
不可中断状态:表示进程正在跟硬件交互,为了保护进程数据和硬件的一致性,系统不容许其余进程或中断打断这个进程。进程长时间处于不可中断状态,一般标识系统有I/O 性能问题
僵尸进程表示进程已经退出,但它的父进程尚未回收子进程占用资源。短暂的僵尸状态咱们一般没必要理会,但进程长时间属于僵尸状态,
就应该注意了,可能有应用程序没有正常处理子进程退出