基本に立ち戻り、負荷対策

まずは基本に立ち戻り、原因の切り分けから始めました。RRDtoolで出力している自宅サーバーの負荷グラフを見てみたところ、まだ若干の余裕がありました。内部ネットワークにも問題ありません。しかし、外部ネットワークへのパケットが大量に遅延していました。自宅サーバーでの運営で大量のリクエストを裁く上で問題だったのは、サーバー負荷よりもルータ性能の限界だったのです。モバツイの作者として有名なえふしんさんのエントリーでも述べられていますが、この規模のアクセスに対しては、1万円程度の民生用ルータでは全く歯が立ちません。

Webサービスで最初にボトルネックになってくるのは大量のリクエストです。ネギ振りはmixiアプリの表示ビューの中でもっともPV数が多いhome.plに表示されるという特性上、大量のリクエストが発生していました。

Webサービスの負荷対策といえばYahoo Inc.が公開しているHigh Performance Web Sitesです。手法自体は負荷対策としては一般的なものばかりですが、それぞれの手法による効果を実際に計測して効果のあるものに集約し、負荷対策の余地があるかどうかを計測できるYSlowというソフトウェアまで公開したため、公開されるやいなや多くのWebサービスに影響を与えました。日本語にも訳され、「ハイパフォーマンスWebサイト」「続・ハイパフォーマンスWebサイト」という書籍にもなっているので一度読んでみるといいでしょう。

ハイパフォーマンスWebサイト ―高速サイトを実現する14のルール

続・ハイパフォーマンスWebサイト ―ウェブ高速化のベストプラクティス

ハイパフォーマンスWebサイトの実現に向けて

ハイパフォーマンスWebサイトのルールには以下の14個があります(注:2010年8月現在、追加されたものを含め全35ルールが公開されている→参照ページ)。

  1. HTTPリクエストを減らす
  2. CDN(Content Delivery Network)を使う
  3. Expiresヘッダーを設定する
  4. コンポーネントをgzip化する
  5. スタイルシートは先頭に置く
  6. スクリプトは最後に置く
  7. CSS expressionの使用を控える
  8. JavaScriptとCSSは外部ファイル化する
  9. DNSルックアップを減らす
  10. JavaScriptを縮小化する
  11. リダイレクトを避ける
  12. スクリプトを重複させない
  13. ETagの設定を変更する
  14. Ajaxをキャッシュ可能にする

第1章でリクエスト数が多すぎてルータが限界に達していることが分かってたので、まずはリクエストを減らすことを考えます。「ルール1:HTTPリクエストを減らす」です。

ネギ振りはmixiにログインして最初にアクセスされるページであり、mixiアプリの表示ビューの中でももっともPV数が多いhome.plに表示されるので、ネギ振りを使おうとしていないユーザーからもリクエストが飛んできていることになります。これを軽減させるためには、ネギ振りを使わないユーザーにはコンテンツを表示しないで、実際に必要になってからローディングするような設定が一番です。いわゆる遅延ローディングです。

ネギ振りは現在のカウント数の取得に遅延ローディングを使うことにしました。試しにonloadイベントが発行されてから数秒後に現在のカウント数を取得するリクエストを発行するようにして、ネギ振りの連打を検知して数秒待ってからリクエストを送るようにしたところ、リクエスト数が 1/20以下に激減しました。もちろんユーザーエクスペリエンスを損なっては意味が無いので、ローディング中でもネギを振れるようにしてネギを振ればすぐに最新のカウントに更新されるようにしました。homeガジェットは1画面内に入らないため、ユーザーが待たされていることを意識されない作りになっています。

もちろん、この方法はrun_appli.plではあまり効果的とは言えません。遅延ローディングが効いてくるのは、遷移しないで1ページにたくさんの機能を持たせる場合や、ページの主なコンテンツ以外の部分(サイドバー、フッターなど)に使う場合だけです。

HTTPリクエストを減らすというのは、一回の表示で読み込まれるファイル数を減らすのと同じ意味です。JSファイルやCSSファイルを結合したり、画像ファイルを結合してCSS Spriteで表示する方法もあります。細かい大量の画像を配信しているサイトになるとかなり効果がありますが、ネギ振りは一回に読み込まれるコンテンツがもともと少ないので結合はしませんでした。

また、第3回でも解説したPersistence APIというアプリのデータを永続化させるAPIを使うことで、自分のサーバーを使わずにmixi側で保存もできます。

詳細情報:mixi Developer Center「情報を共有してみよう」

今回はPersistenceAPIを使っていませんが、ユーザーの設定などサーバーに問い合わせる必要のないデータは、できるだけmixi側に永続化させることでサーバーへのリクエスト自体を減らせます。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30