深度 | 从Go高性能日志库zap看如何实现高性能Go组件

本文深入分析了Uber开源的Go高性能日志库zap的架构和实现,揭示了zap高性能的秘密,包括对象复用、避免反射和竞态条件等,并探讨了如何构建高性能Go组件。通过对比zap与其他日志库,强调了zap在性能和设计上的优势。
摘要由CSDN通过智能技术生成

导语:zap是uber开源的Go高性能日志库。本文作者深入分析了zap的架构设计和具体实现,揭示了zap高效的原因。并且对如何构建高性能Go语言库给出自己的建议。


作者简介:李子昂,美图公司架构平台系统研发工程师,从事长连接服务和分布式存储组件的研发和支持。


摘要

日志在整个工程实践中的重要性不言而喻,在选择日志组件的时候也有多方面的考量。详细、正确和及时的反馈是必不可少的,但是整个性能表现是否也是必要考虑的点呢?美图技术团队在长期的实践中发现有的日志组件对于计算资源的消耗十分巨大,这将导致整个服务成本的居高不下。此文从设计原理深度分析了 zap 的设计与实现上的权衡,也希望整个的选择、考量的过程能给其他的技术团队在开发高性能的 Go 组件时带来一定的借鉴意义。

前言

日志作为整个代码行为的记录,是程序执行逻辑和异常最直接的反馈。对于整个系统来说,日志是至关重要的组成部分。通过分析日志我们不仅可以发现系统的问题,同时日志中也蕴含了大量有价值可以被挖掘的信息,因此合理地记录日志是十分必要的。

我们部门的技术大牛做过精辟的总结:

拔高到哲学或方法论的角度来讲,无论是人或项目质量的进步,还是异常情况的及时发现和排查,至关重要的一点就是详细、正确、及时地反馈。而日志和监控就是用来提供反馈的最强有力的手段。当然,最差的情况就是什么都不管,等到用户发现问题来反馈,不过这样恐怕只能去人才市场了(这一段你可以当我在扯淡)。

我们的业务通常会记录大量的 Debug 日志,但在实际测试过程中,发现我们使用的日志库 seelog 性能存在严重的瓶颈,在我们的对比结果中发现:zap 表现非常突出,单线程 Qps 也是 logrus、seelog 的数倍。

在分析源码后 zap 设计与实现上的考量让我感到受益颇多,在这里我们主要分享一下以下几个方面:

  1. zap 为何有这么高的性能

  2. 对于我们自己的开发有什么值得借鉴的地方

  3. 如何正确的使用 Go 开发高性能的组件

Why zap?

绝大多数的代码中的写日志通常通过各式各样的日志库来实现。日志库提供了丰富的功能,对于 Go 开发者来说大家常用的日志组件通常会有以下几种,下面简单的总结了常用的日志组件的特点:

  • seelog: 最早的日志组件之一,功能强大但是性能不佳,不过给社区后来的日志库在设计上提供了很多的启发。

  • logrus: 代码清晰简单,同时提供结构化的日志,性能较好。

  • zap: uber 开源的高性能日志库,面向高性能并且也确实做到了高性能。

Zap 代码并不是很多,不到 5000 行,比 seelog 少多了( 8000 行左右), 但比logrus(不到 2000 行)要多很多。为什么我们会选择 zap 呢?在下文中将为大家阐述。

640?wx_fmt=jpeg

Zap 跟 logrus 以及目前主流的 Go 语言 log 类似,提倡采用结构化的日志格式,而不是将所有消息放到消息体中,简单来讲,日志有两个概念:字段和消息。字段用来结构化输出错误相关的上下文环境,而消息简明扼要的阐述错误本身。

比如,用户不存在的错误消息可以这么打印:

上面 User does not exist 是消息, 而 uid 是字段。具体设计思想可以参考 logrus的文档 ,这里不再赘述。

其实我们最初的实践中并没有意识到日志框架的性能的重要性,直到开发后期进行系统的 benchmark 总是不尽人意,而且在不同的日志级别下性能差距明显。通过 go profiling 看到日志组件对于计算资源的消耗十分巨大,因此决心将其替换为一个高性能的日志框架,这也是选择用 zap 的一个重要的考量的点。

目前我们使用 zap 已有2年多的时间,zap 很好地解决了日志组件的低性能的问题。目前 zap 也从 beta 发布到了 1.8版本,对于 zap 我们不仅仅看到它的高性能,更重要的是理解它的设计与工程实践。日志属于 io 密集型的组件,这类组件如何做到高性能低成本,这也将直接影响到服务成本。

zap, how ?

zap 具体表现如何呢?抛开 zap 的设计我们不谈,现在让我们单纯来看一个日志库究竟需要哪些元素:

  1. 首先要有输入:输入的数据应该被良好的组织且易于编码,并且还要有高效的空间利用率ÿ

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值