游戏卡顿白皮书 › L13 服务器架构与运维
日志/监控过载 Logging / monitoring overhead
原因 ID in-monitoring · 主责 研发团队·服务器开发 · 配合 运维团队·系统运维
在含图示和实验的完整版中打开此卡片 →
出故障时日志会激增,同步发送日志的服务器会被日志拖得更慢。
起因 出错时日志、指标的发送量激增 → 结果 日志采集器处理不过来,同步发送的服务器只能等待 → 画面表现 故障时出现的一卡一卡、卡住,因日志而更加严重
- 症状
- 一卡一卡, 卡住
- 因素
- 停顿
- 谁会遇到
- 全服
- 何时出现
- 人多的时候, 偶尔随机
- 负责方
- 主责 研发团队·服务器开发 · 配合 运维团队·系统运维
- 研发团队要做的事
- 异步发送,采样,缓冲区满了就丢弃,相同的错误日志合并发送。
- 运维团队要做的事
- 按故障时的激增量规划日志采集器容量,设置采集器积压告警。
- 监控图上
- 偶发随机尖峰 · 日志发送量,日志采集器队列
- 查看位置
- 把服务器每秒日志行数、字节数和日志采集 agent 的队列、丢弃数与 tick 耗时放在一起看。有停住的线程,用 bcc offcputime -p 看是否在等日志写入、发送
- 确认依据
- tick 冲高时日志量飙升到平时的几十倍,游戏线程的等待时间集中在日志写入、发送的调用栈上
- 排除依据
- 日志量与平时相同,或游戏线程没有在日志上等待,日志激增就只是故障的结果,要另外找最先报错的原因
- 确认手段
- 运维工具即可确认(无需游戏代码)
出处
- Logging in C# Microsoft
.NET 的日志方法是同步的,存储慢时建议不要直接写入,先写到快的存储再转移 - Asynchronous loggers Apache Software Foundation
异步日志用队列吸收短时激增,但输出持续偏慢时队列会被填满,速度降到最慢那个输出的水平,或按策略丢弃日志(Discard) - Demonstrations of offcputime, the Linux eBPF/bcc version IO Visor
按调用栈汇总线程停住、离开 CPU 的时间(off-CPU),-p 指定进程
相关原因
同一层:L13 服务器架构与运维
其他层中同样导致“一卡一卡”的原因
查看含图示和实验的原卡片