SFTP転送の暗号化プロセスがCPUコアを占有する状況が発生しました。しかし、私のIO帯域幅(ディスク、バス、ネットワーク)は最大値に達しませんでした。
つまり、問題のシステムにはマルチコアがあります。暗号化/暗号解読プロセス中にこれを利用したいと思います。
それは可能ですか?それでは、どうすればいいですか?
注:可能であれば、アップストリームに含めるほど大きくない修正パッチセットを避けたいと思いますOpenSSH
。
答え1
習慣。 SFTPプロトコルは並列化する機会をあまり残しません。これ元の契約パケット内で並列化できない暗号化およびMACアルゴリズムが必要です。オープンSSHサポートガスクロマトグラフィー、並列化できますが、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層の上で並列化できます。転送する小さなファイルが多い場合は、一括コピーしてバッチ処理を並列化してください。転送する大容量ファイルがある場合は、そのファイルをチャンクにコピーしてチャンクを並列化します。