《云话鲲鹏之大咖来了》第4期:#探索鲲鹏#之“手把手教你在鲲鹏上使用编程语言——Java、Python”

举报
别慌,我只是路过 发表于 2019/12/23 10:42:33 2019/12/23
【摘要】 大家好,鲲鹏论坛《云话鲲鹏之大咖来了》第4期如约在周一与大家见面! 科技前沿,探寻不怠,以责任、权威和专业, 《云话鲲鹏之大咖来了》将从#初识鲲鹏#、#探索鲲鹏#、#玩转鲲鹏#等不同的维度带领大家更深刻的认识和学习鲲鹏! 本期邀请到的大咖仍然是太一,作为华为云鲲鹏解决方案架构师,太一在鲲鹏社区发表了一系列关于鲲鹏的专业技术文章,我们会在接下来的大咖说中逐一为大家推荐!

1578906034604872.png


大家好,鲲鹏论坛《云话鲲鹏之大咖来了》第4期如约在周一与大家见面!


科技前沿,探寻不怠,以责任、权威和专业,


《云话鲲鹏之大咖来了》将从#初识鲲鹏#、#探索鲲鹏#、#玩转鲲鹏#等不同的维度带领大家更深刻的认识和学习鲲鹏!


本期邀请到的大咖仍然是太一,作为华为云鲲鹏解决方案架构师,太一在鲲鹏社区发表了一系列关于鲲鹏的专业技术文章,我们会在接下来的大咖说中逐一为大家推荐!

本期大咖

胡兴哲.jpg


论坛昵称】 太一

大咖称号 华为云鲲鹏解决方案架构师

技能介绍 丰富的鲲鹏软件调研、鲲鹏迁移、鲲鹏开发和云上开发者生态建设经验



本期推荐文章:在鲲鹏上使用编程语言——Java、Python


#关键词#:初识鲲鹏 、Java、Python

内容简介】

在鲲鹏上使用编程语言——Java

在鲲鹏上使用编程语言——Python

正文开始


在鲲鹏上使用编程语言——Java、Python


之所以把这两种语言放到一起讨论,是因为在某些场景下,他们的行为非常相似。

  • 他们都通过源文件生成机器码

  • 他们都利用vm解释机器码完成程序运行

在绝大多数场景下,Java编译生成的出来的机器码,是由JVM解释运行的;同样python会在运行时将源码编译成机器码,再由python来解释运行,我姑且把他俩都称为解释型语言。

 

理论上,一个代码工程如果完全由JAVA或者python的源码与机器码构成,那么代码本身不关心自己所运行的芯片平台。

 

但仍然有一些常用的天然特性其实是区分平台的,例如java中的NIO在linux上调用epoll,而windows上则调用了IOCP;python的绝大多数数学运算库,scipy、numpy中的核心算法部分都使用C、Fortran编写。而他们恰恰就是Java语言的主要应用场景——web应用和python语言的主要应用场景——AI/数学计算中最至关重要的部分。


JAVA部分

 

Java社区对ARMv8指令集的支持相对完整,这里是JVM的支持体系列表,我们使用JDK 8时,就已经可以支持JVM的全部主要功能了。



x86/64

aarch64

arm(32-bit)

VMs

Client

Yes

No

Yes


Server

Yes

Yes

Yes


Minimal

Yes (32 bit)

Yes, since JDK 12

Yes

JIT

C1

Yes

Yes

Yes


C2

Yes

Yes

Yes


TieredCompilation

Yes

Yes

Yes


Graal JIT (Experimental)

Yes, since JDK 10

Yes, since JDK 11

No

GC

SerialGC

Yes

Yes

Yes


ParallelGC

Yes

Yes

Yes


CMS

Yes, Deprecated

Yes, Deprecated

Yes, Deprecated


G1

Yes

Yes

Yes


ZGC

Experimental

In development

No

Runtime

Container support

Yes

Yes

Yes


AppCDS

Yes

Yes, since JDK 10

Yes, since JDK 10


HugePages

Yes

Yes

Yes


Numa Support

Yes

Yes

No

Serviceability

Java Flight Recorder

Yes

Yes, since JDK 11

Yes, since JDK 11

Table1 JVM端口功能对照表

 

JAVA字节码在执行过程中,JIT会对热点的字节码进行优化编译,编译成机器码后存放在Code Cache区域。如果Code Cache区域满了,那么会导致部分或者全部的代码仅仅通过对字节码逐条解释运行,进而导致JAVA程序性能大减但主机和进程无任何明显的指标异常。由于ARMv8是简单指令集,JAVA for ARM64的机器码的体积会数倍于X86,而且部分版本的JVM有Bug,一旦Code Cache满了,则所有的编译功能都会被停止。

防止CodeCache满,需要调整JVM的一些扩展配置,以之相关的扩展配置项主要有:

XXTieredCompilation      多级编译,OpenJDK 7与OracleJDK7 for ARM64版本默认是true,OpenJDK 7与OracleJDK 7for x86上是false,JDK8都是默认为true。由于默认开启了这个配置,会导致Code Cache中存放有多个层级的机器码,机器码体积倍增。关闭后JVM会只开启C2 Compilor线程进行机器码编译,大大降低Code Cache的消耗。

XXReservedCodeCacheSize     默认值与JDK版本和平台有关,从48M到240M不等。对内存成本考虑不高的情况下,建议可以设置大一些,如512MB,这样可以有效防止因为Code Cache区域内存溢出导致JVM性能下降。


Python部分


python的开源社区比java的要松散许多,社区官方也没有意图收编很多看起来属于基本功能的模块,故而想要厘清python对ARMv8指令集的支持情况其实非常困难,因为仅仅python本体能够支持ARMv8并没有太大意义。粗浅的打个比方,python在如今的代码世界里,更多的是充当胶水,越来越多的功能其实不是由python native的代码编写。如果python生态中的许多功能模块不支持ARMv8,空有一瓶好胶水其实也是没有用的。

 

不过经过实测,使用python2.7.9、python3.5在鲲鹏服务器上运行完整的Openstack应用(Nova、Cinder、Swift、Glance、Neutron、Ceilometer等等),所有功能和测试用例都是正常的,因此可以相对乐观的认为,python2.7.9和python3在鲲鹏上的兼容性是具备的。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。