golang 线上 GC 导致业务延迟问题排查

问题描述

前几天算法部门的同事来找我们说线上有个算法逻辑接口单台机器请求量并不大(才几百的 QPS),平时基本无延迟,但是时不时的会出现很多 400ms 以上甚至几秒的延迟,这是他们所不能接受的(他们最大容忍400ms延迟),于是想让我帮助排查一下。

排查

于是我让他们在线上开启一台机器的 pprof 试着分析问题,开始觉得不太像gc问题引起的,因为他们之前给到了 GC 的日志:

日志显示 STW 时间并不算很长,几十毫秒的STW,第一反应以为不是 gc 的问题。
这时没有其他办法了,只好用 trace 抓数据分析了。
分析 trace 发现其中一个主要业务逻辑有一些较大的延迟,并且是阻塞在调度时间和gc暂停上。

难道是调度器也有问题?
看下协程数,也只有几百个,并不算多。
于是再仔细查看trace数据发现进行 gc 的时候STW时间虽然不长,但是它会占用其他 P 辅助进行 GC,导致网络首发等其他业务逻辑有较大影响:

于是询问他们,他们用了开源的缓存库放了很大的缓存,所有建议他们减少缓存并自己实现尽量复用内存减少临时分配。

结果

昨天他们和我说减少缓存后问题解决了。
看来 go 的 GC 还是一个比较大的问题。在低延迟的服务上还是尽量减少内存分配做复用。
也希望官方尽快解决编译器还存在的一些内存逃逸问题~

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

请输入正确的验证码