cpu&io密集型

  1. 通常我们说一个程序是cpu密集型就是cpu用的多,io密集型就是io用的多,这种说法对吗?
    答案是:不能算错,但也不全对。其实应该从程序的瓶颈来看待这个问题,若系统瓶颈在cpu,那就是cpu密集型;反之,若在io,则是io密集型。
    了解程序是哪种类型,对系统优化有着关键的指导作用。

  2. 比如我们平时使用的IM软件、网上商城应用都属于io密集型,因为它们主要做的事情是【高频的小数据传输与读写】,一个是网络io,一个是磁盘io。
    图像处理、加解密、序列化反序列化等则需要消耗大量的cpu计算资源。

  3. cpu使用率怎么测量?

top - 01:18:23 up 26 days,  1:46,  1 user,  load average: 0.02, 0.06, 0.09  # 最近1分钟,5分钟,15分钟的系统平均负载
Tasks:  83 total,   1 running,  82 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us,  1.0 sy,  0.0 ni, 98.0 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st  # cpu使用率:
KiB Mem :  2046840 total,    96916 free,   871284 used,  1078640 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  1002840 avail Mem
[root@VM-10-10-centos ~]# cat /proc/stat
cpu  2386298 133 1512433 220167322 135603 0 17069 0 0 0
cpu0 2386298 133 1512433 220167322 135603 0 17069 0 0 0  # 每个cpu都有8个数字,表示从开机到当前的累计时间,(单位是jiffiles,时钟中断次数)
intr 1135957538 223 10 0 0 1242 0 3 0 0 0 0 0 15 0 2204533 0 0 0 0 0 0 0 0 0 0 4423071 0 12185348 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 2719534071
btime 1654615901
processes 5160015
procs_running 2
procs_blocked 0
softirq 268481450 1 149508501 2 23186582 5524440 0 16 0 0 90261908

use:cpu在用户态的运行时间
system:cpu在内核态的运行时间
nice:?
idle:cpu空闲时间 #
iowait:cpu空闲,且在等待io的时间 #
irq:硬中断时间
softirp:软中断时间
steal:?

total1 = use + system + nice + (idle + iowait) + irq + softirq + steal
used1 = use + system + nice + irq + softirq + steal

过15秒,再采集一次
total2 = use + system + nice + (idle + iowait) + irq + softirq + steal
used2 = use + system + nice + irq + softirq + steal

在这15秒内,cpu的使用率 = (used2 - used1) / (total2 - total1)
注意:使用率的计算,与采样频率有关。

一般应用一天的cpu平均使用率在15%~30%之间,cpu使用率低不代表程序就是io密集型,因为io使用率也可能低。

  1. cpu平均负载

1.load average:单位时间内,活跃进程的个数。
2.进程状态:
R:Running/Runnable(Ready)正在执行/准备执行(等待被调度)
S:Sleep 可中断(可被随时唤醒)的睡眠状态,如等待io、资源锁等
D:Disk Sleep 不可中断的睡眠状态,通常是在进行io,会短暂的进入该状态
Z:Zombie 僵尸进程,等待被父进程回收
3.活跃进程:正在占用或即将占用cpu的进程,处于R和D两种状态。
4.一个内核只能跑一个进程,所以当平均负载 > cpu核数时,说明cpu一定忙吗?如果绝大多数进程处于R状态,就可以这么认为,但如果还有大量的D状态,这个假设就不成立。
5.平均负载越高,cpu使用率就越高吗?

  • cpu密集型:如排序、加/解密、音视频编/解码、序列化/反序列化、压缩/解压、新建/拷贝大对象。此时cpu使用率高,负载也越高,二者呈正相关。
  • io密集型:db查询、kv查询、http/rpc接口调用。此时cpu平均负载可能很高,但使用率不一定高。
    6.cpu使用率很高,cpu一定是瓶颈。若cpu负载高,可能cpu是瓶颈,io也可能是瓶颈。需进一步确定,要看iowait是否高,就大概能确认是io还是cpu成了瓶颈。

cpu : io = 5 : 5 => 核数 * 2
cpu : io = 1 : 9 => 核数 * 10
cpu : io = 3 : 7 => 核数 * (10 / 3)
总体思想就是,io占比越大,就应该开更多的线程,避免cpu空闲,才能充分利用cpu的算力。

posted @ 2022-07-04 01:30  JaxYoun  阅读(957)  评论(0编辑  收藏  举报