-
通常我们说一个程序是cpu密集型就是cpu用的多,io密集型就是io用的多,这种说法对吗?
答案是:不能算错,但也不全对。其实应该从程序的瓶颈来看待这个问题,若系统瓶颈在cpu,那就是cpu密集型;反之,若在io,则是io密集型。
了解程序是哪种类型,对系统优化有着关键的指导作用。 -
比如我们平时使用的IM软件、网上商城应用都属于io密集型,因为它们主要做的事情是【高频的小数据传输与读写】,一个是网络io,一个是磁盘io。
图像处理、加解密、序列化反序列化等则需要消耗大量的cpu计算资源。 -
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使用率也可能低。
- 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的算力。