性能分析小案例系列,可以通过下面链接查看哦
https://www.cnblogs.com/poloyy/category/1814570.html
前言
- 前面两个案例讲的都是上下文切换导致的 CPU 使用率升高
- 这一篇就来讲讲等待 I/O 导致的 CPU 使用率升高的案例
进程状态
详解进程状态
https://www.cnblogs.com/poloyy/p/13413770.html
不可中断状态
- 当 iowait 升高时,进程很可能因为得不到硬件的响应,而长时间处于不可中断状态
- 不可中断也是为了保护进程数据和硬件状态一致,并且正常情况下,不可中断状态在很短时间内就会结束
- 所以,短时的不可中断进程,一般可以忽略
- 但如果系统或硬件发生了故障,进程可能会在不可中断状态保持很久,甚至导致系统中出现大量不可中断进程。这时,就得注意下,系统是不是出现了 I/O 等性能问题
僵尸进程
多进程引用很容易碰到的问题
正常情况
- 一个进程创建了子进程后,它应该通过系统调用 wait() 或 waitpid() 等待子进程结束,回收子进程的资源
- 而子进程在结束时,会向它的父进程发送 SIGCHLD 信号
- 所以,父进程还可以注册 SIGCHLD 信号的处理函数,异步回收资源
异常情况
- 如果父进程没有回收资源,或是子进程执行太快,父进程还没来得及处理子进程状态,子进程就已经提前退出,那这时的子进程就会变成僵尸进程
- 形象比喻:父亲应该一直对儿子负责, 善始善终,如果不作为或者跟不上,都会导致“问题少年”的出现
重点
- 僵尸进程持续的时间都比较短,在父进程回收它的资源后就会消亡,或者在父进程退出后,由 init 进程回收后也会消亡
- 一旦父进程没有处理子进程的终止,还一直保持运行状态,那么子进程就会一直处于僵尸状态
- 大量的僵尸进程会用尽 PID 进程号,导致新进程不能创建
大量不可中断状态和僵尸状态进程的案例
系统配置
- Ubuntu 18.04, 2 CPU,2GB 内存
- 前置条件:已运行案例应用
通过 ps 命令查看案例进程
ps aux | grep /app