はじめに
この記事は、技術評論社出版の「達人が教える Webパフォーマンスチューニング ~ISUCONから学ぶ高速化の実践」のレビューです。
著者の一人の方から献本を頂きまして、レビューを掲載しています。 それ以外の報酬などはありませんので、思ったことを書いています。
本書のターゲット
パフォーマンスチューニングは私が考えるに大きく2つの視点があると思います。
一つ目はマクロな視点でのチューニング、もう一つがミクロな視点でのチューニングです。
本書が扱っているようなWebサービス (Webアプリケーション) は一つのソフトウェア (いわゆるアプリケーション本体) だけでは動作せず、データベース (多くはRDBMS) やその他のミドルウェアの組み合わせによって動いています。
組み合わせで動いているシステムを高速化するには、マクロな視点で観測しチューニングする必要があります。競技で言うとISUCONが該当します。
一方で、計算をいかに早く行うことが重要なソフトウェアではそのソフトウェアやアルゴリズムに注目してミクロな視点でのパフォーマンスチューニングが必要です。こちらは競技で言うと競技プログラミング (競プロ) が該当します。
ISUCONでは、ミクロな視点にとらわれてアプリケーション本体にのみ関係するアルゴリズムをチューニングしても、ボトルネックは別にあって高速化されないと言うことはザラにあります。
本書はWebアプリケーションのチューニングを想像している読者にはピッタリだと思います。
さまざまな箇所で起こりうるボトルネックを見つけるためのノウハウが詰まってます。
Webアプリケーションのチューニングに視線を向けていますので、アルゴリズムなどのCPU律速なチューニングを求めている場合には思ったことと違うと言うこともあるでしょう。
1章 「チューニングの基礎知識」
最初に、Webサービスとは・高速なWebサービスとは、というところからしっかりと言及されています。
チューニングするためにはまずはモニタリング (計測) することが大事であることもここで説明されます。
2章 「モニタリング」
モニタリングが大事であるため、2章でモニタリングのポイントについて書かれています。
具体的な方法については次章で解説されますので、この章ではモニタリングツールのひとつであるPrometheusを例に仕組みが解説されたりなど、必要な基礎が書かれています。
3章 「基本的な負荷試験」 / 4章 「シナリオを持った負荷試験」
さらに3章・4章でもモニタリングのための試験の方法について解説しています。
3章では単一のページに対する負荷のかけ方や、負荷をかけた時のモニタリングの方法について解説されています。
実際のシステムでは、ユーザーの挙動として一連の流れ (シナリオという) に従って負荷がかけられます。
それを再現してシナリオに沿った負荷試験をする方法が4章で解説されています。
つまり、チューニングの本ではありながら、ここまで100ページ近くが概要と計測のために使われているわけですね。
それぐらいチューニングには計測が重要であるということです。
5章 「データベースのチューニング」
ここからようやく実際のチューニングに入ります。
この章ではデータベースの種類について最初に解説し、特徴を紹介した上で、RDBMSのチューニングについて詳しく見ていきます。
データベースを使っている人には必ず理解しておいて欲しい内容になっています。
6章 「リバースプロキシの利用」
Webサービスにおいては切っても切り離せないのがウェブサーバによるリバースプロキシです。
リバースプロキシの役割はただリクエストをアプリケーションに横流しするだけではありません。
コンテンツによっては圧縮することで高速化することができたり、TLSのチューニングをしたりすることができます。
この章ではnginxを例に挙げて、リバースプロキシの構造とチューニングポイントについて解説されています。
7章 「キャッシュの活用」
ISUCONをやっていると必ず実感すると思いますが、RDBMSってすごく時間かかるんです。
RDBMSに問い合わせしなくてもいいならしないに越したことはありません。
そこで使う手段がキャッシュです。
変化の少ないデータや、アクセス頻度の高いデータをRDBMSから持ってきて、オンメモリのKVSなどに入れておくことで、高速に取得することができます。
ただし、何でもかんでもキャッシュすれば良いというわけではないので、この章ではキャッシュの使い所や注意点について解説されています。
8章 「抑えておきたい高速化手法」
この章ではWebサービスにおけるそれ以外のチューニングについていくつか紹介されています。
Webサービスではいろいろなミドルウェアを経由する、あるいは経由させられるため工夫の仕方がたくさんあります。
そういった部分について触れられています。
9章 「OSの基礎知識とチューニング」
ここまでチューニングを進めると、最終的にはOSが担っている機能のチューニングをしたくなります。
この章ではLinuxがどのように動いているかを解説し、その上でモニタリングやチューニングについて解説されています。
Linux自体のチューニングをしない場合でも、Linuxの仕組み (ひいては色々なOSの仕組み) についての知識はいろんな分野で重要ですので、理解しておきたいところです。
付録
ここまで本書を読み進めると、実際にチューニングしてみたくなると思います。
著者の一人である @catatsuy さんが、社内ISUCONを開催したときの問題「private-isu」を公開しています。
この問題を使うと実際にチューニングをしたり、チューニングの結果どれぐらい速くなるのかを体験することができます。
付録のAでは、初期状態で650点だったprivate-isuが、16ヶ所のチューニングをすることで500倍のスコアになるまでの方法を例として紹介されています。
これまでの章で解説されてきたノウハウが実際にはどのように適用されているのか知ることができるようになっています。
また、付録のBでは、こういった問題を作る上で、計測をするためのソフトウェアであるベンチマーカーの実装についても触れられています。
パフォーマンスチューニングをする上では直接は関係ないですが、並列でたくさんのリクエストを投げて計測するためのノウハウがどのようになっているのかはとても楽しいものです。
まとめ
色々な経験によって身につける知識が、この本にはたくさん詰まっていてとても参考になると思います。
ウェブアプリケーションの開発者、アプリケーションをサーバにデプロイするインフラエンジニア、データベースを使う開発者には仮にISUCONに興味がなかったとしても読んでほしいなと思う本でした。
コラムには「実装する言語によって高速になるのか」など、ソフトウェアエンジニアにとって大切な感覚が書かれていたり、全体を通してチューニングにとどまらない考え方が詰め込まれているのも好きなポイントです。