全球数据中心的数量在不断增加,它们的电力消耗也在不断增加。提高能效的一种方法当然是不断开发更好的硬件,但作为软件开发人员,我们也应该尽自己的一份力量。
根据国际能源署(IEA)的数据,2022年全球数据中心的用电量估计为240 - 340太瓦时。这相当于总电力需求的1.0%至1.3%。这些数字不包括加密货币挖矿,后者可能额外消耗了110太瓦时的电力,占全球电力需求的0.4%。
这篇文章展示了用Rust编码如何帮助更有效地利用现有资源,帮助保护我们的星球——至少是一点点。
为什么Rust是节能的?
一般来说,比较编程语言的效率是不容易的,因为结果受到很多因素的影响。然而,R. Pereira等人的一篇论文比较了27种编程语言的能耗和内存效率以及速度。为了获得尽可能客观的结果,他们使用了各种基准测试进行比较。
该论文指出,Rust在能耗和执行时间方面排名第二,仅比第一名c多消耗约3%的能量,执行速度仅慢4%。根据这些测量结果,Rust非常节能,特别是如果你将其与PHP的能耗进行比较,PHP的能耗是Rust的28倍,Python的能耗是Rust的74倍。
论文链接:https://www.sciencedirect.com/science/article/abs/pii/S0167642321000022?via%3Dihub
实际案例
在Tweede golf,最近在重写一个项目时体验了Rust的高效率和速度。他们用Rust构建了一个图书俱乐部管理应用程序,它之前是用PHP编写的,具有相同的功能。这个应用程序允许读书俱乐部借书,并根据图书馆的等级体系来管理这些书的预订、分发和发票。
图片
图片
老实说,节省CPU和内存并不是重写的主要原因,维护才是。Rust应用程序更容易维护,Rust编译器或依赖项的版本升级不太可能破坏应用程序。此外,使用Rust的效率更高。这是因为有良好的生态系统和工具链,例如编译器提供了非常有用的错误消息,严格的类型系统也有助于编写正确的软件。
在他们的示例中,Rust重写只花费了原始PHP实现一半的开发时间,这还不包括任何新加需求。当然,重新实现现有的实现通常比构建原始实现更容易和更快,但是没有预料到开发时间的差异会如此之大。
基准测试
让我们看一下性能比较。对于测试,使用了开源HTTP基准测试工具Siege和25个并发用户。这些应用程序在一台Ubuntu笔记本电脑上本地运行,该笔记本电脑配备了第12代英特尔®酷睿™i7-12700H和32gb内存。由于应用程序是作为容器运行的,使用docker stats命令来估计资源消耗,并使用docker Compose命令在需要的地方限制资源。
执行的最直接的基准测试没有对PHP或Rust应用程序或Siege施加任何限制。针对预订概览页面执行了测试,因为这会给应用程序和数据库带来一些计算负载。Rust版本由一个应用程序容器和一个DB容器组成。
PHP版本还包含一个nginx,它负责提供所有的静态文件,如CSS, JS和图标。Rust应用程序自己为它们服务。总的CPU使用情况是所有容器的总和,而App CPU和内存使用情况只涉及Rust或PHP容器。
最大CPU
首先,在PHP和Rust应用程序上分别加载全部负载20秒。
Total CPU | App CPU | Memory Usage | Hits | |
PHP | 121 % | 37 % | 276 MiB | 283 |
Rust | 212 % | 57 % | 31 MiB | 11,297 |
可以看到,Rust在点击次数(即在20秒内加载的页面数量)上比PHP高出近4000 %。此外,我们看到PHP需要的内存几乎是Rust应用程序的9倍。
限定CPU
你可能会认为这是一种不公平的比较,因为Rust能够利用更多的CPU资源。因此,将每个应用容器的CPU使用率限制在20%,并执行相同的测试。
Total CPU | App CPU | Memory Usage | Hits | |
PHP | 44 % | 20 % | 96.3 MiB | 69 |
Rust | 55 % | 20 % | 10.8 MiB | 2,275 |
Rust应用程序的总CPU使用量仍然更高,这与Rust能够处理33倍以上的请求这一事实有关,因此给数据库带来了更高的负载。同样,我们可以看到PHP使用了大约9倍的内存。
正常测试
这些虽然意义重大,但都是非常理论化的测试。在实践中,页面上不会有这么多用户,而且在加载下一个页面之前,他们也会花几秒钟的时间对一个页面的加载做出反应。为了更真实地测试这一点,我们为Siege提供了9个不同的url,这些url在页面加载后0到10秒之间随机访问。为了获得更好的概述,我们让这个测试运行60秒而不是20秒。
Total CPU | App CPU | Memory Usage | Hits | |
PHP | 41 % | 13 % | 108.6 MiB | 285 |
Rust | 2.6 % | 1 % | 12.1 MiB | 315 |
在这里,我们可以真正看到Rust在资源消耗方面的好处。PHP应用程序需要13%的CPU来处理请求,而Rust容器只需要1%。同样,在内存使用方面,Rust的性能也是PHP的九倍。
事实证明,Rust不仅对开发人员来说更有趣,而且对资源也非常友好。我们已经看到新的Rust应用程序比旧的PHP实现快40倍。在集群中,我们观察到资源使用的显著减少。