TUhjnbcbe - 2024/10/31 16:19:00
最近在做连续数据流的缓冲系统,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等待上,实际上,如果当前系统还有其他任务需要使用CPU,Linux会将等待I/O完成的任务暂时挂起,将CPU使用权暂时交给有需要的任务。那么iowait到底是什么意思呢?有人认为,iowait只是CPU空闲(idle)时间的一个子集,也就是说iowait其实可以归类到idle状态,本质上表示CPU是空闲的,只不过iowait表示任务中有等待I/O操作完成的时间。iowait到底是什么意思呢?这样认为有一定的道理,毕竟哪怕iowait的数值是%,也仅仅是说明是CPU把时间都花在“等待”上了,这样的情况一般只有在当前系统没有其他任务需要使用CPU时才会发生。因为一旦有其他任务需要使用CPU,Linux内核会立刻将CPU提供给该任务使用,CPU时间就不再全部是“等待I/O”花费的了(不再是%io了)。不过读者应该明白的是,“idle”是CPU的状态,而“iowait”则是任务的状态。对于单核CPU来说,同时只能有一个任务运行,上述说法可以认为是准确的。但是对于多核CPU来说,情况就有些不同了。例如,某个系统拥有4个CPU,有一个I/O超密集型任务正在运行,那么,iowait会是%呢,还是25%呢?换句话说,iowait会是在其中一个CPU上%,其他CPU上0%呢,还是会在4个CPU上平均25%呢?简单做一个实验简单做一个实验就可以了。我们使用Linux中的dd命令模拟高密集I/O任务,这一过程可以通过输入以下命令实现:ddif=/dev/sdaof=/dev/nullbs=1MB这条命令可能需要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.8+20.9+26.7+3.7=86.1,接近但低于。进一步实验为了让实验更可重现,我们可以使用taskset命令为任务指定CPU:taskset1ddif=/dev/sdaof=/dev/nullbs=1MB应该注意,taskset后的数字1并不是CPU的编号,而是一种掩码。此时通过top命令查看CPU使用请看,应该能够发现CPU0的wa项接近,这说明CPU0几乎所有的时间都花在等待I/O操作完成上。那么,是不是此时CPU就没有精力处理其他任务了呢?我们再输入下面这条命令:taskset1sh-cwhiletrue;dotrue;done上面这条命令是在相同的CPU上执行一个死循环,用于模拟计算密集型任务,它是不是就没有机会执行了呢?输入top命令,得到如下结果:CPU0的wa降低为0了CPU0的wa降低为0了,与此同时,用户态和系统态的CPU时间接近%了。这是意料之中的,因为I/O等待时间只是idle时间的子项,本质上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等嵌入式开发,喜欢我的文章就