首页 > 其他分享 >skynet框架:lua service支持监控告警

skynet框架:lua service支持监控告警

时间:2024-03-23 14:35:25浏览次数:25  
标签:服务 service yield lua 消息 skynet 协程 告警

问题场景是:服务A生产大量请求消息call到服务B,服务B瞬间达到消费能力的瓶颈,导致服务A堆积大量的yield状态协程,服务B消息队列堆积大量待处理消息,业务上出现卡顿、超时甚至物理机器内存吃满被瞬间击穿的问题;

我们使用云服务器产品部署游戏业务,起因是游戏线上收到反馈在某些时间节点频繁出现卡顿延迟现象,查看云服务器机器实例监控信息发现某单点节点内存明显波动,业务定位到指定服务,skynet控制台打印当前任务数量、打印指定服务消息队列长度超2w。

这看上去只需要简单做一些优化就能避免上述问题,比如将服务B扩展成批量服务、控制服务A的请求频率等,这里想讨论的是,如何在游戏内加入监控并抛出类似的性能风险;

(1)调整服务消息队列长度阈值告警;通过skynet_mq_overload

(2)增加yield协程数量阈值告警;统计一个yield_cnt值(比如简单地在coroutine yield时自增),服务启动时开启定时心跳检查,当yield_cnt值超出阈值时抛出提示信息;

ps: skynet通过lua-coroutine机制将异步回调的消息处理模型模拟出rpc调用的效果—> 服务处理消息时,会为消息分配(get or new)一个协程,在协程内执行消息的处理逻辑,当处理流程中发生对服务外的消息发送时,yield挂起协程,等待收到对应session的RESPONSE消息回应后,重新resume唤起协程继续往下执行处理逻辑;协程的唤醒依赖引起yield操作的那次call操作的回应。

标签:服务,service,yield,lua,消息,skynet,协程,告警
From: https://www.cnblogs.com/linxx-/p/18091083

相关文章

  • skynet框架:跨进程组播实现方案
    存在业务场景,从单点进程(source)批量向集群内其他节点(target)推送消息,目标节点数量可能达三位数。提供一个实现方案:target上开启进程内的组播服务,只负责当前节点的组播推送业务;服务支持接收其他节点的通知消息(目标服务只在所在节点内的组播服务上做订阅等操作,由该组播服务负责管理......
  • 游戏开发:移植golang共享库 for lua
    一些奇奇怪怪的尝试:)随笔记录下将golang模块导出为共享库供lua使用(一般用于功能模块适配和迁移),这里给出一个借助c语言实现中间层通信的方案(不要问我为什么不使用ffi)。假设使用go实现底层模块core,export相关API(如下例的G_Signature)供外部使用,这里是被C层使用。那么需要将go模块编......
  • skynet框架:量级可控的定时任务管理模块
    存在业务玩法,在单个场景内大量使用定时事件用于触发数据更新。skynet的定时器模块实现已经非常高效,一般不必太担心性能问题,事实上玩法的初版实现正是直接使用框架定时器处理触发。几个方面是期望做得更好的:减少外部消息。框架的定时事件是通过消息机制通知到指定service的,而单......
  • lua/c开发:c库共享运行时状态
    场景是多个c扩展库(forlua)之间需要共享运行时的状态数据,期望是不使用lua逻辑介入;记录一个方案:通过lua全局注册表C扩展库中一些数据通过全局注册表放入lua状态机。最方便且能保证唯一性的key是一个lightuserdata。使用一个static变量的地址作为key在注册表做索引保存需要......
  • lua/c开发:c-object for lua
    c+lua开发中常见的实现:c库实现功能,供lua调用;比如排行榜模块(跳表),实现方案可为:c库实现跳表(skiplist)核心逻辑,提供接口供lua层中操作使用;那么c库显然有以下的实现(伪码,演示用)://skiplistcorestructskiplist{//...};structskiplist*skiplist_create();voidskipli......
  • lua/c开发:lua增加自定义require方式
    我们会有需要自定义加载模块逻辑的需求,比如支持从自定义格式数据包中加载一个被加密过的lua文件的方式,这在生产环境中非常常见,可以有效保护源码同时保持整洁;lua模块管理库会从若干个loader中逐个尝试加载模块,lua原生提供了4个loader;staticconstlua_CFunctionsearchers[]={......
  • lua/c开发:只读数据共享方案
    这里只讨论单一进程内的只读数据共享。同一进程内虚拟内存空间是原本就共享的(以C为例),但在业务开发上,一般会嵌入脚本语言,使用VM的沙盒环境独立维护不同的上下文(以lua为例),多个VM之间(暂时称为业务VM)的数据相互独立。业务上涉及数据共享的,一般的场景是优化性能、资源占用的情况。需......
  • skynet框架:全服广播业务
    存在业务场景,对当前在线玩家发送消息通知。这里将消息生产的服务称为source,目标玩家服务称为target。对单个玩家使用独立的lua虚拟机进行代理,称为agent,承载agent的节点称为user。区分source和target是否存在于相同的skynet节点:如果处于相同的节点,那么只是单服内进行一次进程内......
  • [转帖]Evaluating Garnet's Performance Benefits
    EvaluatingGarnet'sPerformanceBenefitsEvaluatingGarnet'sPerformanceBenefits|Garnet(microsoft.github.io) Wehavetested Garnet thoroughlyinavarietyofdeploymentmodes:SamelocalmachineforclientandserverTwolocalmachines-......
  • 魔兽世界LUA插件开发与示例
    魔兽世界LUA插件开发1.创建插件1.1创建插件文件夹打开WorldofWarcraft\Interface\AddOns文件下,在该文件夹下创建一个插件名文件夹用来存放插件,如Makubex1.2创建插件文件在该文件夹下创建俩个文件,一个是用来给魔兽世界引入的toc头文件,一个是你自己的lua脚本文......