SFTP を使用して複数のコアで暗号化/復号化プロセスを分割する方法はありますか?

SFTP を使用して複数のコアで暗号化/復号化プロセスを分割する方法はありますか?

SFTP 転送の暗号化プロセスで 1 つの CPU コアが最大限に活用される状況です。ただし、IO 帯域幅 (ディスク、バス、ネットワーク) は最大限に活用されるにはほど遠い状態です。

そうは言っても、問題のシステムには複数のコアがあり、暗号化/復号化プロセスでそれらを活用したいと考えています。

それは可能ですか?もし可能ならば、どのようにですか?

注意: 可能であれば、アップストリームに含めるのに十分ではないと判断された変更を含むパッチ セットは避けたいと思いますOpenSSH

答え1

いいえ。SFTPプロトコルでは並列化の機会があまりありません。オリジナルプロトコルパケット内で並列化できない暗号とMACアルゴリズムが必要です。OpenSSHはグローバルCMは並列化できますが、OpenSSH はパケット内での並列化を試みません。プロトコルでは連続するパケットの処理を並列化できますが、OpenSSH はそれを行いません。

OpenSSH はなぜ並列化しないのでしょうか? 並列化は正しく行うのが複雑であり、特定のシナリオでのみパフォーマンスにメリットがあるためです。

  • ほとんどのシナリオでは、ネットワークがボトルネックとなるため、CPU 時間を最適化しても意味がありません。
  • システムが他の処理 (複数の SSH 接続を並列で処理するなど) を実行している場合、SSH 処理を並列化すると他のプロセスのパフォーマンスに悪影響が及びます。
  • 並列化にはコストがかかります。つまり、ワークロードを参加しているプロセッサに送信する必要があり、すべてのプロセッサが終了したときにデータをアセンブルする必要があります。同期には非常に大きなコストがかかるため、並列化は各作業項目が十分に大きい場合にのみ有益です。SSH の場合、パケット内での並列化は有益ではない可能性があります。
  • 複数のパケットの処理を並列化することは可能ですが、ソフトウェアの設計に大きな影響を与えます。単純なデータ ストリーミングではなく、データ層と暗号化層の間に複雑なインターフェイスが必要になります。

OpenSSH はセキュリティを考慮して設計されており、複雑さはセキュリティの敵であるため、並列化を考慮することすら、まったく考えられません。しかし、別の人が並列化を検討しました。HPN-SSH並列処理を可能にする OpenSSH のパッチのセットです。現在でもメンテナンスされています。

ARMv8では、AES、SHA-1、SHA-256のハードウェアアクセラレーションが導入されています。ARMv8ボードをお持ちの場合(32ビットまたは64ビットシステムを実行している場合)、暗号ライブラリ(OpenSSHの場合はOpenSSL)がARMv8アクセラレーションでコンパイルされていることを確認してください。ARMv8より前のボードには、独自の暗号アクセラレーションが搭載されているものがあり、Linuxカーネルによって公開されるただし、OpenSSL はこれをそのままではサポートしていません (カーネルと OpenSSL のパッチはありますが、メンテナンスが中止された履歴があります)。

HPN パッチを使用しない場合は、SSH レイヤーの上で並列化できます。転送する小さなファイルが多数ある場合は、それらをバッチでコピーし、バッチを並列化します。転送するファイルが大きい場合は、チャンクでコピーし、チャンクを並列化します。

関連情報