memory_profilerでメモリ割当のボトルネックを計測する(のは難しい)
- memory_profilerべんりだけど、実際に使うと解像度が高すぎて「アプリケーションコードのどこがよくないか」を計測するのは難しいなという所感を得た
- memory_profilerはObjectSpace.allocation_sourcefile メソッドやObjectSpace.allocation_sourcelineメソッドを使ってオブジェクトを生成したコードを取得しているっぽい
- これは例えばアプリケーションで使っているgemをデバッグする、というときには便利
- どのgemのどのファイルのどの行でたくさんオブジェクトが生成されているな、というのがわかる
- が、アプリケーションのどの行でそのgemを使っているか、まではわからない
- 具体的に言うとActiveRecordのオブジェクトをたくさん生成しているところがありそう、と思ってもそれはmemory_profiler経由ではわからない
- MemoryProfiler.reportにallow_filesのようにファイルの絞り込みができるオプションがあるが、これは単に結果リストから絞り込みしているだけ
- ActiveRecordのオブジェクトをたくさん生成していそう、くらいはわかるのでそこからは別のソリューションが必要
- 例えばafter_intialize, after_findフックとcallerを駆使すればどこのアプリケーションコードから生成されたかのリストは取れそうである
- すでにだれか作っててもおかしくなさそうだけどどうなんだろ