【書評】「達人が教えるWebパフォーマンスチューニング」 Webアプリケーションのパフォーマンスを出すための指針を教えてくれる本

「達人が教えるWebパフォーマンスチューニング」を読んでみました。Webアプリケーションのバックエンド担当の方におすすめします。
2022.06.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ISUCON(Iikanjini Speed Up Contest)というコンテストをご存じでしょうか。ISUCONとは、処理速度のボトルネックを抱えたWebサービスを調査、改善を行い、いかに大量のリクエストを裁けるように出来るかという、Webサービスのパフォーマンスチューニングを競うコンテストです。今回ご紹介する「達人が教えるWebパフォーマンスチューニング」の著者は、そのISUCONの上位入賞者達によって執筆されています。

Webサービスの処理速度を妨げる要因はさまざまですし、調査方法、問題解消の方法も多種多様にわたります。とはいえ、基本的な方針やボトルネックとなりがちな箇所はだいたい決まっています。この本では、Webアプリケーションのパフォーマンスを測定する方法、ボトルネックとなっている箇所を探る方法、問題の解消方法などを解説しています。

多くのユーザが利用するWebサービスは、Webアプリケーションはバグが無いことは言うまでもなく、それと同じくらいに高速なレスポンスで快適に利用できることも重要です。この本では、そのような処理待ちを感じず快適に利用できるWebアプリケーションに仕立て上げるのに役立つでしょう。

こんな方におすすめ

  • Webアプリケーションのパフォーマンスが出なくて困っている方
  • Webアプリケーションの負荷試験において、どこから手を付けて良いのか分からない方
  • 今後ISUCONの上位入賞を狙っていきたい方

各章の概要

Chapter 1 チューニングの基礎知識

なぜチューニングを行うのか、パフォーマンスチューニングするにはどのような点に気をつけてすすめていく必要があるかを解説しています。

Chapter 2 モニタリング

”推測するな、計測せよ”という言葉がありますが、このようなチューニングを行う場合、まず最初に計測することが大事です。この章では、計測方法やツール、またモニタリングする際にさまざまなメトリクスを参照しますが、そのメトリクスを読む際に気をつけることなどが解説されています。

Chapter 3 基礎的な負荷試験

まずは、負荷試験とはどのようなものかを解説しています。負荷試験を行ったことが無い方であれば、負荷試験とは具体的にどのように行い、どのような結果を得て、その得た結果をどのように判断したらよいのか、といったことが本章で理解できるでしょう。

Chapter 4 シナリオを持った負荷試験

Webアプリケーションが1つのWebAPIのみで成り立っている、ということはまずあり得ません。Webアプリケーションとして機能するため、複数のWebAPIが用意されているのが一般的です。

負荷試験を行う際、想定されたユーザが行う一連の流れをシナリオとして定義し、そのシナリオに沿ってWebAPIを呼びだすことにより、より本番に近い負荷のかけ方をして試験を行います。そのシナリオを利用した負荷試験を行う方法や注意点などが解説されています。

Chapter 5 データベースのチューニング

負荷試験を何度か経験すると分かるのですが、ボトルネックがデータベースのスキーマ設計や呼び出し方にある場面はよく遭遇します。この章では、リレーショナルデータベースにおける負荷となりやすい要因やその対処方法について解説しています。また、よく遭遇しがちなN+1問題についても解説されています。

Chapter 6 リバースプロキシの利用

この章では、リバースプロキシを利用しアプリケーションサーバのCPU負荷を下げる方法について解説されています。Webサーバに対するリクエストには、画像などの静的データの取得のためのものも数多く発行されます。そのような静的データを返す場合、リバースプロキシを利用することでWebサーバの負荷を下げることができますので、その方法が解説されています。

Chapter 7 キャッシュの活用

この章では、memcached、 RedisなどのKVSを利用してパフォーマンスチューニングを行う方法が解説されています。通常データを参照する場合はRDBから取得することが多いでしょうか。ただ、この方法はRDBの負荷が高くなりがちで、RDBがボトルネックになってしまう要因となります。

そこで、データの一部をKVSに保持するように処理を変更することで、RDBへの参照回数を減らしてRDBへの負荷を減らす。RDBの負荷が下がることで全体的なパフォーマンスが向上する、といったことがよく行われます。

この章では、そのようなキャッシュを利用した実装方法、監視方法について解説しています。

Chapter 8 押さえておきたい高速化手法

この章では、ここまでで解説されなかったさまざまな高速化の手法が解説されています。

Chapter 9 OSの基礎知識とチューニング

この章ではLinuxカーネルのパラメータを変更することでパフォーマンスチューニングを行う方法を解説しています。サーバの目的によっては、Linuxカーネルの利用状況を調査した上でパラメータを更新することでパフォーマンスチューニングする、といった方法が有効な場合もあります。

本書では、そのようなLinuxカーネルでのパフォーマンスチューニングについて解説されています。

付録

このようなパフォーマンスチューニングは、ある一定規模以上のWebアプリケーションに要求される事です。

そのようなパフォーマンスチューニングを学習するために自らプロジェクトで作成する他にprivate-isuというパフォーマンスチューニング学習向けのプロジェクトを使う方法があります。このprivate-isuを題材に、この本で解説されてきたパフォーマンスチューニングを実際に適用し、その結果どの程度パフォーマンスが向上したかを解説しています。

まとめと感想

パフォーマンスチューニングは、Webアプリケーションのリリース前に行うことが多いです。運用しているWebアプリケーションはAWS上で動作しているからEC2インスタンスの数を増やせば自動的にパフォーマンスが向上する...なんてことはなく、Webアプリケーションのソフトウェア側の設計がボトルネックになっているがために、EC2インスタンスの数を増やしてもパフォーマンスが向上しないことはよくあります。

このようなパフォーマンスチューニングを疎かにしてしまうと、サービスを公開した直後にサーバが大量のリクエストを捌ききれずに落ちてしまって、しばらくユーザが全然利用できない状況がしばらく続き、その結果としてユーザが離脱してしまう、といったような不幸な結果に繋がることも十分考えられます。

私も過去にWebアプリケーションの負荷試験やパフォーマンスチューニングを担当したことがあります。その時には、この本がなかったので、他の人に聞いたり自分で検証したりして経験を積むしかありませんでした。しかし、これからはこの本に書かれている事を事前に学んだあとに負荷試験やパフォーマンスチューニングを行うことで、よりスムーズにそれらを進めることができるでしょう。

おわりに

この本で書かれている内容は、オンプレ、クラウド問わず適用できますので、すべてWebアプリケーション開発者(特にバックエンドエンジニア)に読んでもらいたい本です。