免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 24432 | 回复: 104

[C++] [换个地方发]请教大牛:异步io的优点究竟在哪 [复制链接]

论坛徽章:
0
发表于 2013-01-21 10:09 |显示全部楼层
在考虑服务器通讯模型的问题,究竟何种情况下异步io模型相对同步io模型有较大的优势?原因是什么?是同步io为了应付大并发量必须派生大量线程导致上下文切换过多造成的吗(似乎有些场景并不能完全证明这点)?

Note:
我问的不是阻塞模型和非阻塞模型,网上很多对同步、异步io模型比较的文章实际都是在说阻塞和非阻塞的事。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2013-01-21 10:17 |显示全部楼层
同步IO模型比较简单, 异步IO,看起来不错,实际上用起来,还是多线(进)程+同步+同步IO比较好。

个人理解,我实在想不到现在在什么情况下非要用异步IO不可

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
发表于 2013-01-21 10:24 |显示全部楼层
回复 1# xxxxxxxp


    这个解释起来还真不是一句两句的问题。从操作系统到用户层技术,从线程到协程,从网络到服务器。说起来可麻烦了。而且也不好给一个概括的说法。

首先你得知道什么是异步IO。其实有时候它们的区别并不明显,特别是当你引入协程作为设计架构的时候。

表面上说异步IO在逻辑进行的时候不需要等待IO完成,可以启动IO之后直接继续执行逻辑,在IO结束以后得到通知。不过说起来简单,现在很多异步是用同步+poll做出来的效果。真正的异步IO(aio,SIGIO)目前应用较少。你说的启动一个线程在后头等其实也是根正苗红的异步IO。

操作系统内部的IO都是异步的——因为处理中断要快准狠,不能老拖着。问题似乎在于接口不好设计。我个人觉得回调什么的可能是最好的选择了。

总而言之,异步IO相比同步来说其实没什么差别,因为现在已经基本上没有什么同步IO了。你就算全都是阻塞的写的,你CPU也飚不到100%,因为在你等待的时候,CPU会把控制权切给别人,这种行为本质上就是异步的了。所以,如果非要说的话,用异步IO,可以完全利用CPU资源(虽然同步其实也做得到这点)。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
发表于 2013-01-21 10:30 |显示全部楼层
类比 锁。
切换开销大而事件发生时间短的时候用自旋锁,相反,互斥锁。
切换开销大而事件发生时间短的时候用同步io,相反,异步。

论坛徽章:
0
发表于 2013-01-21 10:30 来自手机 |显示全部楼层
我可以对楼上提出不同意见吗,没有恶意,希望别以为我在攻击你。
你说了那么多,却没有提及真正的同步并发需要多线程或进程,带来的上下文切换会影响效率,这才是问题的关键

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
发表于 2013-01-21 10:30 |显示全部楼层
什么程度是大,什么程度是短,你的应用测试之后说了算。

论坛徽章:
0
发表于 2013-01-21 10:32 来自手机 |显示全部楼层
不好意思,gvim大人,我用手机发帖,不能引用,我刚才是对3楼说的,回帖太慢,被您抢先了

论坛徽章:
0
发表于 2013-01-21 10:35 |显示全部楼层
回复 2# folklore

但nginx对apache(某版本之前)的性能优势在某些场景下是巨大的,apache会在大并发量情况下自己派发进程,我们的有些实验中,这种行为会伤害性能


   

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
发表于 2013-01-21 10:35 |显示全部楼层
回复 7# sqfasd


    好吧,对你这种坚持手机发帖减小碳排放的行为表示十分滴支持

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2013-01-21 10:35 |显示全部楼层
单纯说原理可能观点分歧会很多,其实从现象看更直观。
一个无责任测评:
机器配置:E5649*6+64G内存,使用一块Intel千兆网卡(其它配置和我们讨论的问题没什么关系,忽略),机器中未运行其它高负载程序。

(1)自己写的采用异步模式的搜索服务器(源代码在https://github.com/windoze/Argos),启动8个worker thread
(2)Tomcat+Solr,启动100个thread
用ab -c 100测试,(1)的CPU占用率约780%,(2)的CPU占用率只有27%;
增加(2)的thread数,情况略有改善,最高达到40%左右;但当thread数超过500时,性能开始下降,CPU占用率也开始下降,与此同时,Top中显示的System CPU占用率一直居高不下,最高时超过30%。

当然,以上测试并不能说明异步IO本身有性能优势,只能说明大量的thread/process在高负载情况下会导致性能下降。
但问题的关键是,如果你不用非阻塞式IO或者异步IO,你就没办法用少量的thread/process去处理大量的并发。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP