找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 5953|回复: 2

Dev_Poll_Reactor使用中要注意的一个小陷阱

[复制链接]
发表于 2011-7-8 17:47:57 | 显示全部楼层 |阅读模式
最近调试ACE6.0.0版本中Dev_Poll_Reactor的性能测试中发现了一个程序中的bug。
现象:1000客户端连接 - 100ms发一次 - 10k包大小 - 服务器A,A转发到服务器B,
          运行几分钟后,A与B间连接的读写事件已无法响应,状态为established。
          同样的程序改为Select_Reactor模型运行起来很正常。
问题很蹊跷,我随即看看下Poll_Reactor的实现,找到了原因。
主要是Client_Handle中handle_output的实现有点问题,因为Poll_Reactor的epoll采取的是
EPOLLONESHOT的方式,监听完fd的一次事件后得再次添加fd,所以reactor回调完handle_*后根据返回值来判断继续注册之前感兴趣的事件还是remove_handle(),如果之前的handle_*返回-1,会丢失所有已注册过的事件。而我的程序在调度WRITE_MASK事件时,通过返回-1而在handle_close中做处理,这样的方式在Select_Reactor中是没问题的,但是在Poll_Reactor中就是个杯具啊。
于是改成schedule/cancel方式,测试到6000连接的发包,一切正常。
感觉采用oneshot的方式对性能有不少影响,应该是ace的设计者只是为了在多线程下实现更方便,而不想实现类似TP_EPoll的Epoll版lead/flower。
发表于 2011-7-21 10:51:06 | 显示全部楼层
又能不掉进这个陷井了
发表于 2012-11-12 19:00:22 | 显示全部楼层
什么是schedule/cancel方式? 如何设置schedule/cancel方式还是lead/flower方式?
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-29 01:04 , Processed in 0.012855 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表