作者: 王玺源
社区核心参与者:Martin Grigorov、Michael Rumph
背景
开源界中Web服务众多,但其中很多软件对ARM64的支持并不理想。或是没有官方CI测试保证代码质量,或是在ARM64上的性能明显差于X86_64,甚至有的服务根本无法在ARM上运行。为了完善Web领域的ARM64生态,我们参与了主流的几个开源社区,旨在推动Web on ARM64。以下是我们近期的一些进展,以供大家参考。
概述
我们目前参与了主流的共9个Web相关项目。如下所示
项目 | 主要语言 |
---|---|
Apache Httpd Server | C |
Apache Tomcat | Java |
Memcached | C |
Nginx | C |
Lighttpd | C |
JBoss/WildFly | Java |
HAProxy | C |
Squid | C++ |
Varnish Cache | C |
针对这些项目,我们按照以下三个方面循序渐进的推动中:
- 能不能在ARM上运行
- 如何稳定在ARM上运行
- 怎么更好的在ARM上运行
能不能在ARM上运行
我们可以看到这9大项目主要由Java和C/C++编写。
首先,像Python、Java这种自带runtime的语言天生就是跨平台的。这样的项目在ARM64平台上至少可以保证程序的可运行。
而C/C++项目则需要先编译成ARM64平台的目标可执行文件。这样的项目则需要先进行编译测试。
经过我们的测试,这9个Web项目都可以在ARM64上成功编译并运行。
如何稳定在ARM上运行
所谓稳定,包含两个方面:
- 软件在ARM64上是否和在X86_64上行为一致?
- 随着代码更新迭代,软件在ARM64上是否持续可用?
行为一致
我们常遇到两类行为一致的问题:
- 同样的代码,不同的结果
- 同样的功能,不同的支持
很遗憾,由于架构不同、底层实现不同等原因,很多软件的某些行为在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的锁劣势等等。
关于性能优化的内容,我们将在以后的文章中针对不同的软件一一细说。敬请期待。
附录
最后附上我们参与Web社区的总览表格及相关链接,感兴趣的同学可以进一步详读,有任何问题,欢迎留言。
Official arm64 CI | CI tool | Package in Downloads | Official ARM support | |
---|---|---|---|---|
Apache Tomcat | YES | TravisCI | Binary | YES |
Memcached | YES | 1. BuildBot 2. TravisCI | Source Code | YES |
Apache httpd | YES | TravisCI | Source Code | YES |
NGINX | YES | Internal | Only for Ubuntu LTSs | YES |
Lighttpd | NO | Jenkins | Source Code | NO |
JBoss/Wildfly | YES | TeamCity | Source Code | NO |
HAProxy | YES | 1. CirrusCI 2. TravisCI |
Source Code | YES |
Squid | YES | Jenkins | Source Code | NO |
Varnish Cache | YES | Travis | 1. Source Code 2. Package |
NO |