ダッシュボードが重い真因は「圧縮し忘れ」だった — 推測仮説を全部外して計測に戻った話

  • #パフォーマンス
  • #gzip
  • #計測
  • #診断
  • #自宅サーバ
ダッシュボードが重い真因は「圧縮し忘れ」だった — 推測仮説を全部外して計測に戻った話

この記事について

自宅サーバで動かしている管理ダッシュボードの「なんか重い」という体感を、推測だけで直そうとして三度外した記録だ。最後は計測に戻ったら一撃で終わった。

結論を先に置く。重さの真因は、161KBの静的HTMLを無圧縮のまま細い上り回線に流していたことだった。gzipを一枚かませたら161KB→18KBになり、体感10秒が1秒台に落ちた。 JavaScriptの量でもデータベースの遅さでもなかった。個人開発者・小規模運用で「サーバが重い」を憶測で追いかけている人向けに、誤診の中身と、なぜ計測が先だったのかを書く。

試した環境: 自宅回線常駐のサーバ上で動く自作ダッシュボード(Python簡易HTTPサーバ配信)+ 上り帯域が細い回線(約128kbps=十数KB/s台)。

何が起きていたか — 同じサーバなのにページによって体感が全然違う

症状はシンプルだった。同じサーバが配信している複数のダッシュボードのうち、ある一枚だけが開くのに体感で10秒近くかかる。別のページは一瞬で出る。サーバの負荷を見ても、CPUもメモリも張り付いていない。

こういうとき、頭は勝手に犯人候補を並べ始める。最初に並んだ仮説はこうだった。

  • 重いページは埋め込んでいるJavaScriptが多いんじゃないか
  • 裏でデータベースを叩いていて、クエリが遅いんじゃないか
  • リクエストのたびにHTMLをライブ生成していて、その生成が重いんじゃないか

もっともらしい。だが、全部外れだった。

誤診その1〜3 — 「ライブ生成が重い」と決めつけて調査結果を鵜呑みにした

一番きつい外し方をしたのが「リクエストのたびにライブ生成しているから重い」という仮説だ。これは調査を投げた結果をそのまま信じて、検証せずにメモにまで書いてしまった。

実際にコードを追ったら、その重いページは毎時バッチで作り置きした静的HTMLをそのまま返しているだけだった。リクエスト時に生成なんてしていない。ライブ生成説は前提から間違っていた。

JSの量でもDBでもライブ生成でもない。候補を三つ潰して残ったのは、誰も見ていなかった一番手前——配信そのものだった。

真因 — 静的HTMLを「無圧縮の生テキスト」で流していた

犯人は、レスポンスの書き出し方だった。ダッシュボードの配信コードは、HTMLをgzipもかけずに生のテキストのまま書き出していた。

ここに回線の細さが噛み合う。重いページのHTMLは161KB、軽いページは13KB。上りが約128kbps(毎秒およそ16KB)しかない回線では、単純計算でこうなる。

ページHTMLサイズ約128kbps(≒16KB/s)での配信時間
重かったページ161KB約10秒
軽かったページ13KB1秒未満

体感差の正体は、処理の重さでも生成コストでもなく、回線を通るバイト数そのものだった。「重い」と感じていたのは、細いホースに太いデータを押し込んでいただけだ。

なお、手前にリバースプロキシ(CDN)は挟まっていた。だがその圧縮はエッジからブラウザまでの区間にしか効かない。ボトルネックはサーバ→エッジの上り区間で、そこは無圧縮のまま通っていた。だから「CDNがあるから大丈夫」という思い込みも、この一区間だけは守ってくれていなかった。

直し方 — レスポンスにgzipを一枚かませるだけ

対策は拍子抜けするほど小さい。配信コードがリクエストの Accept-Encoding を見て、gzip対応ブラウザには圧縮して返し、Content-Encoding: gzip を付けるようにした。HTMLはテキストなので圧縮がよく効く。

  • 重かったページ: 161KB → 18KB(約9倍圧縮)
  • 体感: 約10秒 → 1秒台
  • 効果範囲: 特定の一枚だけでなく、同じ配信コードを通る全ページが速くなった

回線が細いまま、コード側の数KBの変更だけで効いた。回線が太い環境に戻っても圧縮は無害なので、入れっぱなしでいい。ついでに「そもそも埋め込む行数を絞ってHTML自体を小さくする」という次の一手も見えたが、まずはgzipで9割方の体感が戻った。

やってみてわかったこと

この回でいちばん刺さるのは、技術そのものより順番の話だ。「動いていない/重い」と診断する前に、必ず実データを引く。 今回は実測に戻る前に憶測を三つ挟み、三つとも外した。JS説・DB説・ライブ生成説、どれももっともらしかったが、どれも「見ていなかった一番手前の配信バイト数」を素通りしていた。

憶測診断のコストは、直す時間より手戻りにある。推測ベースで原因を断定してメモやドキュメントを書き換えると、外すたびにそれを巻き戻す作業が乗る。実際、ライブ生成説を一度メモに書いてしまい、あとで訂正する羽目になった。

教訓はこう畳める。「重い」の犯人は、処理の奥ではなく配信の手前にいることがある。そして犯人を名指しする前に、まず実データ(サイズ・時間・経路)を一度は自分の目で測れ。 もっともらしい仮説を三つ並べる時間があるなら、一つ測ったほうが速い。

更新履歴

  • 2026-07-08: 初稿