存证服务优化
· 2 min read
现象:存证服务在服务启动时,日志写入速度比较快,会随着时间变得越来越慢。
两个方面:
1、日志错误使用导致对象map内存频繁创建与map扩容。 2、一些查询慢 SQL 导致的,慢 SQL 也会导致大量的日志产生。
主要看了 go-zero 的日志结构,
产出点:文档,之前啥样,现在啥样
产出点:指标在里面:之前的串行,订阅慢数值,现在的数值,量化的指标。
串行改并行,方案是什么?
日志记录的时间,一些指标。
target 是用 量化的指标 来描述。
写日志时间不增,微增。
压测20万笔上传文件,会产生 80 万笔 event 事件。
日志大小、处理耗时统计
日志耗时优化
日志使用方式不对导致的
h.logger = h.logger.WithFields(util.ConvertToLogxFields(logFields)...)
logger 是一个全局对象,这种用法会有问题。
慢 SQL 优化
通过 access.log 日志看出
slow.log
explain sql --> 添加索引
优化服务编译后二进制大小
1.1 使用-ldflags
移除调试信息
通过 -ldflags
参数去除符号表和调试数据:
go build -ldflags="-s -w" -o app main.go
-s
:去除符号表信息-w
:去除 DWARF 调试信息
效果:体积减少20%-30%,且不影响运行时性能,但会失去调试能力,因此主要用于生产环境。
1.2 使用-trimpath
去除编译路径信息
go build -trimpath -ldflags="-s -w" main.go
upx 二进制压缩
使用UPX对编译后的文件进行极限压缩
upx --best --lzma app
upx 主要参数:
--best
:使用最佳压缩算法--lzma
:使用 LZMA 压缩算法(通常比默认的压缩率更高)--brute
:尝试所有压缩方法(压缩率最高,但耗时最长)
禁用CGO
若无需调用C库,设置CGO_ENABLED=0
避免链接C动态库:
CGO_ENABLED=0 go build -ldflags="-s -w" -o app main.go