郑州大型网站建设价格,阿里云网站建设与发布题库,千图网素材下载网站,公司单位名称大全最近在做连续数据流的缓冲系统#xff0c;C语言代码实现后#xff0c;粗略测试了下#xff0c;功能上应该没有问题。那么#xff0c;接下来就该测试性能了。输入 top 命令#xff0c;的确可以看到一系列 cpu 使用率#xff0c;其中一个值得注意的子项就是 io 使用率了C语言代码实现后粗略测试了下功能上应该没有问题。那么接下来就该测试性能了。输入 top 命令的确可以看到一系列 cpu 使用率其中一个值得注意的子项就是 io 使用率了如下图top 命令上图中 io 前面的数字是什么意思呢是指 CPU 有 63% 的时间花费在 io 上了吗在 Linux 中输入 man 命令查看相关手册发现 io(wait) 被解释为“等待 I/O 完成的时间”。“等待 I/O 完成的时间”如果按照手册对 iowait 字面上的解释是很容易陷入误区的。因为就上例而言似乎 CPU 有 63% 的时间消耗在等待 I/O 操作完成导致 CPU 的性能白白浪费这么多。其实不是的Linux 是一个成熟的操作系统它才不会让 CPU 宝贵的性能白白浪费在耗时的 I/O 等待上实际上如果当前系统还有其他任务需要使用 CPULinux 会将等待 I/O 完成的任务暂时挂起将 CPU 使用权暂时交给有需要的任务。那么 iowait 到底是什么意思呢有人认为iowait 只是 CPU 空闲(idle)时间的一个子集也就是说 iowait 其实可以归类到 idle 状态本质上表示 CPU 是空闲的只不过 iowait 表示任务中有等待 I/O 操作完成的时间。iowait 到底是什么意思呢这样认为有一定的道理毕竟哪怕 iowait 的数值是 100%也仅仅是说明是 CPU 把时间都花在“等待”上了这样的情况一般只有在当前系统没有其他任务需要使用 CPU 时才会发生。因为一旦有其他任务需要使用 CPULinux 内核会立刻将 CPU 提供给该任务使用CPU 时间就不再全部是“等待I/O”花费的了(不再是 100% io 了)。不过读者应该明白的是“idle”是 CPU 的状态而 “iowait”则是任务的状态。对于单核 CPU 来说同时只能有一个任务运行上述说法可以认为是准确的。但是对于多核 CPU 来说情况就有些不同了。例如某个系统拥有 4 个 CPU有一个 I/O 超密集型任务正在运行那么iowait 会是 100% 呢还是 25% 呢换句话说iowait 会是在其中一个 CPU 上 100%其他CPU 上 0% 呢还是会在 4 个 CPU 上平均 25 % 呢简单做一个实验简单做一个实验就可以了。我们使用 Linux 中的 dd 命令模拟高密集 I/O 任务这一过程可以通过输入以下命令实现dd if/dev/sda of/dev/null bs1MB这条命令可能需要 root 权限/dev/sda 是我的磁盘读者可能需要换成自己的节点名。此时通过 top 命令可以查看到下面这样的结果top 命令图中的 “wa”表示 I/O 等待时间(它和 io、iowait 是一个意思名字不同而已)。可见Linux 此时采用单个 CPU 处理 I/O 任务。如果读者细心的话应该能够发现I/O 任务只是偶尔的切换到其他 CPU 上运行这是为了保证 CPU 缓冲的命中率Linux 内核尽量让任务在单个 CPU 中运行。在其他一些系统中I/O 任务可能会在各个CPU中频繁的切换此时会产生下面这样的结果I/O 任务可能会在各个CPU中频繁的切换假设 dd 命令是系统中执行 I/O 的唯一任务那么在同一时刻最多只会有一个 CPU 处理 I/O 等待任务。因此实际上 34.820.926.73.786.1接近但低于100。进一步实验为了让实验更可重现我们可以使用 taskset 命令为任务指定 CPUtaskset 1 dd if/dev/sda of/dev/null bs1MB应该注意taskset 后的数字 1 并不是 CPU 的编号而是一种掩码。此时通过 top 命令查看 CPU 使用请看应该能够发现 CPU0 的 wa 项接近 100这说明 CPU0 几乎所有的时间都花在等待 I/O 操作完成上。那么是不是此时 CPU 就没有精力处理其他任务了呢我们再输入下面这条命令taskset 1 sh -c while true; do true; done上面这条命令是在相同的 CPU 上执行一个死循环用于模拟计算密集型任务它是不是就没有机会执行了呢输入 top 命令得到如下结果CPU0 的 wa 降低为 0 了CPU0 的 wa 降低为 0 了与此同时用户态和系统态的 CPU 时间接近 100% 了。这是意料之中的因为本质上 CPU 是空闲的Linux 内核当然可以把 CPU 交给第二个任务使用。原本用于等待 I/O 完成的 CPU 时间现在用于处理第二个任务了。此时通过 top 命令查看 wa自然得到接近 0 的结果。小结现在基本就清楚 top 命令中 % io 的含义了对于指定的 CPU 来说iowait 表示在此时间内CPU 其实是空闲的不过 CPU 并不是严格意义上的“空闲”毕竟它还需要等待 I/O 操作完成。对于产生 I/O 操作请求的线程来说它会阻塞等待 I/O 操作完成。理解这一点对于我们开发I/O操作密集的C语言程序是非常有帮助的。点个赞再走吧欢迎在评论区一起讨论质疑。文章都是手打原创每天最浅显的介绍C语言、linux等嵌入式开发喜欢我的文章就关注一波吧可以看到最新更新和之前的文章哦(最近发现有些帐号搬运我的文章并且标上原创标签有些可耻请注明出处)。