作者klsdf (静雨澪)
看板C_and_CPP
标题[问题] 多执行绪伺服器设计问题
时间Thu Mar 14 22:53:42 2019
版上各位先进好:
小弟我目前在设计多执行绪的伺服器上遇到效能瓶颈,
底层的Socket Server是用Boost::Asio,
单纯用single io_service & multiple thread的架构处理效能还不错,
但目前系统上都会需要封包指令是要将某个index要对应到某个session,
所以只好在accept时把index跟session存入到map中,这时就需要使用lock去做保护,
因为加了这个lock导致在一秒内如果是上万的连线数要aceept延迟就会提高,
後面开始run的过程中因为我使用的是shared_mutex,
所以对map纯读(shared_lock)感觉效能还可以。
如果是单纯读写分离的Queue还可以用boost::lockfree去处理,
但遇到真的架构上就需要有一个map,这种情况就不知道怎麽优化它,
想问版上的各位先进有什麽设计方向可供我参考,谢谢。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.117.102.47
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1552575225.A.E28.html
1F:→ Schottky: 问题在於你为什麽会设计成一秒需要 accept 上万次吧 03/14 23:04
老板的需求 QQ
2F:推 easyman: vector 存 index + session, 就不用lock ? 03/15 00:27
index是int64_t, 直接先配置好vector好像有点太大, 还有session连线断线的问题势必要lock
3F:→ tinlans: 白说这问题打成英文上 stackoverflow 问应该会比较好 03/15 02:30
4F:→ tinlans: 坦白说 03/15 02:30
5F:→ tinlans: 目前可以知道的资讯有点少,也许你目前这层可以复制 N 个 03/15 02:35
6F:→ tinlans: docker containers 去跑起来,然後最前端再挡个类似负载 03/15 02:36
7F:→ tinlans: 平衡的东西,譬如根据 index % N 的值来转发封包给对应的 03/15 02:36
8F:→ tinlans: container 处理这个 request。这种解法比较偏向架构解, 03/15 02:38
9F:→ tinlans: 考量将来 scalability 的话你早晚要做类似的工。如果你只 03/15 02:39
10F:→ tinlans: 打算先集中在程式解,那试试看起多个 io_context 有没有 03/15 02:40
11F:→ tinlans: 什麽用吧。 03/15 02:40
12F:→ tinlans: io_service 在新版 boost 已经 deprecated 了。 03/15 02:41
13F:→ tinlans: 简单讲的话目的都是先增加你程式的入口数,然後把原本因 03/15 02:47
14F:→ tinlans: 为 lock 变成瓶颈的单一大资料块拆分成多个。 03/15 02:48
其实就是GameServer的入口, index就是玩家资料在DB的ID,
资料转到其他Service去处理完後,再丢回给GameServer传给对应的玩家,
所以它才需要一个ID跟Session的Map,
目前的确我是有设计类似加开分流的概念去处理这件事,
但不同的Server的游戏逻辑是不互通的, 所以还是想增加单个伺服器的承载量.
※ 编辑: klsdf (122.117.102.47), 03/15/2019 07:10:46
15F:→ tinlans: 这种东西连线建立以後就不需要再反覆 accept 了,每秒上 03/15 12:13
16F:→ tinlans: 万次的连线需求是怎麽出现的?毕竟不是 http 这种连完 03/15 12:14
17F:→ tinlans: 一次就断一次的连线型态。 03/15 12:14
18F:→ sarafciel: int64_t你也用不完呀 实务上你抓个可以涵盖峰值的大小 03/15 14:32
19F:→ sarafciel: 配就好了 而且vector要锁最起码可以个别锁呀 03/15 14:35
20F:推 ketrobo: 每一条连线有平均与最大的耗用资源量,同时估计一下resp 03/16 07:29
21F:→ ketrobo: onse time/CPU时间,找出一台机器的服务上限,对应的sess 03/16 07:29
22F:→ ketrobo: ion数量一次配置完,连线对应固定的索引值就不用map了 03/16 07:29
主要是索引值是玩家的编号 即使知道目前的帐号数量pre-allocate
但对新注册的帐号没有用, 不过使用vector跟随机存取的想法我可能可以多想一下
※ 编辑: klsdf (122.117.102.47), 03/17/2019 00:08:03
23F:推 steve1012: 写个load balancer 03/17 01:02
25F:→ LiloHuang: 若非得查表可考虑使用 tbb::concurrent_unordered_map 03/17 20:09