腾讯Kona JDK数据科学实践

 

导语:开源操做系统年度技术会议(Open Source Operating System Annual Technical Conference,简称 OS2ATC)已经连续成功举办了八届。该会议旨在促进我国操做系统及其相关领域的教学、研究与产业发展,增强学术交流,展现产业界成果,是中国地区颇具规模的技术盛会。html

 

第八届OS2ATC大会于2020年12月27日,在北京中科院计算技术研究所举行。在”编程技术”分会上,腾讯高级工程师傅杰博士发表了《Kona JDK数据科学实践》的演讲。如下为演讲实录:java

图片

 

你们下午好!首先,要特别感谢组委会精心准备了此次线下和线上相结合的学习和交流的机会。很高兴能跟你们分享Kona JDK在数据科学领域实践的相关内容。我是来自腾讯JVM团队的jiefu(傅杰),OpenJDK社区的Committer,目前主要从事Kona JDK在大数据和机器学习等领域的探索和实践。我毕业于中科院计算所,在此也谨表明计算所对你们的到来表示欢迎和感谢!git

今天,我首先向你们简单介绍一下Kona JDK;随后,经过几组真实的数据,向你们展现编程语言在数据科学领域面临的巨大挑战;最后,分享为了应对上述挑战所进行的实践和尝试,但愿对你们能有所启发。github

 

Kona:JDK15中国企业贡献第一编程

 

Tencent Kona是腾讯基于OpenJDK研发的一款JDK产品,于2019年免费对外开源(https://github.com/Tencent/TencentKona-8),并提供长期支持(LTS)。Kona发布的版本都通过了腾讯云和内部超大规模生产环境的验证,欢迎你们下载使用。小程序

图片

2020年9月JDK15正式对外发布,Kona贡献度在中国企业排名第一,而且在国内历史首次做为全球Notable贡献者被OpenJDK社区主导者Oracle公司点名致谢(https://blogs.oracle.com/java-platform-group/the-arrival-of-java-15)。腾讯成立了专门的JVM研发团队(含多位OpenJDK社区的 author/committer),负责Kona的研发和维护。在解决公司内部迫切需求的同时,团队高度重视对外开源工做,参与了包括jdk(jdk17/16/15/14/11u/8u), Panama和Loom等OpenJDK社区重要项目。仅2020年,Kona向OpenJDK社区贡献了70多个commit,主要涉及HotSpot(JIT、Runtime和GC)、SVC、Core Libraries和Infrastructure等领域。其中比较重要的包括:HotSpot核心模块9个patch、Vector API AVX512向量支持 6个patch、map大堆Heap Inspection并行加速优化4个patch。将来,Kona将以更加开放的姿态,积极拥抱开源,并持续贡献开源。数组

 

数据科学场景的挑战微信

 

图片

接下来,经过几组业务系统的数据,向你们量化地展现编程语言在数据科学领域所面临的巨大挑战。上图左边的数据来源于腾讯云大数据平台。目前,该平台每日须要处理的实时计算量达到了万亿次,足以支撑起万亿级维度的模型训练,对现代编程语言的算力提出了很是严苛的要求。右边的数据来源于你们天天都会用到的微信的支付日志系统。该系统每日新增的数据高达万亿条记录,底层存储的规模早已突破PB级别。海量的数据要求编程语言对大内存系统提供有力的支持,以高效实现增删改查等业务逻辑。架构

因而可知,在现代数据科学场景中,编程语言在算力加速和大内存支持等方面正面临十分严峻的考验。下面,咱们以Java为例,向你们展现为了应对上述挑战Kona所进行的相关实践。oracle

 

JVM CPU算力加速

 

因为涉及大量向量和矩阵运算,SIMD(Single Instruction Multiple Data)指令是数据科学领域进行CPU算力加速的首选。SIMD加速,一般又被称为“向量加速”,具备效果显著、成本低廉的特色,愈来愈受到现代编程语言的青睐。其原理是将多个标量运算优化为更高效的向量运算,以充分发掘处理器向量部件的功能。例如,考虑下图中的for循环代码片断。若是使用常规的标量指令实现,须要16次数组读操做、8次数组写操做和8次数组元素加法操做;若使用向量指令,仅须要2次数组向量读操做、1次数组向量写操做和1次数组元素向量加法操做。所需操做总次数由32次降为4次,故理论分析出向量加速的效果十分显著。

图片

那么,实际状况果然如此吗?下面以HotSpot Java虚拟机的C2编译器为例,展现SIMD编译优化先后的对比。左图使用普通的标量指令,需生成24条指令。而右图使用SIMD优化,仅需1条向量指令。故实际状况与理论分析高度吻合。

图片

长期以来,Java的SIMD加速主要依赖JNI、Intrinsic和自动向量化等方案。但它们的缺点十分明显。例如,JNI编码维护难,且可移植性差;Intrinsic缺少通用性和可扩展性;自动向量化条件苛刻,很是脆弱。为了解决Java的SIMD短板,OpenJDK提出了Vector API的编程接口,目前主体代码已经合并到了JDK16的开发分支,但至今仍处于孵化阶段。Vector API旨在提供一个简明易用且平台无关的SIMD加速接口。“编程可信”是Vector API最引人注目的设计目标。该目标保证使用Vector API编写的代码生成预期的SIMD指令。固然,这里的隐含的前提是处理器硬性必须支持相应的向量指令。“优雅回退”指在缺乏向量支持的机器上,Vector API代码会自动回退到标量形式执行等价语义,而且性能不发生显著回退。

图片

Vector API对数据科学领域许多场景具备显著加速效果。例如,根据OpenJDK社区公布的数据,浮点向量点积运算为14~16倍加速;浮点矩阵乘法运算为2~5倍加速。而在腾讯机器学习模型训练系统中,也可得到高达50%以上的优化效果。Vector API现已集成到Kona JDK11向量版本中,而且在实际业务系统中经过了长时间的生产验证。在实际业务的联合测试中,咱们发现并修复了多个Vector API AVX512向量支持的Bug,并所有贡献到了OpenJDK社区,部分Bug列表以下图红框所示。

图片

实践中,咱们还发现了一个很是有意思的现象。以下图左侧所示,在对Vector API的一段小程序进行性能分析时,咱们发现性能呈现大幅抖动的现象:要么2000+毫秒,要么5000+毫秒,而且呈明显的两点分布式统计规律。后来,通过仔细分析,确认性能的大幅波动由向量的非对齐访存致使。从处理器微架构层面分析,测试机Cache行长度为64字节,若使用256位的向量对cache进行访问,容易出现非对齐的向量访存。考虑读取一个256位向量的情形:1)若对齐,则仅需访问一个Cache行,共一次访存操做;2)若非对齐,则须要访问两个Cache行,至少两次访存操做,而且还须要进行额外的数据拼接操做。所以,为了尽量发挥SIMD指令的性能,应尽量减小非对齐的向量访存操做。

图片

 

JVM(超)大堆无暂停GC

 

下面跟你们展现Java如何强化对大内存的支持。长期以来,Java在大堆上一直存在GC停顿过大的痛点。传统的垃圾收集器可支持的堆空间一般只有几十个G。然而,部分业务所需的堆大小早已突破了百G的规模,而且呈逐年增加的趋势。为了解决(超)大堆的GC停顿问题,Java引入了一款名为ZGC的新型垃圾收集器。ZGC被设计为最大可支持TB级别的堆,最大GC暂停保证不超过10ms,而且对业务吞吐量的影响小于15%。

图片

下图展现了ZGC在腾讯某延迟敏感型业务场景的实践效果。优化前,系统只能达到3个9的实时性要求;优化后,实现了5个9的强实时性突破,而且吞吐量也得到了约15%的提高。Kona的实践代表:ZGC是超大堆或者延迟敏感型业务的首选。

图片

 

小结

 

图片

Vector API和ZGC有效解决了现代数据科学场景对Java的挑战。同时,现有大数据技术栈/生态主要基于JVM构建,而且存在海量的Java生产系统、工具和编程类库,使得Java具有无可比拟的研发和维护效率。此外,Java生态还得到了世界顶级厂商的鼎力支持和背书。相信Java/JVM将来将持续在大数据和机器学习领域扮演重要角色!谢谢你们。

另外,欢迎你们关注和star Tencent Kona JDK 8:https://github.com/Tencent/TencentKona-8,同时也欢迎各位优秀的开发者加入腾讯JVM研发团队,扫描下方二维码,来加入咱们吧!

图片

 

参考资料

[1]JDK15简介:

https://blogs.oracle.com/java-platform-group/the-arrival-of-java-15

[2]Kona JDK源代码:

https://github.com/Tencent/TencentKona-8

[3]腾讯大数据平台最新数据:

https://new.qq.com/omn/TEC20200/TEC2020091100744400.html

[4]微信支付万亿日志在Hermes中的实践:

https://www.infoq.cn/article/N9DsUee4tTrktXmVmVAP

[5]Vector API源代码:

https://github.com/openjdk/panama-vector

[6]Kona11揭秘: 

https://cloud.tencent.com/developer/article/1627658

[7]Vector API资料:

https://static.rainfocus.com/oracle/oow19/sess/1553206138311001UVQD/PF/OCO19-Vector_API_1569011845017001idU3.pdf

[8]ZGC:

http://cr.openjdk.java.net/~pliden/slides/ZGC-FOSDEM-2018.pdf

图片

扫码关注 | 即刻了解腾讯大数据技术动态

相关文章
相关标签/搜索