速さだけでは測れないオーバーヘッド

オーバーヘッドは、本来の目的以外に必要な余分な処理や手間のことです。

「こんにちは」の5文字を相手に送りたいだけでも、ネットワークを流れるデータはそれより大きくなります。宛先のIPアドレス、ポート番号、データが壊れていないかを確かめるための値、通信の決まりごとに沿った付帯情報。受け取る側が本当に欲しいのは「こんにちは」だけなのに、それを正しく届けるための情報が必ずくっついてきます。この本来の目的以外にかかる手間やコストが、オーバーヘッドです。

荷物を送るときの梱包に似ています。届けたいのは中身の商品だけでも、安全に届けるには箱、緩衝材、伝票、配送ラベルが要る。どれも受け取り手が欲しいものではないけれど、なくすと届かなくなります。オーバーヘッドには、信頼性や管理のしやすさのために必要なものも多いのです。

気づかないうちに払っている手間

通信やプログラムの中には、こうした梱包の手間があちこちに潜んでいます。

  • 小さなデータを大量に送ると、データ本体より付帯情報の割合のほうが大きくなる
  • TCP では、通信を始めるたびに接続を確立するやり取りが発生する
  • HTTPS では、暗号化と復号の処理が CPU を使う
  • 関数の呼び出しやデータベースへの接続にも、そのたびに決まった手間がかかる

これらは待ち時間(レイテンシ)を長くする原因にもなりますが、待ち時間そのものとは別の概念です。2つの関係はオーバーヘッドとレイテンシの違いで詳しく整理しています。

削る前にどこにかかっているかを測る

オーバーヘッドを減らす定番の方法はいくつかあります。小さなリクエストを何度も送る代わりに、まとめて送る。接続を毎回作り直さず、使い回す(コネクションプール、Keep-Alive)。同じ処理を何度も繰り返さないよう、キャッシュを使う。

ただ、オーバーヘッドを完全になくすことはできません。削ろうとすると仕組みが複雑になり、今度は保守の手間が増えることもよくあります。最初に計測して、全体のどこに手間が偏っているかを確かめ、本当に問題になっている箇所だけに手を入れましょう。