这篇文档描述了 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 设备读写的总量,它的值等于 rtpswtps 两个数值的和
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