磁盘读频繁,数据量大 ---> iowait高 ---> CPU飙升
IO(input output)主要指:文件IO,网络IO。
“等待IO就绪“究竟等的什么?
你一定不止在一个地方看到类似"cpu等待IO就绪,线程挂起..."的描述,不知你有没有想过CPU到底在等待个啥,等待个寂寞吗?为什么CPU要等待呢?CPU不能参与吗?
首先,cpu有两种状态,用户态和内核态,cpu会根据需要在两种状态之间切换。
用户态和内核态的cpu有什么区别呢?
想想古时候的将军,他手里握有兵权,但是他调用军队是需要有兵符的,没有兵符,他就没办法调兵遣将。
没了兵符的将军就是一个普通老百姓,只拥有有普通公民的权利,所以一个人有没有持有兵符,拥有的权限不一样。
一个人有兵符,你就是将军(将军态,类似内核态),你就能调动军队资源;没有兵符,你就是一介布衣(布衣态,类似用户态),拥有普通权利而已。
cpu同理,内核态的cpu有较高的权限,它能调用一些高级别的资源,比如访问一些安全级别较高的地址空间。
其次,计算机中存储是分结构的。除此之外,主存(内存)这一层面内部同样进行了逻辑划分,分为用户空间和内核空间。
顾名思义,内核空间只有处于内核状态的cpu才能访问的。
一个军队里,将军不可能管理所有人,他会设立千夫长,百夫长来管理。
cpu同样将部分职责交给了另一个硬件,叫作DMA。DMA是一种无需CPU的参与就可以让外设和系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。DMA经常与硬件体系结构特别是外设的总线技术密切相关。
“读操作”时,DMA负责将数据从磁盘拷贝到内核空间,注意是拷贝不是移动,然后cpu再从内核空间拷贝到用户空间。所以,cpu等待io就绪,在“读操作”时,等的就是DMA将数据从磁盘拷贝到内核空间。
为什么CPU要将它交给DMA搞?
因为CPU处理数据的速度远远大于IO准备数据的速度。
磁盘到内核空间的拷贝太慢了(想必你也知道不同级别的存储结构读写速度不一样),CPU的时间很宝贵的,它应该去做一些价值更大的东西。
CPU :工人,干活的,判断以及逻辑处理。
内存: 车间,工人干活的地方,车间中加工原料,当车间中没有原料了,在从仓库中取原料,对原料进行加工。内存本身有一定的存储空间,对内存中的数据进行处理的速度比从硬盘取数据再处理的速度快很多。
硬盘 :仓库,原料,数据存储。
CPU对数据进行判断以及逻辑处理,本身不能存储数据,这时cpu从内存取数据进行逻辑计算,如果内存没有数据,才会从硬盘读数据到内存,再对数据进行处理。
你想象,就像人吃饭一样,cpu就是人,内存就是碗,硬盘就是饭锅。
当cpu进程等待,会造成内存开销的增加,内存不够用的时候会用到虚拟内存,导致虚拟内存的增加,这时磁盘IO开销就会增加。
IO 性能对于一个系统的影响是至关重要的。
一个系统经过多项优化以后,瓶颈往往落在数据库;而数据库经过多种优化以后,瓶颈最终会落到 IO 。而 IO 性能的发展,明显落后于 CPU 的发展。redis也好, mongoDB也好,这些流行技术的背后都在直接或者间接地回避 IO 瓶颈,从而提高系统性能。
参考
CPU、内存、磁盘IO之间的关系
http://blog.itpub.net/31397003/viewspace-2650835/
https://www.cnblogs.com/zhangyjblogs/p/14163607.html
面试官问我Linux的网络IO模式怎么办?
https://juejin.cn/post/6844904170663706638
网友评论