文档章节

Go 1.12最新特性 - 实际项目为背景的详解

n
 nilei
发布于 02/21 20:49
字数 1256
阅读 4199
收藏 29

作者:lni (https://github.com/lni)

Go 1.12带来了正式的Go module支持、初步的TLS 1.3支持、runtime和标准库做了各项提高,工具也有所改进,trace方面引入minimum mutator utilization图的支持方便GC性能的调校。

本文通过近期发布的高性能分布式共识库Dragonboat为背景,从实际项目角度详解各新特性。

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并不能确保实际落盘的问题得到了解决

具体所有的改进和变更可以看1.12文档

最后,感谢阅读,并请访问Dragonboat的github页面点star支持。谢谢!

© 著作权归作者所有

共有 人打赏支持
n
粉丝 30
博文 6
码字总数 11560
作品 1
私信 提问
加载中

评论(10)

web实习虫
web实习虫

引用来自“nilei”的评论

引用来自“web实习虫”的评论

我想问一哈 replace后面的版本号怎么得出来的?
go.mod里写用latest,然后go mod tidy -v一下就会根据最新版本产生这个特殊版本号

@nilei 这尼玛文档哪里写了
n
nilei

引用来自“web实习虫”的评论

我想问一哈 replace后面的版本号怎么得出来的?
go.mod里写用latest,然后go mod tidy -v一下就会根据最新版本产生这个特殊版本号
web实习虫
web实习虫
我想问一哈 replace后面的版本号怎么得出来的?
leon_rock
leon_rock
今天正式版来了
lemonwater
lemonwater

引用来自“lemonwater”的评论

1.12什么时候正式发布

引用来自“陈好”的评论

今天
真的吗
陈好
陈好

引用来自“lemonwater”的评论

1.12什么时候正式发布
今天
lemonwater
lemonwater

引用来自“lemonwater”的评论

1.12什么时候正式发布

引用来自“nilei”的评论

2月底以前
今天25号了,那就是这几天喽
n
nilei

引用来自“lemonwater”的评论

1.12什么时候正式发布
2月底以前
lemonwater
lemonwater
1.12什么时候正式发布
dingdayu
dingdayu
文章很赞👍
l.y./FlashAlarm

#Android Flash Alarm Project ##项目简介 ###一个亮瞎你狗眼绝对能起床的简易闹钟 ###灵感源于我早上起不了床,但是可以被光照照醒的特性 ###功能:闪光灯闪瞎狗眼定起床,数学题目让你大脑迅速...

l.y.
2015/03/22
0
0
css手势状态定义属性cursor和自定义鼠标手势详解

css手势状态定义:cursor和自定义鼠标手势详解,示例演示cursor手势状态如下: auto : 默认值。浏览器根据当前情况自动确定鼠标光标类型。 all-scroll : 有上下左右四个箭头,中间有一个圆点...

罗马教堂的钟声
2015/12/10
8.8K
0
【转】Git详解之五 分布式Git

分布式 Git 为了便于项目中的所有开发者分享代码,我们准备好了一台服务器存放远程 Git 仓库。经过前面几章的学习,我们已经学会了一些基本的本地工作流程中所需用到的命令。接下来,我们要学...

季牧云
2012/06/15
0
0
PostgreSQL 批量SQL before/after for each row trigger的触发时机、性能差异分析、建议 - 含9.4 , 10版本

标签 PostgreSQL , trigger , row , statement , before , after , s_lock 背景 数据库触发器的触发时机,性能,高并发批量导入时,触发器的性能如何? 批量导入时,before, after触发器在f...

德哥
2018/10/05
0
0
Flutter 布局(一)- Container详解

本文主要介绍Flutter中非常常见的Container,列举了一些实际例子介绍如何使用。 1. 简介 A convenience widget that combines common painting, positioning, and sizing widgets. Container...

Q吹个大气球Q
2018/10/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 集成 Swagger,生成接口文档就这么简单!

之前的文章介绍了《推荐一款接口 API 设计神器!》,今天栈长给大家介绍下如何与优秀的 Spring Boot 框架进行集成,简直不能太简单。 你所需具备的基础 告诉你,Spring Boot 真是个牛逼货! ...

Java技术栈
26分钟前
3
0
一个简单的js作用域题目(原创)

var name = 'nnmm' var obj = { name: 'name1', func: () => { console.log(this.name) }, func1: function (){ console.log(this.name) }, son: { ......

boogoogle
29分钟前
2
0
SSM整合activeMQ/activeMQ配置

一、引入依赖 <!-- xbean 如<amq:connectionFactory /> -->    <dependency>        <groupId>org.apache.xbean</groupId>        <artifactId>xbean-spring</artifac......

嘴角轻扬30
33分钟前
2
0
小公司出身的程序员,面试咋这么难?!

小公司出身,被大厂竞争者 KO 以下是一个非常真实的案例,是一个大厂工程师和一个小公司工程师同时求职一个独角兽公司的职位的经历。 一个是985本科学历,出身互联网大厂,四五年经验的样子。...

编程SHA
39分钟前
2
0
揭秘:蚂蚁金服bPaaS究竟是什么?

摘要: 分布式金融核心套件,蚂蚁金服bPaaS究竟是什么东东? 文/图 孙浩峰 去年9月,蚂蚁金服在杭州云栖ATEC发布了分布式金融核心套件bPaaS( Business Platform As a Service ),对外开放自...

阿里云官方博客
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部