メインコンテンツまでスキップ

ネットワーク層のチューニング

ネットワークはしばしば見落とされるボトルネックです。基本的な考え方を学びます。


┌─────────────────────────────────────────────────────────────┐
│ 「海外からだと遅いんです」 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 日本では速いのに、海外拠点からのアクセスが遅い。 │
│ コードもDBも同じなのに、なぜ? │
│ │
│ 答え: 光の速度には限界がある。 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 東京 → ニューヨーク: 片道 35ms、往復 70ms │ │
│ │ TCP接続 + TLS = 3往復 = 210ms(何もしてないのに) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ネットワークは見落とされがちだが、 │
│ 特にグローバルサービスでは無視できない。 │
│ │
│ 物理法則は変えられない → 往復回数を減らす工夫が必要 │
│ │
└─────────────────────────────────────────────────────────────┘

このレイヤーのキー要素

┌─────────────────────────────────────────────────────────────┐
│ ネットワーク層で押さえるべきポイント │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ RTT │ │接続再利用│ │ 圧縮 │ │プロトコル│ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │ │
│ ↓ ↓ ↓ ↓ │
│ 物理的距離 Keep-Alive gzip/brotli HTTP/2, /3 │
│ を縮める 接続プール で転送量削減 多重化 │
│ │
│ RTTは物理法則 → 減らせないなら「回数を減らす」 │
│ │
└─────────────────────────────────────────────────────────────┘

ネットワーク遅延の構成要素

総遅延 = 伝播遅延 + 伝送遅延 + 処理遅延 + キュー遅延

遅延の種類原因対策
伝播遅延物理的な距離(光の速度の限界)東京-NY間: 往復140msCDN、リージョン配置
伝送遅延データサイズ ÷ 帯域幅1MB / 100Mbps = 80ms圧縮、ペイロード削減
処理遅延ルーター、LB等での処理数ms〜ホップ数削減
キュー遅延混雑による待ち時間混雑時に増大帯域確保、QoS

注意: 伝播遅延は物理法則なので改善不可。往復回数を減らすことが重要。


接続のオーバーヘッド

症状: 初回リクエストだけ遅い、短いリクエストなのに時間がかかる

新規接続のコスト

ハンドシェイクRTT数RTT=10ms時RTT=100ms時
TCP 3-way handshake1 RTT10ms100ms
TLS 1.2 handshake2 RTT20ms200ms
合計3 RTT30ms300ms

何もデータを送る前に、これだけの時間がかかる。

対策

対策効果
Keep-Alive接続の再利用、ハンドシェイク不要に
接続プーリング事前に接続を確立しておく
TLS 1.3ハンドシェイクを1 RTTに削減
TLS Session Resumption再接続時のハンドシェイクを簡略化

ペイロードの最適化

症状: レスポンスサイズが大きい、帯域を圧迫している

圧縮

方式圧縮率(テキスト)CPUコスト備考
gzip70-80%削減広くサポート
brotli80-90%削減静的ファイル向き
なし-なしバイナリには不要

不要なデータを送らない

方法内容
フィールド選択必要なフィールドだけ返す(GraphQL的発想)
ページネーション全件取得しない
キャッシュヘッダー変更がなければ304 Not Modified

効率的なフォーマット

フォーマットサイズ可読性用途
JSON一般的なAPI
Protocol BuffersgRPC、内部通信
MessagePackバイナリJSON

HTTP/2 と HTTP/3

症状: 多数の小さなリクエストがある、接続数が多い

プロトコル比較

特性HTTP/1.1HTTP/2HTTP/3
多重化なし(1接続1リクエスト)ありあり
ヘッダー圧縮なしHPACKQPACK
接続確立TCP + TLS = 3 RTTTCP + TLS = 3 RTTQUIC = 1 RTT
HOL BlockingありTCP層でありなし
トランスポートTCPTCPUDP (QUIC)

効果が大きいケース

プロトコル効果が大きいケース
HTTP/2多数の小さなリクエスト、API呼び出し
HTTP/3モバイル、高遅延環境、パケットロスが多い環境

CDN とエッジ

症状: 海外からのアクセスが遅い、静的ファイルの配信に時間がかかる

CDNの効果

経路レイテンシ
ユーザー(東京)→ オリジン(US)100ms以上
ユーザー(東京)→ CDNエッジ(東京)5ms

キャッシュヒット時は、ユーザーに最も近いエッジから即座に応答。

効果的なユースケース

コンテンツCDN向き理由
静的ファイル(画像、CSS、JS)変更がない、キャッシュ効果大
変更頻度の低いAPITTL設定で対応可能
動的コンテンツキャッシュ困難、エッジコンピューティングで対応
認証が必要なAPI×キャッシュ不可、オリジン必須

まとめ

効果の大きいものから

優先度対策効果
1CDN/エッジ配置大(物理的距離を縮める)
2Keep-Alive/接続プール大(ハンドシェイク削減)
3TLS 1.3 採用中(1 RTT削減)
4圧縮(gzip/brotli)中(転送量削減)
5HTTP/2以上の採用中(多重化)

心得

  • RTTは物理法則: 減らせないなら往復回数を減らす
  • 計測して判断: pingやtracerouteでボトルネックを特定
  • トレードオフを理解: 圧縮はCPUを使う、CDNはキャッシュの整合性に注意

次のステップ