「こんにちは」の5文字を相手に送りたいだけでも、ネットワークを流れるデータはそれより大きくなります。宛先のIPアドレス、ポート番号、データが壊れていないかを確かめるための値、通信の決まりごとに沿った付帯情報。受け取る側が本当に欲しいのは「こんにちは」だけなのに、それを正しく届けるための情報が必ずくっついてきます。この本来の目的以外にかかる手間やコストが、オーバーヘッドです。
荷物を送るときの梱包に似ています。届けたいのは中身の商品だけでも、安全に届けるには箱、緩衝材、伝票、配送ラベルが要る。どれも受け取り手が欲しいものではないけれど、なくすと届かなくなります。オーバーヘッドには、信頼性や管理のしやすさのために必要なものも多いのです。
気づかないうちに払っている手間
通信やプログラムの中には、こうした梱包の手間があちこちに潜んでいます。
- 小さなデータを大量に送ると、データ本体より付帯情報の割合のほうが大きくなる
- TCP では、通信を始めるたびに接続を確立するやり取りが発生する
- HTTPS では、暗号化と復号の処理が CPU を使う
- 関数の呼び出しやデータベースへの接続にも、そのたびに決まった手間がかかる
これらは待ち時間(レイテンシ)を長くする原因にもなりますが、待ち時間そのものとは別の概念です。2つの関係はオーバーヘッドとレイテンシの違いで詳しく整理しています。
削る前にどこにかかっているかを測る
オーバーヘッドを減らす定番の方法はいくつかあります。小さなリクエストを何度も送る代わりに、まとめて送る。接続を毎回作り直さず、使い回す(コネクションプール、Keep-Alive)。同じ処理を何度も繰り返さないよう、キャッシュを使う。
ただ、オーバーヘッドを完全になくすことはできません。削ろうとすると仕組みが複雑になり、今度は保守の手間が増えることもよくあります。最初に計測して、全体のどこに手間が偏っているかを確かめ、本当に問題になっている箇所だけに手を入れましょう。