時々、Transmitが転送時に多くのCPUを使用しているとお問い合わせをいただくことがあります。本記事ではTransmitの高速なファイル転送を実現するためどのようにCPUを使用しているのか、またにCPU負荷が高すぎると感じた場合にできることについてご説明します。私たちは製品の性能に自信を持っており、Transmitも例外ではありません。
Transmit 5は転送効率と速度の限界に挑戦しており、デフォルトで5つのファイルを同セッションで1度に転送しようとします。通常、OSは1セッションごとにCPUコアを割り振りますが現代のMacにはパワフルなマルチコアCPUが搭載されており、Transmitはそれをフル活用していきます。
はじめに
繰り返しになりますが、Transmitは同時に5つの項目を同時に転送しようとしています。そして同時に転送するファイル数が多くなればなるほどそれに応じてCPUへの負荷は大きくなります。CPU負荷を減らしたい場合は、接続セッション数を減らしてください。編集するには、Transmit環境設定 > 転送
にある同時接続数の上限
の数値を1などに減らしてみてください。接続先のサーバ毎に設定することも可能です。環境設定 > 上級
の詳細サーバ設定から可能です。
*(特に本設定を編集したことが無い場合、デフォルトでプロトコルに応じた同時接続数で接続しようとします。)
技術的な説明
私たちのTransmitでのゴールは、市場で最も速くユーザフレンドリーなファイル転送クライアントアプリです。Transmitを整備・調整する際、“このファイルをどれだけ速く転送し終えるか?”に主眼が置かれています。ファイル転送速度をわざわざ遅くする理由は全くありませんし、多くのユーザもできるだけ速く転送したいと考えています。それはうまくいっていますが、それではなぜCPUを100%使用する必要があるのでしょうか?以下、最も利用されているプロトコルでかつ、最もCPUパワーを必要とするSFTP接続を例にご説明します。
TransmitのSFTP転送パフォーマンスに影響を与える主な3つの要因は、CPU、ストレージ、ネットワークスピードです。PCIe SSDストレージにモダンなネットワーク環境、そしてマルチコアCPUには処理速度を向上させるポテンシャルが秘められています。その中でもストレージとネットワークは非常に高速で、相対的にCPUがボトルネックとなっています。特にSFTP転送ではデータをセキュアに保ちつつ転送も行わなければなりません。それでは詳しく見て行きましょう。
SSHプロトコル、つまりSFTPではサーバがファイルを要求する際、比較的小さなデータブロックを使用します。各ファイルチャンクを読んだ後、まず送信リクエストを送ります。するとサーバはデータと共に応答します。これらのデータブロックは小さく、そのため多くの送受信リクエストを処理する必要があります。Transmitはパイプラインと呼ばれるコンセプトを使用してネットワークアクティビティを高速化しており、次のリクエストの送信前にサーバの応答を待ちません。これによりかなり多くのネットワーキングオーバーヘッドが生じますが、転送速度は数倍になります。次に送受信される各データブロックを最新の暗号化技術で暗号化します。最後に、CPUが高速なネットワーク上からのデータを読み書きします。これはCPUの処理速度に完全に依存します。
大きなファイルをTransmitでダウンロードする際の、シングルコアCPU処理の内訳は以下の様になります:
- 70.5% - ネットワークからデータをローOSレベルでの読み込み
- 9.2% - ネットワークから読み込んだデータの復号化
- 4% - タイムアウトしたデータリクエストのビルドと処理
- 2% - 次のデータブロックのビルドリクエスト
- 5% - 次のデータブロックの暗号化リクエスト
- 8.1% - 上記のタスク処理のためのその他オーバーヘッド
実にCPU使用率の98.8%がファイル転送に費やされています。そして残りの1.2%が進行状況の更新やアプリとOSレベルランタイム間とのメッセージ処理に使用されます。メインスレッドやユーザインタフェースでのやり取りは、ほぼCPU使用率0%です。
最後に
本記事が皆さんの心配をクリアにするものであると期待しています。CPUが限界まで追い込まれているのを見ると心配になるかも知れませんが、OSはタスクのスケジューリングやCPU速度の低下に関して非常に優れた設計が成されています。ほとんどのケースでTransmitに限らず、心配する必要はないでしょう。