这篇文档描述了 IO 密集型程序和 CPU 密集型程序的概念以及区别。并使用 sysstate 这个工具来观察程序运行时候的资源利用率。
实验准备
在 CentOS 下安装 sysstate 可以使用如下命令安装:
sudo dnf install sysstate -y
安装之后我们可以通过如下命令来查看帮助:
sar --help
统计 CPU 使用率
统计 CPU 使用率可以使用如下命令,每 5 秒统计一次, 一共统计 10 次:
sar -u 5 10
输出内容如下:
17:16:03 CPU %user %nice %system %iowait %steal %idle
17:16:08 all 0.30 0.00 0.70 0.00 0.00 99.00
17:16:13 all 0.40 0.00 0.60 0.00 0.00 99.00
...省略...
每一列的含义如下表所示:
| 列 | 描述 |
|---|---|
| %user | 用户空间 CPU 的使用状态 |
| %nice | 改变过优先级的 CPU 使用的 CPU 频率 |
| %system | 内核空间的程序占用 CPU 的比例 |
| %iowait | CPU 等待 IO 完成的时间占比 |
| %steal | 虚拟机相关的 CPU 状态 |
| %idle | CPU 空闲的时间占比 |
统计 IO 使用率
统计磁盘 IO 的使用可以采用如下命令,每 5 秒统计一次,一共统计 10 次:
sar -b 5 10
输出内容如下:
17:22:02 tps rtps wtps bread/s bwrtn/s
17:22:07 1.60 0.00 1.60 0.00 27.60
17:22:12 0.00 0.00 0.00 0.00 0.00
...省略...
每一列的含义如下表所示:
| 列 | 描述 |
|---|---|
| tps | 每秒中 IO 设备读写的总量,它的值等于 rtps 和 wtps 两个数值的和 |
| rtps | 每秒钟 IO 设备读的总量 |
| wtps | 每秒钟 IO 设备写的总量 |
| bread/s | 每秒钟从物理设备读入的数据量, 单位是块(Block) |
| bwrtn/s | 每秒钟向物理设备写入的数据量,单位是块(Block) |
CPU 密集型的程序
CPU 密集型也称之为计算密集型,这类程序有如下特点:
- 完成一项任务的时间取决于 CPU 的运算速度
- CPU 利用率高、其他事情处理慢
我们来写一个 CPU 密集型的程序使用 Python, 这个程序的目的是计算阶乘:
result = 1
for i in range(1, 1024001):
result = result * 1
打开两个终端窗口,一个用 Python 运行这个程序,另一个用来使用 sar 观察 CPU 的利用率。得到如下结果:
17:33:49 CPU %user %nice %system %iowait %steal %idle
17:33:54 all 41.21 0.00 9.25 0.00 0.00 49.55
17:33:59 all 41.06 0.00 9.54 0.00 0.00 49.40
17:34:04 all 40.32 0.00 10.33 0.00 0.00 49.35
17:34:09 all 40.20 0.00 10.25 0.00 0.00 49.55
17:34:14 all 40.36 0.00 10.24 0.00 0.00 49.40
我们看到当执行这个程序之后,CPU 在用户态的使用率就上到了 40% 以上,而空闲时间则在 49% 左右。
IO 密集型的程序
IO 密集型程序有如下这些特点:
- 频繁读写网络、磁盘等任务的程序都属于 IO 密集型程序
- 完成一项任务的时间取决于 IO 设备的速度
- CPU 利用率低、大部分时间都在等待 IO 设备完成读写
我们来写一个 IO 密集型的程序使用 Python,这个程序的目的是往磁盘写入一个 GB 的数据:
with open('empty-2-1GB.txt', 'w') as f:
for i in range(1024 * 1024):
for j in range(1024):
f.write('c')
f.flush()
打开两个终端窗口,一个用 Python 运行这个程序,另一个用来使用 sar 观察 CPU 的利用率。得到如下结果:
17:37:59 tps rtps wtps bread/s bwrtn/s
17:38:04 0.80 0.00 0.80 0.00 5.00
17:38:09 0.00 0.00 0.00 0.00 0.00
17:38:14 2.80 0.00 2.80 0.00 46.00
17:38:19 0.00 0.00 0.00 0.00 0.00
17:38:24 0.00 0.00 0.00 0.00 0.00
17:38:29 0.00 0.00 0.00 0.00 0.00
17:38:34 67.80 0.00 67.80 0.00 82046.40
上面这些数据和空闲的时候差别就比较大。
最后更新于:
2021.09.16