“多线程IO”和“单线程异步IO”的对比【转】

来源:互联网 发布:ubuntu 14 32位下载 编辑:程序博客网 时间:2024/06/05 13:29

原文地址:http://www.grati.org/?p=684

顺手写了个程序对比了一下多线程IO和单线程异步IO的性能差异。需要说明的是,Linux上目前的异步IO是由用户态线程模拟的。目前内核原生的AIO和glibc中的异步IO都有缺陷,libeio目前感觉比较好(因为nodejs在用)。单线程异步IO指的是主线程中控制IO的代码全部都是在主线程中执行的,libeio内部使用的线程对外来说完全不可感知。单线程异步IO的好处就是主流程中的控制代码完全处于单线程环境,可以完全不用考虑锁的问题。

应用场景客户端启动20个线程同时从服务端求数据。服务端从磁盘出文件回给客户端。服务端有两种实现1、使用多线程每个线程服务一个用户。2、使用单线程和异步IO来服务多个用户。

测试时服务端的处理器为单核600MHZ的ArmV6(RaspberryPi),客户端为2.5 GHz Intel Core i5(2013版 Mac mini),因此客户端不会成为性瓶可以体现出服务端的差异。两台机器用100M网线直连。

20个线程下载700KB的文件:(测4次录每次成绩,数据为所花费的时间,越少越好)

多线程
183393
183505
183792
182878

异步IO
198165
191537
196565
193653

20个线程下载40K文件

多线程
12434
13099
12773
12958

异步IO
15293
15073
15974
15631

两种方案的优缺点对比
1、性上传统的多线程方案占有优势。不过测程序中多线程中完全没有使用锁,现实中由于的锁的限制多线程的性将大打折扣。
2、单线程异步IO程序中,由于控制代码在单线程环境中运行,可以完全无锁。
3、单线程异步IO程序中同时服务20个用户只使用了3个线程(libeio使用线程模拟异步IO,当前Linux上异步IO没有更好的决方案),多线程版本的程序使用了21个线程(包括主线程)。由于线程多,因此多线程版本的内存占用比libeio版本了很多。
4、libieo版本的流程没有多线程版本的直观。

总结
单线程异步IO的主流程代码可以完全无锁,这个是单线程异步IO的最大优势。在性能损失不多的情况下(和完全无锁的多线程方案对比,现实中完全无锁的多线程环境几乎不存在),很值得考虑。唯一需要考虑的,单线程异步IO可能对多核CPU的利用不如传统的多线程充分。
另外,还可以扩展一下,在编写复杂应用时,除了IO等阻塞操作,CPU密集的操作也可以拿出来到单独的线程中执行,尽量把耗时不多的逻辑部分留在单线程中,由于运行在单线程环境,这样很大程度上简化逻辑部分的编写。

0 0
原创粉丝点击