Web開発者のための大規模サービス技術入門

はてなインターンシップの講義録。OSのパフォーマンスを把握してチューニングするための方法に始まり、機械学習アルゴリズムや大規模データ向けのデータ構造を駆使したWebサービスの実装、そして多量のトラフィックをこなすための仕組みまでが概説されている。

負荷の計測方法がわかったところで、OSの性能を向上させるためのチューニング…と言いたいところですが、実は、チューニングの方法は敢えて解説する必要はありません。チューニングという言葉から、本来そのソフトウェアが持っているパフォーマンスを二倍、三倍へと拡げるための施策を想像する方もいるかもしれません。
しかし、チューニングの本当のところは「ボトルネックが発見されたらそれを取り去る」という作業です。そもそも、元々のハードやソフトが持っている性能以上の性能を出すことはどうがんばっても不可能です。やれることは「ハード/ソフトが本来持つ性能が十分発揮できるよう、問題になりそうな箇所があったらそれを取り除く」ぐらいです。
最近のOSやミドルウェアは、デフォルトの状態でも十分なパフォーマンスが発揮できるように設定されています。渋滞していない高速道路の車道を広げても1台の車が目的地に到達するまでの時間が変わらないのと同じで、デフォルトの設定が最適であれば、いくら設定を変えても多くの場合効果はありません。
[Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ)

このようなベースに基づいて、「あるキーワードを含むブログエントリの一覧」というデータ構造を、いかにして小さなデータ量で保持するかという問題への解決(ブログエントリのID順にデータをソートして、"差分"を保持することによって、データ桁数を圧縮する)や、「数十万件のキーワードとブログエントリをマッチングさせて、リンクを挿入する」際、普通の正規表現によるパターンマッチングを使っていたのではスケールしないけれどどうすればよいかという問題への対処(n-gramという、複数のキーワードとのマッチングを同時に効率できるデータ構造で保持することによって、キーワード件数の総量に依存しにくい処理を実装)など、理論的な話を如何にして実際のサービスに適用するかの解説が続く。
大規模Webサービスは、多数の安価なサーバ群に処理を分散させて、できる限りディスクI/Oせずにメモリだけで処理をこなすという戦略がベースにあるものの、それを愚直にこなすためには、多くの理論的な知識や実践上の経験が含まれているのだということが判って面白い本。