最新 | 最热门 | 最高评价

+0  给 skynet 增加网络统计

Tag: skynet
云风 发于 2018年09月12日 17:36 | 点击: 466 | 展开摘要
skynet 在这个阶段的工作,主要是增强运行时内部信息的透明性。多提供运行时的统计数据可以为运维工作提供方便,也能为性能调优给出指导方向。

最近,我给 debug console 增加了 netstat 指令,以及提供了配套的 socket.netstat api 来获取这些数据。

这个指令可以获取 skynet 创建的所有 socket 的列表。每个 socket 归属于哪个 service ,每个 socket 上读写的字节数,最后一次读和写发生的时间,未写入系统挂

查看全文: http://www.udpwork.com/item/17086.html

+0  跟踪 skynet 服务间的消息请求及性能分析

Tag: skynet
云风 发于 2018年05月29日 15:50 | 点击: 549 | 展开摘要
skynet 中每个服务都是独立 lua 虚拟机,虽然服务间相互发起请求很容易,但业务复杂后,追踪业务逻辑却很麻烦。

我最近给 skynet 加了一个 skynet.trace() 命令,可以开启对当前执行序的跟踪统计。比如,在 example 的 agent 服务中,我们在每条 client 发起的请求处理时调用一次 skynet.trace() 就会得到下面这样的 log :

[:01000012] <TRACE :01000012-5> 95635285

查看全文: http://www.udpwork.com/item/16858.html

+0  skynet cluster 模块的一点优化

Tag: skynet
云风 发于 2018年04月17日 15:21 | 点击: 579 | 展开摘要
上周末,我对 skynet 的 cluster 模块做了一点优化。

cluster 模式 是 skynet 的一种集群方案,用于将多台机器更为弹性的组成一个集群。我们将每台机器都赋予一个名字,然后就可以在集群间用这个名字向对方推送消息或发起请求。

集群的管理是一项非常复杂的工作,skynet 作为一个轻量化的框架,只实现了最基本的基础设施。cluster 这个基础设施已实现的部分并不复杂。在每个 skynet 进程中,我们启动了一个叫 clusterd 的服务,专门用于集

查看全文: http://www.udpwork.com/item/16794.html

+0  skynet 1.1.0 发布

Tag: skynet
云风 发于 2017年10月31日 11:49 | 点击: 943 | 展开摘要
skynet 1.1 正式发布了。

这个版本的意义主要在于修补了一年前 2016 年 7 月发布 1.0 以来已经发现的 bug 。受益于 skynet 被越来越多的项目使用,很多我们自己使用时未能发现的 bug 通过 github 被定位和修复。

在这个版本中, lua 版本同步到了最新的 5.3.4 并打上了官方发布的 5 个 bugfix ,其中有几个还是我们在使用 skynet 时发现并汇报给 lua 官方的。jemalloc 也更新到了 5.0.1 。有同学报告

查看全文: http://www.udpwork.com/item/16483.html

+0  日程表服务

Tag: skynet
云风 发于 2017年09月07日 15:48 | 点击: 1114 | 展开摘要
skynet 的用户中,问的比较多的一个问题是,为什么我改了系统时间对 skynet 却没有生效?继续追问发现,有这个需求的人大多是想实现一个日程表,到某个特定时间触发特定的任务,修改系统时间是为了测试。

不得不说,通过修改系统时间来测试是个直接、却很糟糕的主意。skynet 的定时器也不依赖系统时间驱动,修改系统时间自然也不会生效。

日程服务是个普遍的需求。在国内网游里,你要不做什么节日任务、每周副本,基本不可能上线。这篇 blog 就谈谈这类需求应该在 skynet

查看全文: http://www.udpwork.com/item/16410.html

+0  skynet 1.1

Tag: skynet
云风 发于 2017年07月18日 14:59 | 点击: 652 | 展开摘要
拖了好多天,终于决定发布 skynet 1.1 了。

距上次计划做这件事 ,除了零星的 bugfix ,还多了一些比较大的变动。

skynet 的 lua 模块全部加上了 skynet 前缀,部分数据库 driver 放到了 skynet.db 下。如果需要兼容 1.0 的路径,可以在 config 中配置 lualib/compat10 这个目录。

网络线程针对有大量写操作的应用做了很大的优化 ,在一个 实际案例 中提高了 3.5 倍的效率。

增加了一个叫做 Dat

查看全文: http://www.udpwork.com/item/16351.html

+0  skynet 网络线程的一点优化

Tag: skynet
云风 发于 2017年06月19日 19:59 | 点击: 657 | 展开摘要
skynet 是一个注重并行业务处理的框架,设计它的初衷是可以充分利用多核 CPU 更好的处理那些比较消耗 CPU 的,天然可以并行的业务,比如网络游戏。网络 I/O 并不是优化重点。

基于这个设计动机,skynet 的网络层使用单线程实现。因为我认为,即使是代码量稍大一些的单线程程序,也会比代码量较小的多线程程序更容易理解,出 bug 的机会也更少。而且经典的网络服务程序,如 redis nginx 并没有因为单线程处理网络 IO 而变现得不堪,反而有不错的口碑。

所以

查看全文: http://www.udpwork.com/item/16310.html

+0  sharedata 的替代品:datasheet

Tag: skynet
云风 发于 2017年06月06日 16:45 | 点击: 649 | 展开摘要
skynet 中有一个用来在多个服务间共享数据表的模块,叫做 sharedata 。

它的设计动机是:当我们有很多服务时,如果需要共享一份只读的数据表,把数据表分别在每个服务类加载会很浪费内存。而且,一旦数据表有热更新的需求,分散在多个服务中的数据更新起来会比较麻烦。

我试过很多方案来达成这个需求,一直都不是特别满意。目前的 sharedata 模块是用的最久、使用项目最多的一个。虽然它基本可用,但使用它的同学也提出了一些问题,我对这些问题做了一些思考。

首先、它其实并

查看全文: http://www.udpwork.com/item/16293.html

+0  skynet 模块命名空间调整

Tag: skynet
云风 发于 2017年06月03日 21:58 | 点击: 837 | 展开摘要
前段时间有同学抱怨说 skynet 下提供的 lua 模块都没有名字空间,平坦的命名,容易和自己项目开发的模块命名冲突。虽然自己项目开发的模块可以单独给一个名字空间,但混杂在一起使用还是不美观。

我考虑了几天,决定在 skynet 1.1 版本中把大部分的模块都加上 skynet 前缀。

调整的模块有:

cluster : skynet.cluster

crypt : skynet.crypt

datacenter : skynet.datacenter

dns

查看全文: http://www.udpwork.com/item/16288.html

+0  epoll 的一个设计问题

Tag: skynet | 调试 | 语言与设计
云风 发于 2017年05月28日 11:17 | 点击: 995 | 展开摘要
问题的起因是 skynet 上的一个 issue ,大概是说 socket 线程陷入了无限循环,有个 fd 不断的产生新的消息,由于这条消息既不是 EPOLLIN 也不是 EPOLLOUT ,导致了 socket 线程不断地调用 epoll_wait 占满了 cpu 。

我在自己的机器上暂时无法重现问题,从分析上看,这个制造问题的 fd 是 0 ,也就是 stdin ,猜想和重定向有关系。

skynet 当初并没有处理 EPOLLERR 的情况(在 kqueue 中似乎没

查看全文: http://www.udpwork.com/item/16280.html

+0  Lua 表的差异同步

Tag: lua与虚拟机 | skynet | 优化与技巧
云风 发于 2017年05月18日 20:10 | 点击: 747 | 展开摘要
最近同事碰到的一个需求:需要频繁把一组数据在 skynet 中跨网络传递,而这组数据实际变化并不频繁,所以做了大量重复的序列化和传输工作。

更具体一点说,他在 skynet 中设计了一个网关节点,这个网关服务可以负责把一条消息广播给一组客户端,每个客户端由内部的一个 uuid 串识别,而每条消息都附带有客户端 uuid 列表。而实际上这些 uuid 列表组有大量的重复。每条广播消息都重复打包了列表组,且列表组有大量重复信息。

一开始我想的方法是专门针对这个需求设计一组协议

查看全文: http://www.udpwork.com/item/16269.html

+0  skynet cluster 模块的设计与编码协议

Tag: skynet
云风 发于 2017年03月25日 15:49 | 点击: 724 | 展开摘要
skynet 在最初的设计里,希望做一个分布式系统,抹平 actor 放在本机和处于网络两端的差别。所以,设计了 master/slave 模式。利用 4 个字节表示 actor 的地址,其高 8 位是节点编号,低 24 位是进程(节点)内的 id 。这样,在同一个系统中,不管处于哪个进程下,每个 actor (在 skynet 中被成为服务)都有唯一的地址。在投递消息时,无需关心目的地是在同一个进程内,还是通过网络来投递消息。

随后,我发现试图抹平网络和本地差异的想法不那

查看全文: http://www.udpwork.com/item/16188.html
|<<<1234567>>>| 一共8页, 85条记录