ひとことで言うと
オーバーヘッドは、本来やりたいことを実現するために避けられない「余分な手間・処理・コスト」の総称です。
ネットワーク通信では、データ本体のほかに宛先・確認・暗号化などの付帯情報が必要です。 プログラムの実行でも、処理本体のほかに準備・切り替え・後始末が走ります。 これらは直接の目的には含まれないのに、必ず発生するコストです。それがオーバーヘッドです。
たとえ話でもう少し詳しく
オーバーヘッドは、荷物の配送に必要な梱包作業に近いです。
- 届けたいのは商品本体(データ)だけ
- でも安全に届けるには、箱・緩衝材・伝票・配送ラベルが必要
- これらは「届ける」という目的のためには欠かせないが、受け取り側が本当に欲しいものではない
ネットワーク通信でも同じです。 「こんにちは」という3文字を相手に送りたくても、パケットにはIPアドレス・ポート番号・チェックサム・プロトコルのヘッダー情報が付いてきます。 これらはデータを正確に届けるために必要ですが、受け取り手が使いたい情報は「こんにちは」だけです。 この付帯情報や処理の部分がオーバーヘッドです。
よく出る場面・使いどころ
- 小さなデータを大量に送ると、データ本体より付帯情報の割合が大きくなる
- TCPの接続確立(3ウェイハンドシェイク)自体が通信のたびに発生するコスト
- HTTPSでは暗号化・復号処理がオーバーヘッドとしてCPUを使う
- 関数呼び出しやデータベース接続にも呼び出しのたびに固定コストがかかる
似た言葉との違い
- レイテンシ
- リクエストを送ってから最初の返事が届くまでの待ち時間
- オーバーヘッドはその待ち時間を長くする原因のひとつだが、概念としては別もの
- 帯域幅
- 一度に運べるデータ量の上限(回線の太さ)
- オーバーヘッドが多いと帯域を余分に消費するが、帯域幅そのものとは違う概念
- パケット
- データを分割した送受信の単位
- パケットのヘッダー部分がネットワークのオーバーヘッドに当たる
実務で気にするポイント
- 小さいリクエストを大量に発行するより、まとめて送る方がオーバーヘッドを減らせる
- 接続の使い回し(コネクションプール、Keep-Alive)でオーバーヘッドを抑えられる
- キャッシュを活用して、同じ処理を何度も繰り返さないようにする
- 最適化の対象としてまずオーバーヘッドを計測し、全体のどこに比率が偏っているか確認する
注意: オーバーヘッドを完全になくすことはできません。「どれだけ削れるか」を考える際は、削ることによる複雑さの増加とトレードオフになることが多いです。過剰な最適化は保守コストを上げるため、計測して本当に問題になっている箇所だけ対処しましょう。