« Skynet 集群及 RPC | 返回首页 | 记录一个并发引起的 bug »

Skynet 的一些改进和进展

最近我的工作都围绕 skynet 的开发展开。

因为这个项目是继承的 Erlang 老版本的设计来重新用 C 编写的。 再一些接口定义上也存在一些历史遗留问题. 我需要尽量兼容老版本, 这样才能把上层代码较容易的迁移过来。

最近的开发已经涉及具体业务流程了, 搬迁了不少老代码过来。 我不想污染放在外面的开源版本。 所以在开发机上同时维护了两个分支, 同时对应到 github 的公开仓库, 以及我们项目的开发仓库。

btw, 我想把自己的开发机上一个分支版本对应到办公室仓库的 master 分支, 遇到了许多麻烦。 应该是我对 git 的工作流不熟悉导致的。

我的开发机的 master 对应着 github 上的 master , 但我大多数时间在一个叫 ejoy 的分支上开发。

这个分支对应到办公室服务器的 master 分支上。这里需要 git config push upstream 设置一下,不然每次 push 分支都需要指名。

偶尔,我会修改一些 bug 以及加一些基础特性,这个时候,我从 ejoy 分支切换到 master 上修改。修改完后,我会切回 ejoy 上,做 rebase master 。 似乎,这个流程用 merge 要好一些。因为 rebase 后,就不能 push 到办公室的仓库上了。(需要加 -f )

目前没有精力去搞清楚 git 的正确工作流,暂时把这个问题放一边吧。


最近几个比较大的改动是,增加了一个对外建立连接的服务 (connection) 。 建立起连接上,就让这个服务把所有外部连接上的数据推送到指定节点。

我一开始的设计是有问题的。我企图采用拉的方式来工作。定义了拉数据的接口: 拉一行(设定行分割符), 以及拉指定数据块。问题在于,在异步操作环境下,有可能同时在一个连接上发起几次异步操作,在需要多步分析数据流的情况中,很可能无法得到正确的结果。


无论是 gate 的接收外部连接, 还是 connection 发起外部连接,处理 skynet 系统外的数据,都和内部数据包的流通有所不同。因为,外部包是可以组合成任何内部布局并加以处理的(可以有指针),而外部数据则必须是连续数据块,并有一定的包分割规则。

认清这个不同点,我就增加了内部和外部数据的识别方式(之前的版本是认为可以隐藏掉这个细节的)。我的方法是用了一个特殊的 session 号 (0x7fffffff) 。因为 session id 是由 skynet 自己递增产生的,所以不会有冲突。

为了兼容之前的通讯协议,以及 rpc 协议。我增加了过滤器模块,可以把老的协议过滤成新的格式。这个等全部移植工作做完再去掉。

同时,为了提高性能,增加了重定向包的接口,在做一些中间设施时,能减少包的复制。


在我把一些基础设施补全后,尤其是在我实现了和老的服务器集群对接模块后,我发现之前用 zeromq 实现的内部集群通讯模块显的很冗余。绑上 zeromq 这么一个重量级的库,却没用上多少功能,很是不爽。

所以我最终重写了一千多行代码,替换掉了原来使用 zeromq 的 harbor 模块。使用 zeromq 其实并没有减少总代码量(原来也有将近一千行代码)。


目前,我已经把原有的独立的认证服务的集群替换到新 skynet 上了。并可以和老的游戏服务器集群对接。这是第一步,完全替换掉游戏服务器底层还需要一点时间。

这可以让我做一些压力测试了。

我们用的类似 Kerberos 的认证授权协议。中间涉及多个服务间的通讯。以及对数据库的查询操作。整个流程还是很复杂的。我觉得有一定的测试意义。

初步测试结果,比之前的框架提高了 3-4 倍的性能。当然,这个测试很初步,不太能说明问题。有很多环节会导致老的框架表现不佳。但在简单的 echo 服务测试中,性能提升就不明显了。

我希望在所有移植工作做完后,再来做详细细致的评测工作。至少我对新的 skynet 可以 100% 把握,可以细致的监控每一行 C 代码。暂时也想不到框架上可以有大的性能提升的余地了。

btw, 在一些简单测试中,通过 profile ,发现其实大量 CPU 花在服务自己的 lua 虚拟机上。占掉了 80% 以上的时间。这些是跟框架(全部用 C 实现)是无关的。要提升这一点,恐怕下一步工作需要把 lua 5.2 迁移到 luajit2 上看看效果了。

Comments

那个erlang程序员被解雇了?

想研究 没时间
等后面闲一点以后好好拜读大牛的作品

去年11月份时,看你在博客里讲妥协同事使用erlang做服务器时,就隐隐感觉以后会返工……
毕竟对每个字节每条指令都锱铢必较的C程序员,很难放弃“精确掌控程序里每一字节内存的使用、每一行C语句占用CPU周期”的踏实感觉……

试试把lua换成forth?

发现个小问题:int64.c:38 lua_typename(L,1)


skynet已经研习过,很多启发~


居然沙发~~MARK

Post a comment

非这个主题相关的留言请到:留言本