Go建站性能优化,别让GC停顿拖垮你的QPS
发布时间:2026-10-09 03:43:03 所属栏目:优化 来源:DaWei
导读:GC 停顿把接口拖进泥潭才是真坑上周三凌晨两点十四分,运维小张盯着 Grafana 面板骂了句娘,P99 从三十毫秒飙到四百七十二毫秒,QPS 从两千一百掉到六百三十。我拿 pprof 在三点零二分抓了堆采样,看到 runtime.mallocgc 占
|
GC 停顿把接口拖进泥潭才是真坑 上周三凌晨两点十四分,运维小张盯着 Grafana 面板骂了句娘,P99 从三十毫秒飙到四百七十二毫秒,QPS 从两千一百掉到六百三十。 我拿 pprof 在三点零二分抓了堆采样,看到 runtime.mallocgc 占了 cpu 的百分之三十八,tmp_bak_tbl 里堆着三百七十万行没清的 session 字段。 二〇一一年我做电商秒杀,用 PHP 5.3 顶双十一,当时靠加八台物理机把并发顶到四百,现在 Go 1.21 居然被 GC 搞成这样简直荒唐。 老张拍着机箱说这破服务根本不用上云,自己写的对象池绝对比默认 GC 稳。 GOGC 调到二十反而更惨 昨天上午十点五十,我把 GOGC 从一百改到二十,以为提前回收能救场,结果十分钟里 GC 次数从一百二十涨到九百四十次,STW 累计十七秒。 我用工单系统翻到前年日志,发现 tmp_bak_tbl 的 deleted_at 字段从来没建索引,慢查询返回 502 的次数一天有两百七十次。 小李昨天在周会上冷笑,说你这调参简直瞎搞,然后甩给我一张火焰图。 二〇一五年我带团队做支付清结算,用 Oracle 11g 跑批,每晚落库三十万笔,靠半夜停 GC 窗口保平安,现在 Go 的 GOGC 简直是个陷阱。
文章配图,仅供参考 对象池才是保 QPS 的土法子我周三下午四点二十用 go tool trace 看了调度,发现两百万次小对象分配里有八成活不过一次请求,全推给 GC 简直浪费。 老王边啃煎饼边嘟囔,说你赶紧上 sync.Pool 啊,别死磕默认回收。 我上周五在测试环境写了个临时变量名 obj_tmp 的池子,压测时两百并发下 P99 压到五十一毫秒,QPS 回到一千九百。 二〇一九年我做直播弹幕,用 Redis 4.0 做消峰,当时单机扛三百连接就报警,如今 Go 不加池子绝对不行。 debug 输出别留 production 里 上个月十二号,线上 pod 突然 OOM,k8s 重启了十一次,我看 pod logs 里全是 fmt.Println 打的结构体。 小赵指着屏幕吼,你这代码堪称屎山,留调试输出根本没法看。 我用 delve 在周一早九点零三分 attach 进程,看到 mallocgc 因 debug 对象没法回收多耗了二十三秒。 二〇一三年我做站内信,用 MySQL 5.6 存草稿,当时表里有十二个冗余字段没人清,如今 Go 的 runtime 远比那时娇气。 改用 GOFLAGS 关掉内联后好些 我昨天下午两点用 GOFLAGS=-g 重编了二进制,benchmark 里 allocs/op 从三千七百降到九百一十。 老周抽着烟说这招居然比换版本管用。 二〇一七年我弄报表系统,用 PostgreSQL 9.6 跑聚合,当时靠物化视图把时延砍掉四十秒,现在 Go 不调编译简直白搭。 GC 不是背锅侠,写法是病根 两百并发压测时,我把 tmp_bak_tbl 的脏读关了,QPS 立马从七百冲到一千四百。 我今早六点用 prometheus 抓指标,看到 goroutine 泄漏数从两万掉到三百。 小孙拍桌子说你早该删那破字段。 二〇一〇年我做论坛,用 discuz 7.2 撑五百人在线,当时靠静态化把负载降了十八倍,如今 Go 不收拾代码绝对垮。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Go站长聚会:全链路运维瓶颈一战打通
Go驱动实时大数据引擎:15年网安视角下的性能优化