有沒有辦法透過 SFTP 將加密/解密過程拆分到多個核心上?

有沒有辦法透過 SFTP 將加密/解密過程拆分到多個核心上?

我遇到的情況是,SFTP 傳輸中的加密過程會佔用一個 CPU 核心。然而,我的 IO 頻寬(磁碟、匯流排和網路)還遠遠未達到最大。

話雖這麼說,所討論的系統有多個核心:我想在加密/解密過程中利用它們。

那可能嗎?如果是這樣,怎麼辦?

注意:如果可能的話,我想避免修改後的補丁集不足以包含在上游中OpenSSH

答案1

不會。這原始協議需要無法在封包內並行化的密碼和 MAC 演算法。 OpenSSH 支持氣相層析法,可以並行化,但 OpenSSH 不會嘗試在資料包內並行化。儘管該協定允許並行處理連續的資料包,但 OpenSSH 並沒有這樣做。

為什麼 OpenSSH 不並行化?因為並行化正確執行起來很複雜,並且只在特定場景下對效能有益:

  • 在大多數情況下,網路是瓶頸,因此優化 CPU 時間是沒有意義的。
  • 如果系統正在執行其他操作(包括並行服務多個 SSH 連線),則並行 SSH 處理會損害其他程序的效能。
  • 並行化是有代價的:工作負載必須傳輸到參與的處理器,並且必須在所有處理器完成後組裝資料。同步的成本相當高,因此只有每個工作項目足夠大時並行化才有用。對於 SSH,資料包內的並行化不太可能有好處。
  • 並行處理多個資料包是可能的,但這會對軟體的設計產生巨大影響:資料層和加密層之間必須有一個複雜的接口,而不是簡單的資料流。

OpenSSH 在設計時就考慮到了安全性,而複雜性是安全性的敵人,因此即使考慮並行化也是非常不符合其特性的。不過,也有人這麼做了:HPN-SSH是一組允許並行處理的 OpenSSH 補丁。直到今天它仍然被維護著。

ARMv8 引入了 AES、SHA-1 和 SHA-256 的硬體加速。如果您有 ARMv8 板(無論您執行的是 32 位元還是 64 位元系統),請確保您的加密程式庫(OpenSSL for OpenSSH)是使用 ARMv8 加速進行編譯的。一些 ARMv8 之前的版本具有專有的加密加速,這可能是由Linux核心暴露,但 OpenSSL 不支援開箱即用(已經有核心和 OpenSSL 補丁,但它們有停止維護的歷史)。

如果您不想使用 HPN 補丁,那麼您可以在 SSH 層之上並行化。如果您有許多小檔案要傳輸,請分批複製它們並並行化批次。如果您有一個大檔案要傳輸,請將其分塊複製並並行化這些區塊。

相關內容