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 上看看效果了。
建议继续学习:
- Skynet 设计综述 (阅读:2267)
- Skynet 集群及 RPC (阅读:1986)
- 记录一个并发引起的 bug (阅读:1934)
- 为什么 skynet 提供的包协议只用 2 个字节表示包长度 (阅读:1132)
- 代理服务和过载保护 (阅读:838)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:云风的 BLOG 来源: 云风的 BLOG
- 标签: Skynet
- 发布时间:2012-08-20 23:37:36
- [2528] 代理的加密部分
- [1329] 创业笔记 | 从0到1开公司是什么体验
- [649] vimgtd-在vim(gvim)中实现GT
- [574] 查找第K小的元素
- [73] Oracle MTS模式下 进程地址与会话信
- [65] Go Reflect 性能
- [64] 如何拿下简短的域名
- [64] 【社会化设计】自我(self)部分――欢迎区
- [63] 图书馆的世界纪录
- [61] android 开发入门