免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: fm971
打印 上一主题 下一主题

[算法] 超高性能网络编程, Asynchronous network I/O [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-07-17 20:28 |只看该作者

回复 #24 cookis 的帖子

服务器上不需要用心跳来控制超时,只需要记录每个socket最后一次通信的时间戳,只需要用红黑树记录这些点,设定的时间到了,就进行超时处理,在我的思路中,心跳只是超时处理函数的一种。

[ 本帖最后由 zsniper 于 2008-7-18 10:21 编辑 ]

论坛徽章:
0
32 [报告]
发表于 2008-07-17 22:02 |只看该作者

回复 #23 cookis 的帖子

10w并发也测试过,嘿嘿,客户端不够用,没继续加了,epoll支持楼主1024并发完全绰绰有余.

就像楼上有位大哥说的,瓶颈肯定在应用层,保证好应用层代码的性能就行,没必要在i/o模型上钻太多牛角尖.

论坛徽章:
0
33 [报告]
发表于 2008-07-18 09:10 |只看该作者
3.0GHz的CPU, 配上4个1Gbps网卡,理论上有4Gbps的网络I/O. 瓶颈会在哪?
缓存拷贝的开销的很大的. 线程切换代价也大. 多线程比较适合需要阻塞的场合.

通信模型是只能依赖于OS, 剩下的是应用层.
我现在的思路,只有选择epoll, 然后应用层协议栈参考TCP/IP, sk_buff/mmap.

据我查的资料, UNIX-like操作系统的网络I/O还没有实现内核级的异步. 如果把epoll封装一下,看起来也会像kqueue或iocp.

论坛徽章:
0
34 [报告]
发表于 2008-07-18 09:28 |只看该作者
原帖由 zsniper 于 2008-7-17 17:09 发表
libevent可以解决超时问题,自己写的话,效率没有那么高,


当然我也写过一个用红黑树实现的超时,效率不高。。。。


我用的libevent-1.3的版本,他是用堆排序作的。可以参考一下。。


谢谢各位!
用开源库首先会增加函数堆栈. 像ACE虽然适跨合平台,但也会有代价.   libevent应该是个不错的选择.

论坛徽章:
0
35 [报告]
发表于 2008-07-18 09:32 |只看该作者
原帖由 fm971 于 2008-7-18 09:10 发表
3.0GHz的CPU, 配上4个1Gbps网卡,理论上有4Gbps的网络I/O. 瓶颈会在哪?
缓存拷贝的开销的很大的. 线程切换代价也大. 多线程比较适合需要阻塞的场合.

通信模型是只能依赖于OS, 剩下的是应用层.
我现在的思路 ...



多线程适合阻塞的场合???谬论!!!!

看过HAHS,LF这些框架吗?再次建议你多看看POSA2

还需要说明的是,epoll本身就是以kqueue为蓝板开发的,所以在原理上kqueue和epoll一样,但不等同于IOCP,

其实IOCP已经是一种框架了,而kqueue和epoll只是一种内核通知应用程序事件的API。

想要封装epoll,其实就是做个框架,跟你本身做底层的想法又冲突了,请问LZ,你到底想做什么???

[ 本帖最后由 zsniper 于 2008-7-18 09:35 编辑 ]

论坛徽章:
0
36 [报告]
发表于 2008-07-18 10:02 |只看该作者
原帖由 cookis 于 2008-7-17 17:41 发表
这个得通过你应用层的心跳来控制吧..



心跳不能处理那些恶意客户端,连上来什么事情也不做的,只回复你的心跳数据包~,占着你的socket

所以说,心跳只是一个理论的方法,实际上需要一些其他技术。

[ 本帖最后由 zsniper 于 2008-7-18 10:08 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
37 [报告]
发表于 2008-07-18 10:35 |只看该作者

回复 #31 zsniper 的帖子

就像QQ msn 都有心跳, 让服务器知道它们还活着.. 而不是网络中断, 或主机已经断电, 或程序崩溃, 这样才好管理这些client,
而不是一直持有它们所占的资源.

我昨晚看了一下livevent 的 active timeout 机制, 它类似ACE的Heap_Timer的实现, 用堆排序, 将距离超时最近的放在顶端.
你为什么用红黑树呢, 红黑树只是查找快一些, 但timeout这种机制只是需要得到最大或最小的元素, 堆结构正适合,


我没有细看. 我猜libevet只是检测 是否在限定时间内收到第一个数据包. 是吧..

但如果有大量的无效的连接上来. 也发了一些程序不认识的数据, 那应用程序也是没有办法的.

我觉得这最好还是由应用层来控制, 为每一次会话作一个状态机, 当收到连接时, 生成一个会话对象, 由定时器来定时检测每个状态是否超时.
这些通信库提供的功能越简单越高效, 越稳定, 况且又不是所有人都有那样的需求.

[ 本帖最后由 cookis 于 2008-7-18 10:37 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
38 [报告]
发表于 2008-07-18 10:38 |只看该作者
原帖由 zsniper 于 2008-7-18 10:02 发表



心跳不能处理那些恶意客户端,连上来什么事情也不做的,只回复你的心跳数据包~,占着你的socket

所以说,心跳只是一个理论的方法,实际上需要一些其他技术。



你的心跳应该定制一个消息格式吧..恶意连接怎么会知道这个格式呢.

论坛徽章:
0
39 [报告]
发表于 2008-07-18 10:38 |只看该作者
原帖由 zsniper 于 2008-7-18 09:32 发表



多线程适合阻塞的场合???谬论!!!!

看过HAHS,LF这些框架吗?再次建议你多看看POSA2

还需要说明的是,epoll本身就是以kqueue为蓝板开发的,所以在原理上kqueue和epoll一样,但不等同于IOCP,
...


多谢指正. 我的目标当然是要实现最大的网络I/O吞吐能力.

HAHS/LF/POSA2有它的适应场合. 但不是用在这种纯粹的网络I/O.
做以前的项目没看过mbuf,HAHS, 但我的实现思路是一样的.
有些人把事件通知模型封装成类似的异步模型. 我也不了解kqueue原来是事件. 不过像IOCP的效率也已经不错了.

论坛徽章:
0
40 [报告]
发表于 2008-07-18 10:45 |只看该作者
原帖由 cookis 于 2008-7-18 10:35 发表
就像QQ msn 都有心跳, 让服务器知道它们还活着.. 而不是网络中断, 或主机已经断电, 或程序崩溃, 这样才好管理这些client,
而不是一直持有它们所占的资源.

我昨晚看了一下livevent 的 active timeout 机制,
...........
我觉得这最好还是由应用层来控制, 为每一次会话作一个状态机, 当收到连接时, 生成一个会话对象, 由定时器来定时检测每个状态是否超时.
这些通信库提供的功能越简单越高效, 越稳定, 况且又不是所有人都有那样的需求. ...



想法不错.  在少量的线程里面, 甚至单线程, 要处理上万个socket, 你说这个定时器还能怎么实现?
我的理解也只有排序和查找.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP