Get memory data after booting app in production
Preload the app in `production` env, hit it with a single request, and gather total gem memory consumption data using `derailed exec perf:mem` from `derailed_benchmarks`. Present the result as MR metrics.
This commit is contained in:
parent
5ee5b280b0
commit
fb1d433703
4 changed files with 40 additions and 5 deletions
|
@ -17,3 +17,26 @@ memory-static:
|
|||
- tmp/memory_*.txt
|
||||
reports:
|
||||
metrics: tmp/memory_metrics.txt
|
||||
|
||||
# Show memory usage caused by invoking require per gem.
|
||||
# Unlike `memory-static`, it hits the app with one request to ensure that any last minute require-s have been called.
|
||||
# The application is booted in `production` environment.
|
||||
# All tests are run without a webserver (directly using Rack::Mock by default).
|
||||
memory-on-boot:
|
||||
extends: .rspec-metadata-pg-10
|
||||
variables:
|
||||
NODE_ENV: "production"
|
||||
RAILS_ENV: "production"
|
||||
SETUP_DB: "true"
|
||||
SKIP_STORAGE_VALIDATION: "true"
|
||||
# we override the max_old_space_size to prevent OOM errors
|
||||
NODE_OPTIONS: --max_old_space_size=3584
|
||||
script:
|
||||
# Both bootsnap and derailed monkey-patch Kernel#require, which leads to circular dependency
|
||||
- DISABLE_BOOTSNAP=true PATH_TO_HIT="/users/sign_in" CUT_OFF=0.3 bundle exec derailed exec perf:mem >> 'tmp/memory_on_boot.txt'
|
||||
- scripts/generate-memory-metrics-on-boot tmp/memory_on_boot.txt >> 'tmp/memory_on_boot_metrics.txt'
|
||||
artifacts:
|
||||
paths:
|
||||
- tmp/memory_*.txt
|
||||
reports:
|
||||
metrics: tmp/memory_on_boot_metrics.txt
|
||||
|
|
|
@ -3,7 +3,7 @@ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
|
|||
# Set up gems listed in the Gemfile.
|
||||
require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
|
||||
begin
|
||||
require 'bootsnap/setup'
|
||||
require 'bootsnap/setup' unless ENV['DISABLE_BOOTSNAP']
|
||||
rescue LoadError
|
||||
# bootsnap is an optional dependency, so if we don't have it, it's fine
|
||||
end
|
||||
|
|
11
scripts/generate-memory-metrics-on-boot
Executable file
11
scripts/generate-memory-metrics-on-boot
Executable file
|
@ -0,0 +1,11 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
abort "usage: #{__FILE__} <memory_bundle_mem_file_name>" unless ARGV.length == 1
|
||||
memory_bundle_mem_file_name = ARGV.first
|
||||
|
||||
full_report = File.open(memory_bundle_mem_file_name).read
|
||||
|
||||
stats = /TOP: (?<total_mibs_str>.*) MiB/.match(full_report)
|
||||
abort 'failed to process the benchmark output' unless stats
|
||||
|
||||
puts "total_memory_used_by_dependencies_on_boot_prod_env_mb #{stats[:total_mibs_str].to_f.round(1)}"
|
|
@ -35,6 +35,7 @@ sed -i 's/username: root/username: gitlab/g' config/database.yml
|
|||
|
||||
if [ "$GITLAB_DATABASE" = 'postgresql' ]; then
|
||||
sed -i 's/localhost/postgres/g' config/database.yml
|
||||
sed -i 's/username: git/username: postgres/g' config/database.yml
|
||||
|
||||
if [ -f config/database_geo.yml ]; then
|
||||
sed -i 's/localhost/postgres/g' config/database_geo.yml
|
||||
|
@ -48,16 +49,16 @@ else # Assume it's mysql
|
|||
fi
|
||||
|
||||
cp config/resque.yml.example config/resque.yml
|
||||
sed -i 's/localhost/redis/g' config/resque.yml
|
||||
sed -i 's|url:.*$|url: redis://redis:6379|g' config/resque.yml
|
||||
|
||||
cp config/redis.cache.yml.example config/redis.cache.yml
|
||||
sed -i 's/localhost/redis/g' config/redis.cache.yml
|
||||
sed -i 's|url:.*$|url: redis://redis:6379/10|g' config/redis.cache.yml
|
||||
|
||||
cp config/redis.queues.yml.example config/redis.queues.yml
|
||||
sed -i 's/localhost/redis/g' config/redis.queues.yml
|
||||
sed -i 's|url:.*$|url: redis://redis:6379/11|g' config/redis.queues.yml
|
||||
|
||||
cp config/redis.shared_state.yml.example config/redis.shared_state.yml
|
||||
sed -i 's/localhost/redis/g' config/redis.shared_state.yml
|
||||
sed -i 's|url:.*$|url: redis://redis:6379/12|g' config/redis.shared_state.yml
|
||||
|
||||
if [ "$SETUP_DB" != "false" ]; then
|
||||
setup_db
|
||||
|
|
Loading…
Reference in a new issue