免费注册 查看新帖 |

Chinaunix

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

[其他] [基于Epoll内置Leader-Follower服务端实现, 已可达50万echo qps(全新支持Lua啦)] [复制链接]

论坛徽章:
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
71 [报告]
发表于 2013-09-14 21:49 |显示全部楼层
本帖最后由 yulihua49 于 2013-09-14 22:09 编辑
cxytz01 发表于 2013-09-12 15:29
lz,你的workerThread这里虽然弄成了多线程并行,但实际上EPOLLONESHOT这个选项使其变成了单线程模式。

...

有没有想过,在同一个group的线程里面,全都epoll_wait同一个epfd(假如是长链,那么就只有一个epfd),其中一个线程首先被成功唤醒,在被唤醒的同时,fd被反注册,接着,执行2、3、4步骤。其他线程此时还是阻塞在epoll_wait这里,就算fd里面有数据,也依然阻塞,只有到首先唤醒的线程执行完4步骤,其他线程才会成功唤醒。

你没弄明白吧?大家已经制作了无数的应用系统,进行了无数测试。你试试再说好吗?
事实是:其中一个线程首先被成功唤醒后,再隔3-7微秒就会唤醒下一个线程(如果有其它fd活动的话),不管先前唤醒的线程在干啥(与啥步骤毫无关系)。
这就是为什么单队列只能达到15Wqps左右。
压力测试的结果,所有线程都会动起来,CPU接近N×100%,所有核的负载也接近均衡。
”只热一次“,对这个激活的fd而言,而非对epfd。

论坛徽章:
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
72 [报告]
发表于 2014-01-14 14:05 |显示全部楼层
primer4 发表于 2014-01-13 16:26
[ 本帖最后由 primer4 于 2014-01-13 16:26 编辑 ]

server.c 编译不过

gcc server.c  -o server -lphread

论坛徽章:
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
73 [报告]
发表于 2015-09-07 10:57 |显示全部楼层
本帖最后由 yulihua49 于 2015-09-07 11:10 编辑
answer3y 发表于 2015-09-07 09:08
回复 1# linux_c_py_php

楼主已经说了,极端情况,每线程一个epfd。
这个在测试中性能最高。
但是在实际使用中,任务分派,每个任务的忙度不同,epfd划分的越细,负载均衡越困难。

所以我思考良久,还是采用一个进程一个epfd,多个线程处理。这样qps只能达到15万左右。
然后安排多个进程,甚至多台主机。前端加负载均衡器。这样负载均衡的效果要好一些。
10-15个进程也可以达到1百万的Tps。1Tps=2qps。一个事务需要2个qps来完成。

论坛徽章:
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
74 [报告]
发表于 2015-09-07 13:20 |显示全部楼层
本帖最后由 yulihua49 于 2015-09-07 13:29 编辑
answer3y 发表于 2015-09-07 12:00
回复 249# yulihua49

实际上每秒1000000的qps意义不大。如果每个request有2K数据(这是一般事务的量)你需要2K*8*1M=16G的带宽,现在的网络还普及不了这样的资源。

现在我的指标是65000Tps,2KByte/T,2K*8*65000=1G,正好是普及局域网的带宽,内部也正好是13Wqps。各服务器的CPU也正好是85%。(某种业务的特例,每笔业务大约是30k的json格式,压缩后大约2K)。

个别指标超过这个,是个浪费,因为别的资源跟不上,为个别指标付出代价是否值得。

论坛徽章:
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
75 [报告]
发表于 2015-09-07 13:37 |显示全部楼层
本帖最后由 yulihua49 于 2015-09-07 13:49 编辑
windoze 发表于 2015-09-07 12:38
回复 249# yulihua49

Fiberized.IO也有一模一样的问题,每一个fiber scheduler共用一个asio::io_servic ...

哪个客户端分给哪个io_service,就需要负载均衡。
如果任务是异质的,就需要动态智能负载均衡,我做过这个东西,效果还是很不错的。
可惜的是,它也是依赖epoll和线程池,也受到15Wqps的限制。
我那个东西用于一个带数据库的业务,总能力为3W Tps。所以应付的还不错。

所以我说,你不必搞什么多sched,这个指标,到这是个平台,超过这个数,就需要全新的架构,成本上台阶了。

论坛徽章:
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
76 [报告]
发表于 2015-09-08 15:32 |显示全部楼层
本帖最后由 yulihua49 于 2015-09-08 15:39 编辑
windoze 发表于 2015-09-07 15:18
回复 253# yulihua49

我正在搞GPU thread pool,它要和CPU thread pool分开调度,所以我才做了multi-sc ...

show一个我的协程池的工作日志。应该说明的是,由于打日志,改变了实际流程。否则应该交替的更频繁

  1. 5 CLIBG:127.0.0.1:70 09/08 14:52'14 RecvNet:tid=7FE9921FC700,socket=14,yield to schedle bcount=16348/402650
  2. 5 CLIBG:127.0.0.1:70 09/08 14:52'14 thread_work:tid=7FE9921FC700,fiber yield from TCB_no=70
  3. 5 CLIBG:127.0.0.1:70 09/08 14:52'14 thread_work:tid=7FE9921FC700,resume to TCB_no=70
  4. 5 CLIBG:127.0.0.1:70 09/08 14:52'14 RecvNet:tid=7FE9921FC700,socket=14,yield to schedle bcount=32732/402650
  5. 5 CLIBG:127.0.0.1:70 09/08 14:52'14 thread_work:tid=7FE9921FC700,fiber yield from TCB_no=70
  6. 5 CLIBG:127.0.0.1:70 09/08 14:52'14 thread_work:tid=7FE990DFA700,resume to TCB_no=70
  7. 5 CLIBG:127.0.0.1:70 09/08 14:52'14 RecvNet:tid=7FE990DFA700,socket=14,yield to schedle bcount=98268/402650
  8. 5 CLIBG:127.0.0.1:70 09/08 14:52'14 thread_work:tid=7FE990DFA700,fiber yield from TCB_no=70
  9. 5 CLIBG:127.0.0.1:70 09/08 14:52'14 thread_work:tid=7FE990DFA700,resume to TCB_no=70
  10. 5 CLIBG:127.0.0.1:70 09/08 14:52'14 RecvNet:tid=7FE990DFA700,socket=14,yield to schedle bcount=376796/402650
  11. 5 CLIBG:127.0.0.1:70 09/08 14:52'14 thread_work:tid=7FE990DFA700,fiber yield from TCB_no=70
  12. 5 CLIBG:127.0.0.1:70 09/08 14:52'14 thread_work:tid=7FE990DFA700,resume to TCB_no=70
  13. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:7FE9921FC700 create fiber for TCB_no=71
  14. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 RecvNet:tid=7FE9921FC700,socket=15,yield to schedle bcount=16348/422169
  15. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,fiber yield from TCB_no=71
  16. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,resume to TCB_no=71
  17. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 RecvNet:tid=7FE9921FC700,socket=15,yield to schedle bcount=32732/422169
  18. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,fiber yield from TCB_no=71
  19. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,resume to TCB_no=71
  20. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 RecvNet:tid=7FE9921FC700,socket=15,yield to schedle bcount=163804/422169
  21. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,fiber yield from TCB_no=71
  22. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,resume to TCB_no=71
  23. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 RecvNet:tid=7FE9921FC700,socket=15,yield to schedle bcount=180188/422169
  24. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,fiber yield from TCB_no=71
  25. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,resume to TCB_no=71
  26. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 RecvNet:tid=7FE9921FC700,socket=15,yield to schedle bcount=196572/422169
  27. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,fiber yield from TCB_no=71
  28. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,resume to TCB_no=71
  29. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 RecvNet:tid=7FE992BFD700,socket=16,yield to schedle bcount=32732/397007
  30. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 thread_work:tid=7FE992BFD700,fiber yield from TCB_no=72
  31. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,resume to TCB_no=71
  32. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 RecvNet:tid=7FE9921FC700,socket=15,yield to schedle bcount=180188/422169
  33. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,fiber yield from TCB_no=71
  34. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,resume to TCB_no=71
  35. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 RecvNet:tid=7FE9921FC700,socket=15,yield to schedle bcount=196572/422169
  36. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,fiber yield from TCB_no=71
  37. 5 CLIBG:127.0.0.1:71 09/08 14:52'14 thread_work:tid=7FE9921FC700,resume to TCB_no=71
  38. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 RecvNet:tid=7FE992BFD700,socket=16,yield to schedle bcount=32732/397007
  39. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 thread_work:tid=7FE992BFD700,fiber yield from TCB_no=72
  40. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 thread_work:tid=7FE992BFD700,resume to TCB_no=72
  41. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 RecvNet:tid=7FE992BFD700,socket=16,yield to schedle bcount=65500/397007
  42. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 thread_work:tid=7FE992BFD700,fiber yield from TCB_no=72
  43. 5 CLIBG:127.0.0.1:73 09/08 14:52'14 thread_work:7FE992BFD700 create fiber for TCB_no=73
  44. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 thread_work:tid=7FE9917FB700,resume to TCB_no=72
  45. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 RecvNet:tid=7FE9917FB700,socket=16,yield to schedle bcount=163804/397007
  46. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 thread_work:tid=7FE9917FB700,fiber yield from TCB_no=72
  47. 5 CLIBG:127.0.0.1:73 09/08 14:52'14 RecvNet:tid=7FE992BFD700,socket=17,yield to schedle bcount=163804/435097
  48. 5 CLIBG:127.0.0.1:73 09/08 14:52'14 thread_work:tid=7FE992BFD700,fiber yield from TCB_no=73
  49. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 thread_work:tid=7FE992BFD700,resume to TCB_no=72
  50. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 RecvNet:tid=7FE992BFD700,socket=16,yield to schedle bcount=278492/397007
  51. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 thread_work:tid=7FE992BFD700,fiber yield from TCB_no=72
  52. 5 CLIBG:127.0.0.1:72 09/08 14:52'14 thread_work:tid=7FE9917FB700,resume to TCB_no=72
  53. 5 CLIBG:127.0.0.1:73 09/08 14:52'14 thread_work:tid=7FE992BFD700,resume to TCB_no=73
  54. 5 CLIBG:127.0.0.1:73 09/08 14:52'14 RecvNet:tid=7FE992BFD700,socket=17,yield to schedle bcount=212956/435097
  55. 5 CLIBG:127.0.0.1:73 09/08 14:52'14 thread_work:tid=7FE992BFD700,fiber yield from TCB_no=73
  56. 5 CLIBG:127.0.0.1:73 09/08 14:52'14 thread_work:tid=7FE992BFD700,resume to TCB_no=73
  57. 4 CLIBG:127.0.0.1:70 09/08 14:52'14 do_work: TCB_no=70,tid=7FE9921FC700,PROTO_NUM=3 pkg_len=5519827,t_len=402650,O_NODE=0,USEC=3650770334140237
  58. 4 CLIBG:127.0.0.1:71 09/08 14:52'14 do_work: TCB_no=71,tid=7FE9921FC700,PROTO_NUM=3 pkg_len=5549250,t_len=422169,O_NODE=0,USEC=3650770334148224
  59. 4 CLIBG:127.0.0.1:72 09/08 14:52'14 do_work: TCB_no=72,tid=7FE992BFD700,PROTO_NUM=3 pkg_len=5658893,t_len=397007,O_NODE=0,USEC=3650770334187568
  60. 4 CLIBG:127.0.0.1:73 09/08 14:52'14 do_work: TCB_no=73,tid=7FE992BFD700,PROTO_NUM=3 pkg_len=5568378,t_len=435097,O_NODE=0,USEC=3650770334219294

复制代码
注意39-56行,两个线程对两个任务,交替进行。
可以说,在NIO下,qps会更少,因为收一个大包要激活epoll好多次。对于一个任务而言,显然要比SIO耗时长。

论坛徽章:
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
77 [报告]
发表于 2015-09-09 13:54 |显示全部楼层
windoze 发表于 2015-09-08 16:55
回复 255# yulihua49

这不是显然的么?AsyncIO的优势本来就不在响应处理速度,而在于支持大规模并发。

是。网络上有人企图使用AIO/NIO提升处理速度。在非并发环境这是不可能的。

论坛徽章:
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
78 [报告]
发表于 2016-10-09 20:36 |显示全部楼层
本帖最后由 yulihua49 于 2016-10-09 20:41 编辑
mordorwww 发表于 2016-09-30 15:06
想问下, linux下ASIO和epoll/poll/select啥区别呢

epoll,poll,select并非ASIO,而是事件触发机制,一般用于fd,当有事件时激活线程。它们可以辅助用于NIO(NON Block IO),或AIO。
poll和select用于M:1  类型的事件,即:M个fd,由一个线程守候。epoll多用于M:N,即:M个fd由N个线程守候。
也就是说,它们是实现ASIO的一种内部机制。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP