昨天看到taobao的人在微博上提到Linux aio,觉得这个可以学习一下。最近做asio的应用也是异步调用很多,自己设计的队列感觉有点乱,周末看看Linux aio的代码,看看能不能得到什么灵感。 这里提供的测试信息比较多 Kernel Asynchronous I/O (AIO) Support for Linux http://lse.sourceforge.net/io/aio.html 上面那个主页提到支持在“Buffered filesystem AIO” 的aio补丁可以这里找的到,淘宝的人他们搞了一个可以在pagecache上面用的aio,不知道和这个有什么分别。谁去检查一下效果怎么样。 The filesystem AIO patchset http://www.kernel.org/pub/linux/kernel/people/suparna/aio/README 根 据http://kernel.org/doc/ols/2003/ols2003-pages-351-366.pdf 上面给出的测试结果,这个The filesystem AIO 的实现,性能是要比同步IO要差的,这难道是内核不把这种部分代码收入内核的原因? 现在linux 内核aio只支持O_DIRECT 的直接访问的模式。 这测试应该启动很多线程然后比较总的throughput。但根据http://blog.yufeng.info/archives/tag/libaio 这 篇文章说到的,同步io因为每次只能执行一个request,所以要很多个线程才能跑满这个系统的throughput,而异步io ,可以一个线程连续或者批量提交多个aio request给系统底层。就会出现多个同步io线程才能抵得上一个异步io线程的吞吐能力的情况。好像有点道理,记得以前看到一篇好像是百度的 blog,确实说的多个线程的io总的吞吐量比当线程要好,估计就是这样原因吧,可能他们用的就是同步io? 下面两个是设计文档。 Asynchronous I/O Support in Linux 2.5 http://kernel.org/doc/ols/2003/ols2003-pages-351-366.pdf Design Notes on Asynchronous I/O (aio) for Linux http://lse.sourceforge.net/io/aionotes.txt 根据lighttpd 的测试,aio 和sendfile的模式,cpu利用率可以下降很多啊。 http://blog.lighttpd.net/articles/2006/11/09/async-io-on-linux 另外这篇文章 http://cnodejs.org/topic/4f16442ccae1f4aa2700113b 提到了,一个在用户态用线程池模拟的aio的实现 libaio http://software.schmorp.de/pkg/libeio.html 不知道和 同样是用户态+ 线程池实现的Posix AIO有什么区别,可以去看一下代码。
(widebright) |