上篇文章中,分析了几种任务处理模型:单线程阻塞 IO、多线程非阻塞 IO 和单线程非阻塞 IO 的性能,并画出了简单的流程图。
同时,为了简化理解,在场景模拟中给出了一个限定条件:请求分析、IO 读取和响应处理的耗时各位 1ms,那这个设定是不是合理的呢?
上图展示了不同的 IO 操作所占用的 CPU 时钟周期,在计算机中,CPU 的运算速度最快,以其的运算速度为基准,时钟周期为1。其次是一级缓存、二级缓存和内存,硬盘和网络最慢,它们所花费的时钟周期和内存所花费的时钟周期差距在五位数以上,更不用提跟 CPU 和一级缓存、二级缓存的差距了。
注:CPU 时钟周期的计算公式为:
CPU 时钟周期 = 1s / CPU 主频
因此,我们在场景模拟中的限定是有问题的:CPU 运算的时间其实远远小于数据库 IO 读写的时间,正确的流程图应该像这样:
如果采用阻塞式的 IO,CPU 将空闲相当长的时间等待 IO 操作完成,性能浪费严重。在这个模型下,如果进行 IO 操作 A 花费是时间为 M,进行 IO 操作 B 花费的时间为 N,那么在 IO 上花费的时间就为 (M + N + ...)。可见,同步式(阻塞式)IO 的代价是十分昂贵的。
分布式 IO
前面说到,阻塞式 IO 的代价是昂贵的,对于分布式架构而言,阻塞式 IO 的代价更加昂贵,先看下面两个流程图:
当网站越来越大,我们就会引入静态资源 CDN、服务器集群和数据库集群,这就构成了一分布式的 IO,相比于将所有的资源放在一台服务器上,分布式 IO 增加了一层网络请求和磁盘读写(可以从花费 CPU 时钟周期的角度看),这种情况下如果还采用阻塞式 IO,其代价将会大的让别的男人伤心。
异步 IO 的好处
对于异步 IO 来说,情况就好得多,还是以上面 A 和 B 两个 IO 操作为例,如果采用异步 IO,那么在 IO 操作上的耗时就为 MAX(M,N,...),相比于阻塞式 IO,其代价简直小的让别的男人开心。
在并发量较小的情况下,阻塞式 IO 和异步 IO 的差距可能不是那么明显,但随着并发量的增加,异步 IO 的优势将会越来越大,吞吐率和性能上的差距也会越来越明显。
完。