美国上市公司,专注Java培训21年

如何让IO并发应对不同的场景有什么讲究?


如何让IO并发,什么场景必须并发,什么场景不必须?这里就很有讲究了。并发的例子很简单,去银行办业务,总会遇到某些窗口关闭不办业务,此时你肯定会想,如果所有窗口都打开该多好,就是这个道理。IO请求排队中,如果底层就那么几块硬盘,性能就上不来。

但是,更容易被忽略的一个问题,就是如果某个人要办理的业务把多个窗口都给占了,此时窗口再多也无济于事。如果某个IO请求需要所有磁盘一起为其读写数据,那么其他IO只能等待。

什么场景下需要并发执行?比如电商平台,100万人同时购买商品,如果系统不能并发,假设每笔购买请求需要1ms执行完毕,那么第100万个人点击购买按钮之后,要等待一百万毫秒也就是一千秒,大概10分钟,才能被执行,这显然不可接受,所以电商平台的系统都是大量机器并发执行。对于这种要求高并发、低时延的场景,磁盘IO也必须并发才能提升性能。

保证并发最好的做法就是让一个IO只占用一个盘而不是多个盘。对于机械磁盘,每块盘同一时刻只能执行一个IO,这一点与SSD显著不同,后者同一个时刻可以执行多个IO。同样的事情,CPU执行指令也是如此,能够同一个时刻执行多个指令的成为超标量执行。

所以,在并发场景下的条带深度调节方式,自然你也就明白了。如下图所示。IO size要小于条带深度,或者说,条带深度要设置成大于等于IO size。

【如何让IO并发应对不同发场景有什么讲究】

值得一提的是,条带深度不能设置的过大,最好的情况是让其等于IO size。如下图所示,过大的话,由于IO访问的局部性,反而导致多个IO冲突在一个盘上,并发几率显著降低。

【如何让IO并发应对不同发场景有什么讲究】

条带深度,条带宽度,chunck/block/slice/extent,这些概念到底都啥玩意。IO size又怎么获取?一般来讲条带深度就是一个条带在一块盘上所占的空间,条带深度乘以磁盘数量=条带宽度。至于chunck,slide之流,都是厂商故弄玄虚出来的让人略感高大上的词,蒙人的,至于厂商怎么定义的,看手册。IO Size要么根据经验,比如Oracle访问数据文件为8K IO居多;要么看存储系统给出的监控报告,比如4K的IO一段时间内占了80%,则可以将条带深度调节为4K。

LVM条带化就并发了么?幼稚!如果条带化到位于同一个Raid组的多个PV上,条带化是没用的,反而还会降低并发度。所以,只有条带化到位于不同raid组的PV之间时,相当于做了个raid50/60,此时才会提升性能。如下图所示。

【如何让IO并发应对不同发场景有什么讲究】

最后,这个世界的底层,真的可以并行么?也就是同一个时刻,多件事情真的会同时发生么?JAVA培训班感觉底层也并非真的并发,而是像CPU执行线程一样,是时分复用的。据此,java培训机构有个推测,因为运动也不能同时进行,所以,想一个方向运动到光速之后,系统内其他方向的运动分量全部被耗尽,体现为时间静止。如果你写了一个程序,进行软计时,而另一个程序写成一个死循环,你就会发现软计时程序计时变慢。有兴趣可以阅读该文,在这种浮躁的背景之下,也应该静下来思考思考了。


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多

Java开班时间

收起