免费注册 查看新帖 |

Chinaunix

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

[其他] 【实测比较half-sync-half-async模式与leader-follower模式的性能与场景(直播)】 [复制链接]

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
51 [报告]
发表于 2013-02-16 18:55 |只看该作者
yulihua49 发表于 2013-02-16 18:48
很高兴交流,我也有收获。


嘿嘿, 我还是觉得我收获比较大, 这一个flag可以让我写一个单线程epoll, 然后创建N个线程就变成了多线程epoll。。我会乱说吗- -

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
52 [报告]
发表于 2013-02-16 18:57 |只看该作者
本帖最后由 yulihua49 于 2013-02-16 19:06 编辑
linux_c_py_php 发表于 2013-02-16 18:52
如果不提供遍历在线用户的功能的话, 这么做的确可以无锁, 我1楼的代码里也是这么折腾的.

如果遍历在 ...

我们的context里有这个东西。
有时要检测是否有长期挂起的连接,长期不合理占用资源的。。。。
context里还要有应用自定义的数据区(会话数据区),用以表达应用工作的状态。不能使用全局数据,也不能使用线程数据和栈数据。

论坛徽章:
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
53 [报告]
发表于 2013-02-16 19:07 来自手机 |只看该作者
有个东东叫timeout...
以HTTP为例,其实你只需要记录所有的keepalive/persistent连接,对于短连接,设好读写timeout就不用管它了
如果你确实需要遍历所有连接,那就要确保用于记录连接数据的记录有正确的生存期,因为很可能在你遍历的时候连接就结束了,如果不小心程序会崩。
我一般会用一个无锁的双链表加一个后台的延时reaper

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
54 [报告]
发表于 2013-02-16 19:09 |只看该作者
windoze 发表于 2013-02-16 19:07
有个东东叫timeout...
以HTTP为例,其实你只需要记录所有的keepalive/persistent连接,对于短连接,设好读 ...

对,context里包含好几个timeout,有客户端的timeout,有下一段链接的timeout。。。。。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
55 [报告]
发表于 2013-02-16 19:22 |只看该作者
本帖最后由 linux_c_py_php 于 2013-02-16 19:27 编辑
yulihua49 发表于 2013-02-16 19:09
对,context里包含好几个timeout,有客户端的timeout,有下一段链接的timeout。。。。。


但如果真是需要遍历, 还是用一个预分配的fd索引的连接数组来维护连接信息, 我想了个路子, 但不能解决及时性, 可能A关了fd=2, 但B依旧会向fd=2广播信息:

可以通过一个无锁的flag先行标记连接, 但不close fd, 只取消epoll register, 然后通过一个独立单线程扫整个数组, 独立线程啥时候扫可以用pipe事件做不阻塞的通知, 扫的时候就是检测到flag=true就先重置信息最后close. 这时候, 那些线程池就能accept复用这个fd了. (不知道靠不靠谱... 这个线程能不能忙死)



上面当我没说, 还是会有并发行为, 广播者可能与扫线程同时操作该连接的内存, 只要广播者没意识到flag, 并且扫线程意识到了flag.

无锁链表是什么技术, 求地址科普.

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
56 [报告]
发表于 2013-02-16 19:23 |只看该作者
嗯, timeout和lifetime可以保证连接能及时关闭, 但无锁的遍历需求还是需要单独设计一下.

yulihua49 发表于 2013-02-16 19:09
对,context里包含好几个timeout,有客户端的timeout,有下一段链接的timeout。。。。。

论坛徽章:
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
57 [报告]
发表于 2013-02-16 19:29 来自手机 |只看该作者
如果你要遍历,就不能在连接结束时删除context;如果你不在连接结束时删除context,就必须在后台延迟回收。
如果回收是延迟的,那么无锁的需求用一个双链表就可以了,正向的链用于遍历,反向的链用于删除context后修复链表。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
58 [报告]
发表于 2013-02-16 19:36 |只看该作者
windoze 发表于 2013-02-16 19:29
如果你要遍历,就不能在连接结束时删除context;如果你不在连接结束时删除context,就必须在后台延迟回收。 ...


需要详细给我讲讲, 完全无锁真心理解不了, 求重点.

1, 连接建立后, 用什么结构体维护连接.
2, 连接断开后, 用什么结构体延迟排队.
3, 怎么保证无锁延迟删除的, 比如你正在延迟删除操作, 而另一个线程正在广播.

论坛徽章:
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
59 [报告]
发表于 2013-02-16 20:05 |只看该作者
回复 57# linux_c_py_php

用什么结构体保存连接本身的信息没关系,关键是如何把这些信息汇集起来
一个不动脑子的方案可以是这样:
1. 建立一个双链表
2. 新连接建立后,将连接信息插入表尾

  1. context->next=NULL;
  2. context->prev=tail;
  3. tail->next=context;
  4. tail=context;
复制代码
3. 连接结束后,将该连接从链表中摘除,在context中记录结束的时间戳,然后传递给后台的reaper thread

  1. context->prev->next=context->next;
  2. context->next->prev=context->prev;
  3. context->prev=reaper_list_tail;
复制代码
4. reaper thread维护另外一个反向的单链表,这个链表只使用/调整prev指针,不修改next指针,reaper定期扫描这个链表,将时间戳老于一定阈值的节点回收,其它节点不变。

  1. while(1) {
  2.     context_t *p=reaper_list_tail;
  3.     context_t *prev;
  4.     while(prev=p, p=p->prev) {
  5.         if(old_enough(p)){
  6.             prev->prev=p;
  7.             reap(p);
  8.         }
  9.     }
  10. }
复制代码
5. 遍历连接时,只单向遍历,只使用next指针,这样可以保证即使某个连接在遍历期间被放入了reaper链表,它的next依然指向一个存活的context(虽然不一定是有效的)

  1. for(context_t *p=head; p; p=p->next) {
  2.     // do something with p
  3. }
复制代码
整个过程差不多就是这样。

上述代码只在ARM/X86/X86_64这些Strong Order的平台下能工作(前提是我脑子没发晕,代码没写错,这个可能性……哼哼……很小……),对于其它平台需要引入memory order,并且需要编译器不要自作聪明调整代码顺序。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
60 [报告]
发表于 2013-02-16 20:16 |只看该作者
windoze 发表于 2013-02-16 20:05
回复 57# linux_c_py_php

用什么结构体保存连接本身的信息没关系,关键是如何把这些信息汇集起来


-,- 整个过程都不需要锁吗...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP