提高能效,用Rust寫代碼
全球數(shù)據(jù)中心的數(shù)量在不斷增加,它們的電力消耗也在不斷增加。提高能效的一種方法當(dāng)然是不斷開發(fā)更好的硬件,但作為軟件開發(fā)人員,我們也應(yīng)該盡自己的一份力量。
根據(jù)國(guó)際能源署(IEA)的數(shù)據(jù),2022年全球數(shù)據(jù)中心的用電量估計(jì)為240 - 340太瓦時(shí)。這相當(dāng)于總電力需求的1.0%至1.3%。這些數(shù)字不包括加密貨幣挖礦,后者可能額外消耗了110太瓦時(shí)的電力,占全球電力需求的0.4%。
這篇文章展示了用Rust編碼如何幫助更有效地利用現(xiàn)有資源,幫助保護(hù)我們的星球——至少是一點(diǎn)點(diǎn)。
為什么Rust是節(jié)能的?
一般來說,比較編程語言的效率是不容易的,因?yàn)榻Y(jié)果受到很多因素的影響。然而,R. Pereira等人的一篇論文比較了27種編程語言的能耗和內(nèi)存效率以及速度。為了獲得盡可能客觀的結(jié)果,他們使用了各種基準(zhǔn)測(cè)試進(jìn)行比較。
該論文指出,Rust在能耗和執(zhí)行時(shí)間方面排名第二,僅比第一名c多消耗約3%的能量,執(zhí)行速度僅慢4%。根據(jù)這些測(cè)量結(jié)果,Rust非常節(jié)能,特別是如果你將其與PHP的能耗進(jìn)行比較,PHP的能耗是Rust的28倍,Python的能耗是Rust的74倍。
論文鏈接:https://www.sciencedirect.com/science/article/abs/pii/S0167642321000022?via%3Dihub
實(shí)際案例
在Tweede golf,最近在重寫一個(gè)項(xiàng)目時(shí)體驗(yàn)了Rust的高效率和速度。他們用Rust構(gòu)建了一個(gè)圖書俱樂部管理應(yīng)用程序,它之前是用PHP編寫的,具有相同的功能。這個(gè)應(yīng)用程序允許讀書俱樂部借書,并根據(jù)圖書館的等級(jí)體系來管理這些書的預(yù)訂、分發(fā)和發(fā)票。
圖片
圖片
老實(shí)說,節(jié)省CPU和內(nèi)存并不是重寫的主要原因,維護(hù)才是。Rust應(yīng)用程序更容易維護(hù),Rust編譯器或依賴項(xiàng)的版本升級(jí)不太可能破壞應(yīng)用程序。此外,使用Rust的效率更高。這是因?yàn)橛辛己玫纳鷳B(tài)系統(tǒng)和工具鏈,例如編譯器提供了非常有用的錯(cuò)誤消息,嚴(yán)格的類型系統(tǒng)也有助于編寫正確的軟件。
在他們的示例中,Rust重寫只花費(fèi)了原始PHP實(shí)現(xiàn)一半的開發(fā)時(shí)間,這還不包括任何新加需求。當(dāng)然,重新實(shí)現(xiàn)現(xiàn)有的實(shí)現(xiàn)通常比構(gòu)建原始實(shí)現(xiàn)更容易和更快,但是沒有預(yù)料到開發(fā)時(shí)間的差異會(huì)如此之大。
基準(zhǔn)測(cè)試
讓我們看一下性能比較。對(duì)于測(cè)試,使用了開源HTTP基準(zhǔn)測(cè)試工具Siege和25個(gè)并發(fā)用戶。這些應(yīng)用程序在一臺(tái)Ubuntu筆記本電腦上本地運(yùn)行,該筆記本電腦配備了第12代英特爾?酷睿?i7-12700H和32gb內(nèi)存。由于應(yīng)用程序是作為容器運(yùn)行的,使用docker stats命令來估計(jì)資源消耗,并使用docker Compose命令在需要的地方限制資源。
執(zhí)行的最直接的基準(zhǔn)測(cè)試沒有對(duì)PHP或Rust應(yīng)用程序或Siege施加任何限制。針對(duì)預(yù)訂概覽頁(yè)面執(zhí)行了測(cè)試,因?yàn)檫@會(huì)給應(yīng)用程序和數(shù)據(jù)庫(kù)帶來一些計(jì)算負(fù)載。Rust版本由一個(gè)應(yīng)用程序容器和一個(gè)DB容器組成。
PHP版本還包含一個(gè)nginx,它負(fù)責(zé)提供所有的靜態(tài)文件,如CSS, JS和圖標(biāo)。Rust應(yīng)用程序自己為它們服務(wù)。總的CPU使用情況是所有容器的總和,而App CPU和內(nèi)存使用情況只涉及Rust或PHP容器。
最大CPU
首先,在PHP和Rust應(yīng)用程序上分別加載全部負(fù)載20秒。
Total CPU | App CPU | Memory Usage | Hits | |
PHP | 121 % | 37 % | 276 MiB | 283 |
Rust | 212 % | 57 % | 31 MiB | 11,297 |
可以看到,Rust在點(diǎn)擊次數(shù)(即在20秒內(nèi)加載的頁(yè)面數(shù)量)上比PHP高出近4000 %。此外,我們看到PHP需要的內(nèi)存幾乎是Rust應(yīng)用程序的9倍。
限定CPU
你可能會(huì)認(rèn)為這是一種不公平的比較,因?yàn)镽ust能夠利用更多的CPU資源。因此,將每個(gè)應(yīng)用容器的CPU使用率限制在20%,并執(zhí)行相同的測(cè)試。
Total CPU | App CPU | Memory Usage | Hits | |
PHP | 44 % | 20 % | 96.3 MiB | 69 |
Rust | 55 % | 20 % | 10.8 MiB | 2,275 |
Rust應(yīng)用程序的總CPU使用量仍然更高,這與Rust能夠處理33倍以上的請(qǐng)求這一事實(shí)有關(guān),因此給數(shù)據(jù)庫(kù)帶來了更高的負(fù)載。同樣,我們可以看到PHP使用了大約9倍的內(nèi)存。
正常測(cè)試
這些雖然意義重大,但都是非常理論化的測(cè)試。在實(shí)踐中,頁(yè)面上不會(huì)有這么多用戶,而且在加載下一個(gè)頁(yè)面之前,他們也會(huì)花幾秒鐘的時(shí)間對(duì)一個(gè)頁(yè)面的加載做出反應(yīng)。為了更真實(shí)地測(cè)試這一點(diǎn),我們?yōu)镾iege提供了9個(gè)不同的url,這些url在頁(yè)面加載后0到10秒之間隨機(jī)訪問。為了獲得更好的概述,我們讓這個(gè)測(cè)試運(yùn)行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應(yīng)用程序需要13%的CPU來處理請(qǐng)求,而Rust容器只需要1%。同樣,在內(nèi)存使用方面,Rust的性能也是PHP的九倍。
事實(shí)證明,Rust不僅對(duì)開發(fā)人員來說更有趣,而且對(duì)資源也非常友好。我們已經(jīng)看到新的Rust應(yīng)用程序比舊的PHP實(shí)現(xiàn)快40倍。在集群中,我們觀察到資源使用的顯著減少。




























