« 带可可学数学 | 返回首页

Skynet 升级到 Lua 5.5.0

Lua 5.5.0 已经正式发布。所以,skynet 的 Lua 版本也随之升级。

skynet 维护了一份修改版的 Lua ,允许在多个虚拟机之间共享函数原型。这可以节省初始化 Lua 服务的时间,减少内存占用。

跨虚拟机共享函数原型最困难的部分是函数原型会引用常量字符串,而 Lua 在处理短字符串时,需要在虚拟机内部做 interning 。所以 skynet 的这个 patch 主要解决的是正确处理被 interning 的短字符串和从外部导入的函数原型中包含的字符串共存的问题。具体方法记录在这篇 blog 中

这个 patch 的副产品是允许在多个 Lua VM 间共享常量表。打了这个 patch 后,就可以使用 skynet.sharetable 这个库共享只读常量表了。

这次 Lua 5.5 的更新引入了 external strings 这个特性,已经大幅度提升了 Lua 加载字节码的速度。我比较倾向于在未来不再依赖额外的 patch 减少维护成本。所以建议新项目避免再使用共享常量表,减少对 patch 过的 Lua 版本的依赖。


Lua 5.5 基本上兼容 Lua 5.4 ,我认为绝大多数 skynet 项目都不需要特别改动。但在升级后,还是建议充分测试。注意:更新仓库后,需要用 make cleanall 清除 lua 的编译中间文件,强制 Lua 重新编译。直接 make clean 并不清理它们。

Lua 5.5 有几处更新我认为值得升级:

  1. 增加了 global 关键字。对减少拼写错误引起的 bug 很有帮助。skynet 自身代码暂时还没有使用,但后续会逐步添加。

  2. 分代 GC 的主流程改为步进式进行。过去版本如果采用分代模式,对于内存占用较大的服务,容易造成停顿。所以这类服务往往需要切换为步进模式。升级到 Lua 5.5 后,应该就不需要了。

  3. 新的不定长参数语法 ...args 可以用 table 形式访问不定长参数列表。以后可以简化一部分 skynet 中 Lua 代码的实现。

Comments

个人论坛https://spssluntan.webboard.org/
skynet 的所有历史版本到最新版都不依赖修改版的 Lua (你可以换成官方版本 lua 编译),只有 skynet.sharetable 依赖。 修改版的 Lua 对 skynet 的意义在于:当你创建数千个服务时,可以节省不少内存并加快服务启动速度。如果你的架构只有不到 100 个服务,我认为意义不大。
我有两个问题想请教一下: 1.当前版本的 skynet 不使用 skynet.sharetable 能否正常使用? 2.如果不使用 skynet.sharetable,当前版本的 skynet 能否使用官方版 lua?
今年会更新skynet release版本吗
我在寻找用更标准的方法实现 sharetable ,暂时没有找到。 因为我觉得维护 lua 的 patch 有一定的压力。
为了LUA更好的普及,希望能将LUA5.5手册翻译一下
意思是skynet.sharetable未来要废弃了么?还是会重新实现一个?
> 已经大幅度减少了 Lua 加载字节码的速度 “减少”->“提升”

Post a comment

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