Go服务器性能调优:避坑选型,QPS翻倍实战
|
文章配图,仅供参考 去年十一月份那会儿,运维突然在群里@我,说线上Go服务QPS卡在四千五上不去,监控大屏红得跟过年似的。我原以为只是常规的GC调参或者连接池配置问题,结果抓了三天pprof才发现——丫的根本不是代码问题,是选型踩了深坑。那会儿我正啃着煎饼果子,看到火焰图里`runtime.mallocgc`占了一半,差点把榨菜喷到屏幕上。先说最坑的:别信那些“Go天生适合高并发”的鬼话。我们之前用的某国产云服务商的“高性能”实例,号称支持百万QPS,结果压测时发现网络栈有硬伤——TCP_NODELAY默认没开不说,内核参数`net.ipv4.tcp_slow_start_after_idle`居然是1。更绝的是,他们家负载均衡会把长连接随机丢到不同CPU核心,导致`sync.Pool`的缓存命中率直接腰斩。我后来换到另一家云,光改这俩参数QPS就涨了三十个百分点,这钱花得比请架构师喝茅台还值。 再说说代码层面的“优胜劣汰”。有次为了省内存,把结构体里的`[]byte`全换成`string`,结果GC压力暴增——原来`string`在Go里是不可变类型,每次修改都会触发拷贝。更搞笑的是,我们团队有个新手为了“优化”JSON解析,自己写了套反射代码,结果性能比`encoding/json`还慢两倍。后来用`json-iterator/go`替换,QPS直接翻了一倍,这货现在还在群里发“求安慰”的表情包。 工位旁边的测试小哥昨天还在吐槽,说他们用`gRPC`时没开压缩,结果带宽吃满,QPS卡在两千八。我让他试试`grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(10 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


