io_uring如何让读盘速度达到极致

以前传统机械硬盘,并发能力很有限的。比如同时访问硬盘的多个位置的时候,因为需要来回寻道,性能是急剧下降的,所以预读和缓存就很有必要。

随着硬盘存贮技术已经全面进入SSD时代,没有寻道成本,并发能力很强。以前为了尽量降低随机访问io,而使用复杂的内存缓存机制是否还有必要?

让我们看一下glommio作者的评测结果

  1. buffer io对于顺序读的速度很快,而使用direct io加io_uring加read ahead的顺序读写速度则更是快如闪电(这主要得益于硬盘极高的并发能力IOPS,以及io_uring的低消耗可以快速连发请求)。

  2. buffer io对random read速度也比较快,代价就是消耗太多内存。而direct io则可以用很小的固定内存,就可以达到几乎同等的速度。

结论就是,现在的硬盘速度已经超级快了,比线程切换的时间还短,传统的同步调用等待是不可以接受的。也没有必要使用os提供的buffer io(因为预读消耗大量宝贵内存还可能没用,尤其是零碎多文件随机访问),而应该直接使用direct io以极少量内存达到同样的性能。

总之,随着硬盘技术的进步,以前的一些假设需要重新评估,对代码逻辑需要优化。比如当硬盘的延迟已经达到ms以下的时候,对有些应用来说,数据在内存还是在硬盘已经没有太大差别,用到时直接从硬盘读就可以。这时候就可以把它当作一个更大容量的低速内存来使用,像fatcache。