diff options
Diffstat (limited to 'doc/development/performance.md')
-rw-r--r-- | doc/development/performance.md | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/doc/development/performance.md b/doc/development/performance.md index 39fcc8ff806..786b590ec70 100644 --- a/doc/development/performance.md +++ b/doc/development/performance.md @@ -251,6 +251,36 @@ These results can also be placed into a PostgreSQL database by setting the `RSPEC_PROFILING_POSTGRES_URL` variable. This is used to profile the test suite when running in the CI environment. +## Memory profiling + +One of the reasons of the increased memory footprint could be Ruby memory fragmentation. + +To diagnose it, you can visualize Ruby heap as described in [this post by Aaron Patterson](https://tenderlovemaking.com/2017/09/27/visualizing-your-ruby-heap.html). + +To start, you want to dump the heap of the process you are investigating to a JSON file. + +You need to run the command inside the process you are exploring, you may do that with `rbtrace`. +`rbtrace` is already present in GitLab `Gemfile`, you just need to require it. +It could be achieved running webserver or Sidekiq with the environment variable set to `ENABLE_RBTRACE=1`. + +To get the heap dump: + +```ruby +bundle exec rbtrace -p <PID> -e 'File.open("heap.json", "wb") { |t| ObjectSpace.dump_all(output: t) }' +``` + +Having the JSON, you finally could render a picture using the script [provided by Aaron](https://gist.github.com/tenderlove/f28373d56fdd03d8b514af7191611b88) or similar: + +```sh +ruby heapviz.rb heap.json +``` + +Fragmented Ruby heap snapshot could look like this: + +![Ruby heap fragmentation](img/memory_ruby_heap_fragmentation.png) + +Memory fragmentation could be reduced by tuning GC parameters as described in [this post by Nate Berkopec](https://www.speedshop.co/2017/12/04/malloc-doubles-ruby-memory.html), which should be considered as a tradeoff, as it may affect overall performance of memory allocation and GC cycles. + ## Importance of Changes When working on performance improvements, it's important to always ask yourself |