Skip to main content

存证服务优化

· 2 min read
immortal zhang

现象:存证服务在服务启动时,日志写入速度比较快,会随着时间变得越来越慢。

两个方面:

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