Commit c3b40ae1 authored by Aleksei Lipniagov's avatar Aleksei Lipniagov

Run static benchmarks from 'derailed_benchmarks'

Two static memory benchmarks will be included in our CI pipeline. It
will load gems from the Gemfile and check the amount of RAM consumed
as well as the number of objects allocated and retained.
Aggregated values will be included as 'metrics' into MRs while full
reports will be downloadable as job artifacts.
parent 8716eb0c
...@@ -37,6 +37,7 @@ include: ...@@ -37,6 +37,7 @@ include:
- local: .gitlab/ci/cng.gitlab-ci.yml - local: .gitlab/ci/cng.gitlab-ci.yml
- local: .gitlab/ci/docs.gitlab-ci.yml - local: .gitlab/ci/docs.gitlab-ci.yml
- local: .gitlab/ci/frontend.gitlab-ci.yml - local: .gitlab/ci/frontend.gitlab-ci.yml
- local: .gitlab/ci/memory.gitlab-ci.yml
- local: .gitlab/ci/pages.gitlab-ci.yml - local: .gitlab/ci/pages.gitlab-ci.yml
- local: .gitlab/ci/qa.gitlab-ci.yml - local: .gitlab/ci/qa.gitlab-ci.yml
- local: .gitlab/ci/reports.gitlab-ci.yml - local: .gitlab/ci/reports.gitlab-ci.yml
......
memory-static:
extends: .dedicated-no-docs-no-db-pull-cache-job
script:
# Uses two different reports from the 'derailed_benchmars' gem.
# Loads each of gems in the Gemfile and checks how much memory they consume when they are required.
# 'derailed_benchmarks' internally uses 'get_process_mem'
- scripts/memory-static 'tmp/memory_static_full_report.txt' 'tmp/memory_static_metrics.txt'
# Outputs detailed information about objects created while gems are loaded.
# 'derailed_benchmarks' internally uses 'memory_profiler'
- scripts/memory-static-objects 'tmp/memory_static_objects_full_report.txt' 'tmp/memory_static_metrics.txt'
artifacts:
paths:
- tmp/memory_static_full_report.txt
- tmp/memory_static_objects_full_report.txt
- tmp/memory_static_metrics.txt
reports:
metrics: tmp/memory_static_metrics.txt
#!/usr/bin/env ruby
require_relative '../lib/gitlab/popen'
full_report_filename, metrics_filename = ARGV
abort 'usage: memory-static <full_report_filename> <metrics_filename>' unless full_report_filename && metrics_filename
full_report, status = Gitlab::Popen.popen(%w(bundle exec derailed bundle:mem))
abort 'failed to execute the benchmark' unless status.zero?
File.open(full_report_filename, 'w') do |f|
f.write(full_report)
end
stats = /TOP: (?<total_mibs_str>.*) MiB/.match(full_report.lines.first)
abort 'failed to process the benchmark output' unless stats
File.open(metrics_filename, 'a') do |f|
f.puts "memory_static_total_mb #{stats[:total_mibs_str].to_f.round(1)}"
end
#!/usr/bin/env ruby
require_relative '../lib/gitlab/popen'
full_report_filename, metrics_filename = ARGV
abort 'usage: memory-static-objects <full_report_filename> <metrics_filename>' unless full_report_filename && metrics_filename
full_report, status = Gitlab::Popen.popen(%w(bundle exec derailed bundle:objects))
abort 'failed to execute the benchmark' unless status.zero?
File.open(full_report_filename, 'w') do |f|
f.write(full_report)
end
allocated_str = full_report.lines[1]
retained_str = full_report.lines[2]
allocated_stats = /Total allocated: (?<bytes>.*) bytes \((?<objects>.*) objects\)/.match(allocated_str)
retained_stats = /Total retained: (?<bytes>.*) bytes \((?<objects>.*) objects\)/.match(retained_str)
abort 'failed to process the benchmark output' unless allocated_stats && retained_stats
File.open(metrics_filename, 'a') do |f|
f.puts "memory_static_objects_allocated_mb #{(allocated_stats[:bytes].to_f / (1024 * 1024)).round(1)}"
f.puts "memory_static_objects_retained_mb #{(retained_stats[:bytes].to_f / (104 * 1024)).round(1)}"
f.puts "memory_static_objects_allocated_items #{allocated_stats[:objects]}"
f.puts "memory_static_objects_retained_items #{retained_stats[:objects]}"
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment