Go 1.12最新特性 - 实际项目为背景的详解
作者: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支持。谢谢!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
金三银四,如何征服面试官,拿到Offer
又到了茶余饭后的时间,想想写点什么,掐指一算,噢呦,快到3月份了,职场的金三银四跳槽季又来了,不同的是今年比往年「冷」一些,形式更加严峻一些,大家多多少少可能都听到或看到一些信息,就是好多公司在优化裁员,代表的就是滴滴、京东这种大型互联网公司,已经官宣了。 即使这种情况下,我相信,3、4月份仍然会有一波离职、求职潮。 作为求职这来说,面试是一道坎,很多人会恐惧面试,即使是工作很多年的老鸟,可能仍存在面试的焦虑。 今天就来说一说如何面好一场试。 不管环境怎么变,在技术领域,实力仍是职场人员的立身之本。 先说一下为什么有的人会害怕面试 ?应该无非两点 :第一,自身实力的不自信 。第二,不会表达。 下面就来说一说破解之道 0、准备 收到面试邀请,一定提前查企业相关信息,信息可以从网上搜索,多找一些信息看,面试前对企业有个基本的判断,是否符合自己的预期,如果感觉还不错,接下来就需要详细看一看企业的岗位要求,对标自己,提前做些准备,梳理梳理脑袋里的东西。 面试当天建议提前20分钟左右到面试企业的楼下,在楼下在做一些心理上的准备,克服克服紧张的情绪,离面试时间10分钟左右,进入企业,准备面试。 ...
- 下一篇
你应该知道的缓存进化史
1.背景 本文是上周去技术沙龙听了一下爱奇艺的Java缓存之路有感写出来的。先简单介绍一下爱奇艺的java缓存道路的发展吧。 可以看见图中分为几个阶段: 第一阶段:数据同步加redis 通过消息队列进行数据同步至redis,然后Java应用直接去取缓存 这个阶段优点是:由于是使用的分布式缓存,所以数据更新快。缺点也比较明显:依赖Redis的稳定性,一旦redis挂了,整个缓存系统不可用,造成缓存雪崩,所有请求打到DB。 第二,三阶段:JavaMap到Guava cache 这个阶段使用进程内缓存作为一级缓存,redis作为二级。优点:不受外部系统影响,其他系统挂了,依然能使用。缺点:进程内缓存无法像分布式缓存那样做到实时更新。由于java内存有限,必定缓存得设置大小,然后有些缓存会被淘汰,就会有命中率的问题。 第四阶段: Guava Cache刷新 为了解决上面的问题,利用Guava Cache可以设置写后刷新时间,进行刷新。解决了一直不更新的问题,但是依然没有解决实时刷新。 第五阶段: 外部缓存异步刷新 这个阶段扩展了Guava Cache,利用redis作为消息队列通知机制,通知其...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 2048小游戏-低调大师作品