游戏服务器工程实践四:可观测之prometheus+grafana+日志mcp
用 prometheus 做观测是大家都在做的事,关键是要对什么做观测,以及怎么做观测,以下总结一些实践。 1. 常见数据的观测 1.1 请求延迟数据的观测 可以统计几个项:延迟分布,avg延迟,最近请求量(总/成功/失败),请求QPS。 大致效果: 图1:请求延迟grafana展示 1、延迟分布 需要的指标(分桶统计各个延迟区间的请求量): xx_latent_stat...
用 prometheus 做观测是大家都在做的事,关键是要对什么做观测,以及怎么做观测,以下总结一些实践。 1. 常见数据的观测 1.1 请求延迟数据的观测 可以统计几个项:延迟分布,avg延迟,最近请求量(总/成功/失败),请求QPS。 大致效果: 图1:请求延迟grafana展示 1、延迟分布 需要的指标(分桶统计各个延迟区间的请求量): xx_latent_stat...
资源的有效释放始终是个艰难的问题。特别是在具体的业务逻辑中,由于逻辑的多变和复杂,导致出错的可能性大大增加。 举个例子,游戏服务器,一个房间等到所有人都不在的时候就被销毁。而当房主退出的时候,要踢出所有人。假设所有人退出都走同样的 exit 逻辑,并且在 exit 逻辑里面判断人数为 0 时销毁房间,就会变得很糟糕,因为 exit 调用其他 exit,如果中间有个环节出错,就会出现房间不释...
AI 善用 AI 近些年出现的最大变量就是 AI,它开始影响整个人类世界,影响我们每一个人。作为码农,受到的冲击和震撼是最大的。你可以抱怨 AI 经常把事情搞砸,但不得不承认,它比你聪明太多太多了。唯一的问题就在于,你能不能用好它?为什么大神们说要2000个小时的使用才算熟练呢?因为这个阶段,它还没法完全替代人类,所以它还是个工具,只要是工具,就有个熟悉的过程,你精通它的各种特性并熟练的...
以下是 gemini 给的,很简洁清晰。 一、关于四元数 理解四元数(Quaternion)确实是一个挑战,因为它们涉及到四维空间的数学,不仅难以在脑海中通过图像直观构想,而且其运算法则也比较反直觉。 为了让你真正理解它,我们不能只看公式。我们需要从你已经熟悉的知识出发,一步步搭建通往四元数的桥梁。 我们将分四个步骤来拆解: 类比: 从复数(2D 旋转)推导到四元数(3D ...
公司今年7月份给我们集体采购了 cursor。这很好,我就不需要自己每月付 $20 买 cursor pro 会员了。 最近或者说早就领悟到的一个道理:快比完美重要。所以 vibe coding 完全是 ok 的,人类可以只做 review 和验证。不要怕上线跪,多 review 多验证,问题不大的。近期基本在用 gpt-5,它的能力比 claude-4-sonnet 强,产出的代码挺...
简单记录一下吧。 以前做的时候,针对 tcp 连接,想要玩家闪退闪连的时候,可以无缝的重连,所以用了消息 cache 的方案。这种方案的优点是短时间内重连的话,体验会比较好,比如下发一个奖励通知,必然是可以被前端收到的,运营很喜欢这种体验。 但基于 cache 的方案有个明显的缺陷是 cache 消息量不能太大,否则对于后端是个比较大的负担。特别是我现在做的游戏,会一直推一些增量的 ao...
最近的工作需要做很多性能优化,会需要打 log,然后用 awk 做一些统计分析。而这些分析也需要写到文档里,我希望这些分析结果尽量是格式优雅的,所以经常要在 awk 输出的时候做一些对齐。 实际上我要的就是表头与数据项对齐,比如这样: type times objcnt cost(us) avgcost(us) 备注 1 3900 1 33.430 ...
什么是追求精确呢? 简单讲,就是要把事情搞清楚,不要模棱两可,A 就是 A,B 就是 B,说出来的东西要经得起推敲,不要靠猜测,要自己去考证、验证。 什么时候开始变得追求精确的呢,回忆起来大致是这么一个过程。 萌牙期 2016年,在给鹅厂做一款独代游戏的时候,那时我是服务端主程,需要做出一个能支撑百万以上同时在线的架构,并且还要能横向扩容,快速扩容,能在 30 分钟内再扩容百万在...
工作中有时候需要调试一下的,用 gdb 有时候效率不高,所以也会用一用 vscode 进行调试。大多数时候用日志看一看也就解决问题了,但有些情况下,还是得调试的,否则就要临时加好多 log。 这里只简单记录一下 vscode 远程调试 linux 上的 c++ 程序,具体操作参考这个文档:Debug code with Visual Studio Code,里面写得很详细了。 三个步...
之所以需要记录,是因为有些程序会使用 daemon 或 fork,这时候 gdb 可能没法 debug 到 fork 出来的子程序,需要做一点额外的工作。 1. gdb 的常规使用 gdb attach 进程 步骤 1、附加,gdb attach $pid 或 gdb -p $pid 。 2、设断点,b xxx.cpp:行号。 3、继续执行,输入 continue 或 c 。...
周四的时候,正式转正了。试用期有点长,半年。其实要到3月10号才满半年,提前了一点点。转正还有个稍正式的转正述职,正经写了文档,大佬们也正经对我进行了提问。 整个述职的过程,表达的最多的一个观点就是要保持清晰,要做充分的量化,只有这样,才能解决遇到的各种问题,包括性能问题。一切都要量化,分析清楚,而不是靠各种猜测,猜测只能找到找到线头,没法实际解决问题,反而还可能浪费时间。 近期,a...
工作遇到的问题,记录一下。正常情况下,这些都是很basic的,但有些祖传代码过于久远,过去没触发的问题,在当下的使用情形下就会出问题。所以,不是先人的锅,也不是后人的锅:)。 我们服务器的代码是 C++ & lua (lua 版本是 5.4.6),会用 64 位大整数(其实只用到63位)来构造用户的 ID,其中高 17 位是区域 ID(AID),低46位是自增 ID,即 UID =...
生活 去年国庆辞的职,休息了一段时间,去年 12 月底也迎来了一些好结果,人生总是会有些起伏。 今年上半年,基本上都是在做一些 ai 落地相关的东西,其实没啥技术含量,纯粹是帮帮忙。7,8 月的时候,感觉事情做完了,就准备重新找工作,写了一些文章,做了一些总结,然后在 8 月底的时候开始投简历,花了大概 2 个星期的时间找了份新工作。 其实就业市场还好,预期不要太高,总是可以找到工作的...
1. 概述 博客的图床用的是腾讯云的 cos,我的桶设置为了公有读私有写,因为私有读写太麻烦了,用起来不方便。而公有读私有写又有盗刷问题,我的 cos 是后付费的,而腾讯云又没法设置消费金额上限,那么当盗刷发生的时候,系统会把我的账户扣费成负数,除非我以后都不用腾讯云了,总需要把欠费补上的。 于是,为了防止被盗刷流量,做了一些研究。 方法一:设置防盗链 这种方式是设置 refer...
作者叫李小墨,非常有经验的阅读者,曾经做过记者,后来做自媒体,很成功。 这本书是对阅读方法非常好的总结,书里很多观点我也有总结出来过,所以有很强的共鸣。 1. 要点 记录一些我觉得重要的,有用的点。 通过笔记去精读 这本书最核心的点,在我看来,就是如何在阅读的时候做好笔记,这是最重要的阅读法。 这也是我最有共鸣的一点,其实无论是学习还是阅读,我认为做笔记都是最最重要的,超...
本文记录用全区全服的方式实现分区分服类型的游戏的一些思路。 持续更新,想到什么写什么。 1. 问题与挑战 今天跟一个大哥聊了用全区全服的架构做分区分服游戏的问题。这个让我想起了之前看过的一篇文章:《天美J3工作室服务器主程:我们怎么避免上线即炸服?》 。 用全区全服的方式来做分区分服,好处是: 合服或转服的场景,可以不用做数据迁移; 共用服务器、数据库,可以提高整体的...
本文记录 MongoDB 分片集群相关的一些信息,包括如何使用,注意事项,底层实现等。 持续更新,暂时有点零散,待资料收集完整后再一并整理。 1. 基本信息 MongoDB 从 1.6 版本开始支持 sharding;从 3.6 版本开始,要求 shard 以副本集部署;从 5.0 版本开始,支持修改 sharding key。 todo 分片集群性能的参照。 remov...
1. 前言 bigworld 的 load balance 算法的大致思路是知道的,即 动态区域分割 + 动态边界调整。但具体是怎么实现的,不清楚,网上也不找到相关的文章介绍,所以只能自己看代码进行分析。 本文大致记录我所分析到的算法实现,基于 bigworld 的这个开源版本:2014 BigWorld Open-Source Edition Code,更具体的信息可在我另一篇文章找到...
单服大世界的 scale 是游戏服务器的经典难题,已经被很多人研究过了。我对 scale 类的问题很感兴趣,所以研究得也比较多。 本文不会探讨 MMO 类的网游提升单服承载人数有没有意义,只单纯讨论技术上如何实现。 像 moba、fps、棋牌、体育竞技等 “开房间类型的游戏”,scale 起来比较简单。此类游戏的 pvp 一般是相对较少的玩家在一个小场景里进行对战,以这种小场景为单位去做...
1. 前言 bigworld 已经开源了它的代码,而我对于大世界的 scale 很感兴趣,所以就尝试把代码跑起来研究。但是,整个过程比我预想的复杂得多。 虽然能找到一些官方的帮助文档,但这些文档要么过旧,要么过于详尽,并且写的大多是一些自动化的操作,依赖的工具链很多,所以对于手动搭建没啥帮助,反而带来了不少困惑。 而网上,搜索不到其他人写的关于 bigworld 搭建的文章,所以只能结...
记录计算机体系结构相关的入门常识及资料。 1. 资料 1.1 书籍的搜索与下载 以下方法可以逐个尝试: 找到 doi,到 scihub https://sci-hub.st/ 搜索,一般可以找到。 书名 + pdf 到 google 搜索,比如 “Innovations in the Memory System pdf”。 ...
今天遇到一个 github page 的问题,记录一下。 1. 关于 github page github 有两种 page,一种是 user site,另一种是 project site。user site 只能有一个,project site 可以有 n 个。 user site 要求仓库名是 <username>.github.io,可以通过这样的 url : h...
我应该有资格写这篇文章,因为亲手设计过可以支撑百万级同时在线的全区全服类型的游戏服务器架构。 但这并不代表我有多牛,实际做过之后就会发现,这类游戏的架构设计很简单,做对几件事情就够了。 若干年前我在某公司任职时,参与研发过一款休闲类型的游戏,由 penguin 厂独代。研发的时候,p 厂要求我们的游戏服务器要能支撑百万以上的同时在线,并且要能在 30 分钟内扩容 100 万在线。 在经...
本文打算探讨 ACID 中的 C,因为它的定位有些模糊。 1. 正文 学得比较杂的朋友都知道,数据库事务模型的 ACID 里有个 C,分布式的 CAP 理论里也有个 C,刚好中文又都翻译成 “一致性”,就让人很头大了。 这个在《数据密集型应用系统设计》里有详细的介绍[1],读完后就很清晰了: CAP理论中,一致性一词用来表示线性化。 而在ACID中,一致性主要指数据库处...
前言 在 lua vm 中,upvalue 是一个重要的数据结构。upvalue 以一种高效的方式实现了词法作用域,使得函数能成为 lua 中的第一类值,也因其高效的设计,导致在实现上有点复杂。 函数 (proto) + upvalue 构成了闭包(closure),在 lua 中调用一个函数,实际上是调用一个闭包。upvalue 就相当于函数的上下文。 这种带 “上下文” 的函数,也...