iconm-menu
中文 chevron-down
中文EnglishРусский
moon-outline
light

Web开源服务之ARM64现状

Xiyuan Wang2020-04-14webarm64

社区核心参与者:Martin GrigorovMichael Rumph王玺源

背景

开源界中Web服务众多,但其中很多软件对ARM64的支持并不理想。或是没有官方CI测试保证代码质量,或是在ARM64上的性能明显差于X86_64,甚至有的服务根本无法在ARM上运行。为了完善Web领域的ARM64生态,我们参与了主流的几个开源社区,旨在推动Web on ARM64。以下是我们近期的一些进展,以供大家参考。

概述

我们目前参与了主流的共9个Web相关项目。如下所示

项目主要语言
Apache Httpd ServerC
Apache TomcatJava
MemcachedC
NginxC
LighttpdC
JBoss/WildFlyJava
HAProxyC
SquidC++
Varnish CacheC

针对这些项目,我们按照以下三个方面循序渐进的推动中:

  1. 能不能在ARM上运行
  2. 如何稳定在ARM上运行
  3. 怎么更好的在ARM上运行

能不能在ARM上运行

我们可以看到这9大项目主要由Java和C/C++编写。

首先,像Python、Java这种自带runtime的语言天生就是跨平台的。这样的项目在ARM64平台上至少可以保证程序的可运行。

而C/C++项目则需要先编译成ARM64平台的目标可执行文件。这样的项目则需要先进行编译测试。

经过我们的测试,这9个Web项目都可以在ARM64上成功编译并运行。

如何稳定在ARM上运行

所谓稳定,包含两个方面:

  1. 软件在ARM64上是否和在X86_64上行为一致?
  2. 随着代码更新迭代,软件在ARM64上是否持续可用?

行为一致

我们常遇到两类行为一致的问题:

  1. 同样的代码,不同的结果
  2. 同样的功能,不同的支持

很遗憾,由于架构不同、底层实现不同等原因,很多软件的某些行为在X86_64和ARM64上的行为并不一致。

例如,之前的文章提到的Java中Math计算结果的差异。

又或者某些功能依赖独有的平台特性或者特殊的第三方库,导致在X86_64上可以运行的功能,在ARM64上却执行失败。

例如我们发现WildFly官方发布的源码包中缺少了个别ARM64平台的.so文件,这就导致个别调用.so的功能不可用。

针对这种问题,我们需要打开代码逐个分析、逐个修复。保证所有测试在ARM64上全部通过。

持续可用

CI/CD是保证软件持续可用的重要方法。主流软件的CI系统都有X86_64平台的测试。而ARM64平台的少之又少。

针对这个问题,我们推动了这9个项目的ARM CI支持。除Lighttpd还在推动中以外,其他8个项目目前都已支持了ARM CI。甚至其中4个项目已经官方声明了ARM64的支持(详见附录)。

其中Httpd、Tomcat、Memcached、HAProxy和Varnish Cache通过Travis CI支持了ARM64测试。Nginx使用内部CI,对外不可见。Squid使用自己的树莓派。而JBOSS使用了我们捐献的基于Kunpeng 920的ARM虚拟机。同时我们也计划捐献同样的测试机到Lighttpd社区中。

随着ARM CI的落地,我们将持续保证ARM CI的稳定。我们相信在不久的将来,这9大核心Web项目都会官方声明ARM64的支持,并满足用户在ARM64上稳定、高效使用Web服务的需求。

怎么更好的在ARM上运行

我们不仅希望软件在ARM64上能用,还在不断探索如何让软件在ARM64上用的好。其中性能优化是重中之重,也是我们未来一段时间的主要投入点。

例如,有些软件只实现了X86_64的汇编实现,但缺少ARM64的汇编代码。

又或者有些在X86_64上纯软实现的功能,可以在ARM64上通过下沉至硬编码的方式提高性能。

甚至还可以考虑如何最大化利用ARM64的多核优势,或规避ARM64的锁劣势等等。

关于性能优化的内容,我们将在以后的文章中针对不同的软件一一细说。敬请期待。

操作系统支持

一般情况下,开源软件很少自己分发不同操作系统的安装包。以我们参与的9个Web服务为例,只有Nginx提供了Ubuntu的安装包,Varnish Cache只提供了编译好的可执行文件,而其他7个服务仅仅提供了源码。

针对Nginx这种官方提供安装包的项目,我们希望它能提供更多操作系统的安装包,在我们的推动下,Nginx社区已表示下一步会推出CentOS和Alpine的安装包。OpenEuler也在我们的规划中。敬请期待。

大多数只提供源码或可执行文件的服务,针对这种情况,各个操作系统需要自行打包、分发。以OpenEuler为例,可以看到在官方Repo中已经支持了部分Web服务aarch64安装包。丰富的安装包支持也是操作系统易用性的重要体现。我们相信随着ARM64软件生态的不断丰富,OpenEuler的仓库也会不断充实。

附录

最后附上我们参与Web社区的总览表格及相关链接,感兴趣的同学可以进一步详读,有任何问题,欢迎留言。

Official arm64 CICI toolPackage in DownloadsOfficial ARM support
Apache TomcatYESTravisCIBinaryWIP(work in progress)
MemcachedYES1. BuildBot 2. TravisCISource CodeYES
Apache httpdYESTravisCISource CodeYES
NGINXYESInternalOnly for Ubuntu LTSsYES
LighttpdNOJenkinsSource CodeNO
JBoss/WildflyYESTeamCitySource CodeNO
HAProxyYES1. CirrusCI
  1. TravisCI | Source Code | YES | | Squid | YES | Jenkins | Source Code | NO | | Varnish Cache | YES | Travis | 1. Source Code
  2. Package | NO |

【免责声明】本文仅代表作者本人观点,与本网站无关。本网站对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文仅供读者参考,由此产生的所有法律责任均由读者本人承担。