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 レイヤーの上で並列化できます。転送する小さなファイルが多数ある場合は、それらをバッチでコピーし、バッチを並列化します。転送するファイルが大きい場合は、チャンクでコピーし、チャンクを並列化します。