Go服务器性能调优:14年运维实战,QPS翻倍路径
|
文章配图,仅供参考 去年二月份,甲方在国贸三期那间玻璃会议室里转笔转了四十七分钟——我数的,他左手小指第二节有道旧疤,转到第四十二下时笔尖卡进指甲缝,停了三秒。投影仪嗡嗡响,像台没擦油的老拖拉机,屏幕右下角飘着“信号源:笔记本”,但笔记本明明连的是HDMI口。桌上那盘橙子放了三天,表皮起皱,最上面那只被谁用指甲抠过一道白痕,没人吃。他说:“先做出来看看。” 我原以为这回能喘口气——毕竟Go写得熟,pprof开一半就敢上生产。结果第一版跑完压测,QPS卡在380,日志里全是context canceled,panic堆栈从http.HandlerFunc一直捅到runtime.goexit底下。查了一天,发现他们自己写的中间件里,for循环里new了一个带超时的context,timeout设成5秒,但外层HTTP handler timeout只设了2秒。两个timeout打架,context一死,下游goroutine全飘在半空。我改完,QPS升到412。他们说:“加个功能,首页轮播图点进去要跳小程序。”我说小程序没授权域名,他们说“你弄个跳转就行”。我弄了个302,QPS掉回367——redirect多一层TCP握手,又没复用连接池。我懒得说了。 销售老张坐旁边啃包子,韭菜馅儿漏在领带上。他微信问我“客户说UI颜色不对,改下蓝底换成青灰,今晚能上线吗”,我回一条微信分三步:先切分支,再改CSS变量,最后git push完才想起来忘了删调试用的console.log。等CI跑完,已过凌晨一点。第二天晨会,客户盯着屏说:“怎么还是蓝的?”我调出devtools——他浏览器开了个插件叫“Color Enhancer”,把所有#00bfff自动映射成#66cccc。我没吱声。他补了句:“改个颜色还要加钱?” 电梯里遇见上个客户的CTO,他看见我就往角落缩,手里捏着张单据——是我们去年七月帮他做的订单服务,上线第三天,他运维同事半夜打我电话,说CPU打满,top看全是runtime.mallocgc。我远程连过去,他grep了十遍没grep出那行defer json.NewEncoder(resp).Encode(data),而data是张300MB的结构体。我说你别defer啊,他说“Go不是推荐defer关资源么”,我当场把手机举到电梯镜面里照了照自己脸——黑眼圈快垂到锁骨了。 这次更绝。上线那天下午四点,客户突然要源码。合同里写得清楚:“交付可执行二进制及部署文档”,但他助理在群里发语音:“王工,老板说源码才是资产,不给源码怎么算交付?”我说:“那您把服务器root密码给我,我帮您把二进制反编译成Go源码?”她回了个微笑表情包。五点零七分,客户本人打来电话:“能不能包排名?搜我们品牌词,首页前三。”我说百度SEO跟Go后端没关系,他停顿两秒:“那…你们是不是也做前端?”我没挂,等他继续说。他没说。电话忙音持续了十一秒。 QPS翻倍这事,根本不是调出来的。是熬出来的——熬掉三版GC策略、两套连接池参数、一个手写的ring buffer缓存。最后卡在内存分配器上。pprof heap显示87%的alloc来自strings.Builder.Grow,追进去一看,他们业务逻辑里有个函数,每秒调用12万次,入参是手机号,函数干的事是:把号码拆成单字符,挨个转string,再strings.Join。我改成bytes.Buffer预分配32字节,QPS从620跳到910。他们验收报告上写:“性能显著提升”,连个冒号都没加。尾款没结,拖了两个月。 我前天路过西直门那个打印店,看见老板正撕一张“淘宝同款系统”的海报,纸边卷着,墨还没干透。他跟我说,上个月接了个活,客户也是这么说的:“做个淘宝那样的”,预算三千。老板真做了——首页用Vue CLI搭,商品列表调了个mock API,下单按钮弹alert(“支付成功”)。客户付了两千八,剩下二百说“等上线再结”。上线当天,alert字体太小,客户让他改。他改完,客户说“还要加个客服入口”,他加了个QQ群二维码。群聊里客户发截图:“这个二维码扫出来是腾讯文档,我要的是人工客服。”老板回:“人工客服得雇人。”客户撤回了这句话,再没说话。现在那张海报还贴在他店里窗上,被雨洇出一圈黄边。 优胜劣汰——不是服务器淘汰慢代码,是客户淘汰肯改三次蓝底色的人。我早该懂的。Go跑得再快,也跑不过合同里没写的那一行:“若需求描述模糊,以甲方首次口头表述为准”。这次亏在哪?亏在没让客户亲笔签那份《非功能性需求确认单》,里面第三条写着:“‘先做出来看看’不构成正式需求输入,亦不可作为验收依据”。我原以为大家心知肚明。结果他真拿着手机录音去仲裁委了,放的是我那句“行,先做出来看看”。声音很清晰,空调外机轰隆隆盖不住。 下回合同里这条必须写死:凡未列于《附录B:量化性能指标清单》中的任何“优化”“提升”“翻倍”,一律视为新需求,单价按基础开发费率1.8倍计,且须预付50%。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


VR开发编译优化与性能调优实战