IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Skynet 的一些改进和进展

云风的 BLOG 2012-08-20 23:37:36 累计浏览 2,112 次
本机暂存

    最近我的工作都围绕 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 上看看效果了。

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. Git常用命令备忘 (累计阅读 54,701)
  2. gen_tcp发送进程被挂起起因分析及对策 (累计阅读 37,821)
  3. Git log diff config高级进阶 (累计阅读 24,844)
  4. Git subtree 要不要使用 –squash 参数 (累计阅读 23,398)
  5. 我的git笔记 (累计阅读 20,260)
  6. 公司倒了,请让领导先走 (累计阅读 13,407)
  7. 别为大公司拼命(译文) (累计阅读 10,299)
  8. PHP程序的执行流程 (累计阅读 10,034)
  9. 几个内存相关面试题(c/c++) (累计阅读 9,447)
  10. 一个大二学生有关如何成为一名软件工程师的疑问及答复 (累计阅读 9,181)