背景:
随着存储计算分离的项目进一步推进,IO异步成为了一件必须要做的事情了。随着存储内容分发到远端集中存储(盘古集群),IO lateny平均也需要300-400us,更不用说对于长尾访问,网络抖动,IO集中的情况,有时IO Latency可达到1ms。IO异步化是我们改进延时的一种方式。
实现过程:
总体采用的异步回调的方式,但是由于应用层,与底层存储用的并不是相同线程池,这个过程意味着多次线程切换。同时呢,为了防止“异步地狱”等问题,我们也自己封装了promise和future,使得回调逻辑可以看得更加清楚。
一些问题:
在调用异步回调的函数中,对于很多栈变量的生命周期都不好把控,暂时是通过ptr承接栈变量,控制好变量的生命周期,但是之前很多小的栈变量都通过new的方式产生,对性能必然有些影响。
同步接口的实现,是否通过异步wait来实现。如果不通过异步来实现,同时保留两套接口,那么代码可读性和可维护性就会差很多。但是用异步实现同步,可能会造成死锁的问题。同时同步也可能会有性能的下降,对于全内存等场景,其实是不可接受的。
异步IO之后,底层IO吞吐上去了,但是不可避免的IODepth也上去了,也造成了单次IO Latency延时的增长。尽管总延时会有下降。但是延时和吞吐都好,才是最好的。
除了这些之外,总体来说,要上上下下改好多接口呀。。。