こんにちは。メドピアのお手伝いをしています@willnetです。最近車を買いました。これまでペーパードライバーだったので自信を持って運転できるように運転の練習を頑張っています。
今日は社内読書分科会で読んだThe Complete Guide to Rails Performanceという本の話を書きたいと思います。社内読書分科会って何?という人はこちらのエントリを参考にしてください。
The Complete Guide to Rails Performanceとは
タイトルの通り、Railsアプリケーションのパフォーマンスを向上させるための知識やテクニックについて書かれている書籍です。書いている人は Nate Berkopecさんで、パフォーマンスに関するコンサルやワークショップをしているようです。パフォーマンスに関するメールマガジン*1の発行もしています*2。
目次
こちらのgistから引用します。
- An Economist, A Physicist, and a Linguist Walk Into a Bar...
- Little's Law (+ screencast)
- The Business Case for Performance
- Performance Testing (+ screencast)
- Profiling (+ screencast)
- Memory - How to Measure (+ screencast)
- Rack Mini Profiler (+ screencast)
- New Relic
- Skylight
- Optimizing the Front-end
- Chrome Timeline (+ screencast)
- The Optimal Head Tag (+ screencast)
- Resource Hints (+ screencast)
- Turbolinks and View-Over-The-Wire
- Webfonts (+ screencast)
- HTTP/2 (+ screencast)
- JavaScript
- HTTP Caching (+ screencast)
- Memory Bloat (+ screencast)
- Memory Leaks (+ screencast)
- ActiveRecord
- Background Jobs
- Caching
- Slimming Down Your Framework (+ screencast)
- Exceptions as Flow Control
- Webserver Choice
- Idioms - writing faster Ruby
- Streaming
- ActionCable
- CDNs (+ screencast)
- Databases
- JRuby
- Memory Allocators
- SSL (+ screencast)
- Easy Mode Stack - "What stack should I choose?"
- The Complete Checklist - a 75+ item checklist for Ruby/Rails apps.
良かったポイント
Railsでアプリケーションを開発するときに知っておくと良い知識や気をつけるべきポイントについて網羅的にまとめられています。特にRailsアプリケーションだけの話にとどまらず、フロントエンドやCDNなどのwebアプリケーションを構成する要素全体について記述されているのが良いところだと感じています。ユーザが感じるwebアプリケーションの速度はサーバサイドのレスポンス速度だけではなくレイテンシやフロントエンドも含めた総合的な体験であり、通常の構成のwebアプリケーションではアセット類を取得したりパース、実行する時間のほうがユーザが待つ時間の大きい比率を占めるのでまずそちらを見てボトルネックを見つけると良い、というのは言われるとそうですね、となるのですがRailsエンジニアとしてはまずスロークエリとかN+1とかに目がいってしまうのですよね…。
一定規模以上のRailsアプリケーションを運用していると、アプリケーションサーバやワーカのメモリが急に増える現象に遭遇することがあります。そうなったときになにが原因なのかよくわからないのでとりあえず再起動しよう、とpuma_worker_killerやsidekiq-worker-killerなどのツールを使ってお茶を濁すことも多いです。この本ではお茶を濁さずに、原因をメモリリークなのかメモリ肥大化なのかを切り分けるところから、具体的にどうやって調査、解決していったり良いのか方針を提示してくれています。
最近 メドピア内でjemallocを採用した記事が公開されましたが、この本ではjemallocとそれ以外のメモリアロケータ (tcmallocやHoardについてベンチマークが取られておりjemalloc以外の選択肢について考えさせられました(とはいえ採用事例の多いjemalloc側に寄せておくのがいいのかな、というのが現時点での個人的な見解です)。
などなど。もちろんActiveRecordで効率的なクエリを書くのはどうしたらよいか、とかキャッシュの使い方など基本的なトピックも抑えています。洋書を事前に予習しておくというのがハードル高く大変でしたが、それを超えたメリットがある本です。
良くなかったポイント
良いことばかり書くと信憑性に欠けそうなので、良くなかったポイントについても書いておきます。
何度か改訂はされていますが初出が2016年なので、当時の状況と現在の状況を読み替えないといけない箇所があります。具体的にはHTTP/1.1が広く使わている前提になっていてjsを結合して配信しましょう、という文章があちこちにあります。2022年現在ではHTTP/2が広く使われており、jsを結合する必要は薄れているのでそこを意識しつつ読み進める必要があります。
あとはとても細かい点です。HTML, PDF, epub, mobi, txt など複数のフォーマットで本が読めるのは良いのですが、PDF, epub, mobiで読むと横に長いソースコードが全部掲載されていない(右側が切れてしまう)ことがあってtxtなどを参照しにいかないとソースコードを確認できなくてつらい、となりました。あとは編集ミスのような文章の構成(2章分の全然別のトピックが1章にまとめられてる)があるので注意が必要です。
まとめ
The Complete Guide to Rails Performanceの紹介でした。Railsエンジニアでパフォーマンスに興味のある人であれば広くおすすめできる本ですのでよければ読んでみてください!
メドピアでは一緒に働く仲間を募集しています。 ご応募をお待ちしております!
■募集ポジションはこちら
https://medpeer.co.jp/recruit/entry/
■開発環境はこちら