Performance

有沒有辦法使用 SFTP 在多核上拆分加密/解密過程?

  • October 2, 2016

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

話雖如此,有問題的系統有多個核心:我想在加密/解密過程中利用它們。

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

注意:如果可能的話,我想避免修改的更新檔集被認為不足以包含在 upstream 中OpenSSH

不會。SFTP 協議不會為並行化留下太多機會。原始協議需要不能在數據包內並行化的密碼和 MAC 算法。OpenSSH 支持GCM,可以並行化,但 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 層之上並行化。如果您有許多小文件要傳輸,請將它們分批複製並並行化。如果您有一個大文件要傳輸,請將其複製到塊中並並行化這些塊。

引用自:https://unix.stackexchange.com/questions/313638