VPNはバッテリーを消耗するのか、無線がすでにやっていたこと
暗号化は請求のごく一部にすぎない。転送、無線の起床、再接続を切り分け、一つの条件だけが違う二回の実行を比べる。
バッテリー消耗の訴えは、たいてい「VPNがバッテリーを食う」という形で届く。これは観測ではなく結論だ。測定が示すのは、転送、無線の起床、再接続が混ざり合って端末を忙しくさせていたということだ。暗号化もその請求に寄与するが、現代のスマートフォンでは最大の項目になることはまれだ。三つを切り分ければ、訴えは実際に検証できるものになる。
トンネルがパケットの旅に加えるもの
トンネルが運ぶパケットは一つひとつ、認証され、暗号化され、別のヘッダーで包まれ、反対側で開かれる。この作業はプロセッサのサイクルを消費し、さらに重要なことに、ペイロードだけで済む場合より長くネットワークインターフェースを忙しくさせる。トンネルを通る十分間のバックアップは、やはり十分間のバックアップであり、パケットあたりのオーバーヘッドが少し増えるだけだ。バイト数も所要時間もアプリケーションから来るのであって、トンネルからではない。
だからバッテリー報告のパーセントは、オーバーヘッドの手がかりとしては頼りにならない。報告は作業を部品ごとに割り当てるが、その割り当ての規則はプラットフォームによって異なる。
報告は、ネットワークカウンターと画面点灯時間と並べて読む。転送の時間帯が消耗の時間帯と一致していれば、作業量が結果を説明しており、プロトコルは後回しでよい。カウンターが横ばいのまま消耗が続くなら、何かが無線を起こし続けている。次の節が、その見るべき場所だ。
キープアライブ、再接続、無線の起きている状態
アイドルに見える画面は、アイドルなネットワークを証明しない。同期、メッセージ、更新確認はいずれも少量のトラフィックを送り、それぞれが交換そのものよりずっと長い時間、無線を低電力状態から引き出しうる。小さく頻繁なトラフィックは、固定費が支配するためバイトあたりで高くつく。
トンネルはキープアライブという形で独自の小さなトラフィックを加える。これはNATマッピングを開いたままにしたり、消えた相手に気づいたりするためのものだ。その目的はプロトコルとネットワークによって変わり、切ると活動は減っても、アイドル期間の後にトンネルが使えなくなることがある。別の値を試すなら、元の値を記録し、その後もトンネルが復帰することを確認する。別のプロトコルから間隔を持ち込んではならない。ある設計に合う定数が、別の設計では恣意的だからだ。
二つ目のコストは接続の入れ替わりだ。数分おきに再接続するクライアントは、ペイロードではなくハンドシェイクに時間を使い、無線は落ち着く機会を得られない。
プラットフォームが電力を節約するためにトンネルを止めるとき
モバイルOSはバックグラウンド実行を制限しており、トンネルもその方針の例外ではない。画面が消えると接続が消えるのは、たいていサーバーがセッションを拒否しているのではなく、プラットフォームとの統合の問題だ。まず見るべきはクライアント自身のバッテリーに関する指針で、スリープをまたいで接続を保つための対応方法が書かれている。
すべてを電力管理の対象外にすることは解決ではない。別の作業負荷を生み、あなたが作ろうとしていた比較を壊してしまう。
次に、端末が眠ったときにどうするかを決める。常時接続の動作、トンネルなしでのブロック、バッテリー最適化は、それぞれ別の問いに答えるものだ。必要な通信範囲を静かに落として電力を節約する設定は、当初の目的を守っておらず、失敗を隠している。何かを調整する前に、意図する方針を書き留める。それがなければ、消耗するトンネルと単に存在しないトンネルのどちらかを選び、どちらの結果も成功と呼ぶことになる。
信じる代わりに比較を組み立てる
同じもの同士を比べる:同じ作業、同じネットワーク、同じ時間、似た電波状況。転送されたデータ、再接続の回数、端末の温度、電波の条件を記録する。どれか一つでも結果を動かせるからだ。一時間で数パーセントのバッテリーは多くのスマートフォンのノイズの範囲内だが、何回も繰り返して現れる傾向はそうではない。Android VPN のガイドは、行儀のよいクライアントが従うライフサイクルと常時接続の振る舞いを説明しており、そうなっていないクライアントを考える上で有用な文脈になる。
任意の大きな転送は、電力とネットワークの両方が安い時間帯に移す。
そして比較が示したとおりに動く。作業量が原因なら、作業量を予定に組み込む。入れ替わりが原因なら、それを引き起こすネットワーク遷移を直す。プラットフォームが原因なら、そのクライアントの対応しているバッテリー方針に従う。暗号設定を弱めることは、原因に触れずに数値だけを改善する唯一の変更であり、だからこそ誰もが最後に手を伸ばすべきものだ。