查看原文
其他

Go 1.12 正式版来袭!聊聊值得关注的新特性

oschina 开源中国 2019-04-27

作者 | lni

编辑 | 局长


“Go 2 还会远吗?” “会的……”

Go 1.12 来了

Go 语言开发团队于今天发布了 Go 1.12 正式版。

一如既往地,该版本会保持对 Go 1.x 系列的兼容,官方承诺所有 Go 程序都能像以前一样编译和运行。

根据官方的发布公告,Go 1.12 更新亮点包括:对 Go module 的正式支持初步的 TLS 1.3 支持、支持 windows/arm 以及提升对 macOS 和 iOS 的向前兼容性,另外就是对 runtime 和标准库的各项提升。

其中,安全传输层协议 TLS 1.3 于之前版本相比,废弃了有安全隐患的 3DES、RC4、AES-CBC 等加密组件和 SHA1、MD5 等哈希算法,带来了更高的性能和安全性。

此外,针对工具方面也有所改进,例如 trace 引入了对 minimum mutator utilization 图的支持,更方便对 GC 性能进行调校。

谈谈 Go 1.12 值得关注的新特性

简单地罗列新特性并不能体会到它们对开发带来的改进,所以倒不如以实际项目为背景,从实际项目角度详解各项新特性。

下面我们不妨以一个基于 Go 语言的开源项目 —— 高性能分布式共识算法库为背景,详解介绍 Go 1.12 的各项新特性。

Dragonboat 是一个高性能 Go 实现的多组 Raft 共识算法库,同时提供 C++11 支持。Dragonboat 是目前 github.com 上速度最快的 Raft 开源实现。

Go Module 支持

Go 发布的上一个版本中,对 Go module 的初步支持是默认关闭的,这暗示了它尚遗留着很多实现的问题。事实上,当时 replace 的支持连 module、package、import path 这三个最基本概念都是含混的。

而在 Go 1.12 中,这些问题都得到了解决,Go module 的正式发布又关闭了一条无脑喷 Go 的路径,真正的 Go 用户可以更安心方便地使用 Go。

以 Dragonboat 为例,对于普通用户,如下所示的两行 go.mod 就完整定义了 Dragonboat 库的依赖情况。

module github.com/lni/dragonboat
require github.com/golang/protobuf v1.2.0

Dragopnboat 所用的 Monkey Test 需要 Drummer 包,它的额外依赖中含有 golang.org 下的数个包。我们需要用位于 github.com 上的官方镜像来代替它们。

Go module 的 replace 支持可以通过在 go.mod 文件中增加下列替换条目,将受影响的 import path 进行替换。示例如下:

replace (
golang.org/x/build => github.com/golang/build v0.0.0-20190215225244-0261b66eb045
golang.org/x/text => github.com/golang/text v0.3.0
)

更低的 STW 延迟

Go 1.12 的 STW 停顿较 1.11 版本又有明显的缩短。

下图是 Dragonboat 在每秒处理超过800万次16字节的 proposals 时由 runtime.ReadMemStats 报告的120个连续 GC 周期的 STW 停顿值,1.12 与 1.11 对比,STW 明显下降,由350微秒降至250微秒左右。

对 Minimum Mutator Utilization 图的支持

Mutator Utilization 衡量的是 GC 耗费的资源外,应用究竟获得了多少 CPU 资源。Minimum Mutator Utilization 图则是在不同的时间窗口上呈现应用至少可以获得多少 CPU 资源。

Go 1.12 的 trace 工具加入了 Minimum Mutator Utilization 图的支持,它可以极其方便地发现 GC 性能受限的情况。

下图是 Dragonboat 在处理16字节的 proposals 时的 Minimum Mutator Utilization 图。从图上可见,在时间窗口小于250微秒的时候,应用最坏情况下得不到任何 CPU,这是因为 STW 的长度基本就是250微秒。而当时间窗口不断放大,Minimum Mutator Utilization 快速上升并趋向于 100%,最后基本稳定于 98% 左右。

这表示从整个 trace 的执行周期看(最大时间窗口),最坏情况下应用可以保证得到 98% 的 CPU 时间。可见,本例没有任何针对 GC 进行优化的价值了。

Dragonboat 在处理1024字节的 proposals 时的 Minimum Mutator Utilization 图则展现了另外一个局面。

在1.3毫秒内,应用最坏情况可以获得的 CPU 资源都是 0,暗示此时 STW 比16字节时高一个数量级。而随着时间窗口的扩大,Minimum Mutator Utilization 逐渐逼近并稳定于 90% 左右,从整个 trace 的执行周期看,最坏情况下应用可以保证得到 90% 的 CPU 时间。

更高的 STW、更多的 GC 所占用的 CPU 资源都清楚显示,在此场景下继续做内存使用的优化是一定预期收益的,而且 Minimum Mutator Utilization 相当直观方便。

初步的 TLS 1.3 支持

Go 1.12 较为及时地提供了初步的 TLS 1.3 支持。

TLS 1.3 淘汰了 DES、MD5、RC4、SHA1 之类的博物馆级别的老旧且有明确安全隐患的算法,支持通过一个 RTT 完成所需准备并建立安全链接。

根据 Go 1.12 内建的 TLS 1.3 性能跑分来看,TLS 1.3 的跑分性能和 1.2 差别不大,未来也还有一定优化空间。有兴趣的可以在自己的目标服务器上测试跑分性能:

go test -v crypto/tls -run=$^ -bench BenchmarkThroughput

TLS 1.3 的 0-RTT 特性尚未提供支持,关于该功能本身的安全隐患的讨论,与 Go 这种通用语言的标准库实现并无太大关系,这里不展开。

其它各项改进

与 Dragonboat 这种高性能、分布式系统库相关的一些改进还有:

  • Timer 与 Deadline 的性能得到了优化,在 connection 上设置 deadline 的代价降低

  • 默认启用 TCP KeepAlive

  • OS 包开始提供 UserHomeDir 函数,不再需要使用第三方库进行跨平台支持

  • 在 macOS 上调用 File.Sync 并不能确保实际落盘的问题已解决

具体的改进和变更请查看 Go 1.12 文档↓↓↓
https://golang.org/doc/go1.12

Go 1.12 下载地址 https://golang.org/dl/

最后,感谢阅读!

作者介绍

lni,GitHub 主页 https://github.com/lni。

欢迎关注由 lni 开源的高性能分布式共识库 Dragonboat。

Dragonboat 是一个高性能 Go 实现的多组 Raft 共识算法库,同时提供 C++11 支持。Raft 这样的共识算法使得只要系统中的多数成员在线便可使得系统持续运行。比如,一个拥有5台服务器的 Raft 集群中即使有两台服务器故障依旧可以工作。它同时向客户端展现一个单机节点,始终提供强一致保证的数据访存。同时,所有在线的成员节点都可用来提供读操作,从而提供更高的读吞吐总和。

所有 Raft 相关的技术难点都会由 Dragonboat 来承担,用户从而可以只关注他们各自的应用领域。Dragonboat 使用十分简便,详细的例程可使新用户在半小时内完全掌握它。

Dragonboat GitHub 地址:https://github.com/lni/dragonboat
也可以通过码云极速下载 https://gitee.com/mirrors/Dragonboat 获取


开源中国征稿开始啦!


开源中国 www.oschina.net 是目前备受关注、具有强大影响力的开源技术社区,拥有超过 200 万的开源技术精英。我们传播开源的理念,推广开源项目,为 IT 开发者提供一个发现、使用、并交流开源技术的平台。


现在我们开始对外征稿啦!如果你有优秀的技术文章想要分享,热点的行业资讯需要报道等等,欢迎联系开源中国进行投稿。投稿详情及联系方式请参见:我要投稿


推荐阅读

Chameleon 原理首发:其它跨多端统一框架都是假的?

C++20 最新进展:加入模块化和协程,进入特性冻结阶段

Go 语言的下一个大版本:Go 2.0 被安排上了!

大厂小厂都在搞开源,它真的能赚钱?

x86 和 ARM 谁能主宰服务器市场?Linus 认为 ARM 没戏

「好看」一下,分享给更多人↓↓↓

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存