golang 踩的坑
defer机制下的 lock unlock
4核16G
阿里云redis
阿里云mongo
阿里云zk
最近项目快上了 然后出现了 4000人压测 单服登陆过慢。。1min 以上 查了下 发现是
lock()
defer unlock()
操作redis mongo
在申请lock 前 等待时间过长
一开始 意味是defer存在性能问题
查找官方API
发现 go 1.13 优化了defer性能 提高30% 恰巧项目版本是1.12 果断升级一下
然而 并没有有效的解决问题* 1min左右
然后我就继续排查
底层获取redis数据 使用 Get方法
嗯 HGET读比GET快哦 我登陆是读
把GET SET 修改为 HGET HSET
40s左右
再查 登陆有多次redis 交互 获取白名单 维护状态
redis是单线程 读取速度达到百万级 看似并发
减少redis的交互 改主要是 白名单 维护状态 为zk读取
35s左右
哦吼 提高redis的速度能解决 那就压缩数据看看
var in bytes.Buffer //js 数据压缩
w := zlib.NewWriter(&in)
w.Write([]byte(persistData))
w.Close()
this.redisClient.HSet(getUserDataKey(uid), "", in.String() )
30s左右
继续加油把。。。