gitlab-org--gitlab-foss/scripts/perf/gc/print_gc_stats.rb

70 lines
1.6 KiB
Ruby
Executable File

# frozen_string_literal: true
# Promotes survivors from eden to old gen and runs a compaction.
#
# aka "Nakayoshi GC"
#
# https://github.com/puma/puma/blob/de632261ac45d7dd85230c83f6af6dd720f1cbd9/lib/puma/util.rb#L26-L35
def nakayoshi_gc
4.times { GC.start(full_mark: false) }
GC.compact
end
# GC::Profiler is used elsewhere in the code base, so we provide a way for it
# to be used exclusively by this script, or otherwise results will be tainted.
module GC::Profiler
class << self
attr_accessor :use_exclusive
%i[enable disable clear].each do |method|
alias_method "#{method}_orig", "#{method}"
define_method(method) do
if use_exclusive
warn "GC::Profiler: ignoring call to #{method}"
return
end
send("#{method}_orig") # rubocop: disable GitlabSecurity/PublicSend
end
end
end
end
GC::Profiler.enable
GC::Profiler.use_exclusive = true
require 'benchmark'
RAILS_ROOT = ENV['RAILS_ROOT']
tms = Benchmark.measure do
require RAILS_ROOT + 'config/boot'
require RAILS_ROOT + 'config/environment'
end
GC::Profiler.use_exclusive = false
nakayoshi_gc
gc_stats = GC.stat
warn gc_stats.inspect
gc_total_time = GC::Profiler.total_time
GC::Profiler.report($stderr)
GC::Profiler.disable
gc_stat_keys = ENV['GC_STAT_KEYS'].to_s.split(',').map(&:to_sym)
values = []
values << ENV['SETTING_CSV']
values += gc_stat_keys.map { |k| gc_stats[k] }
values << ::Gitlab::Metrics::System.memory_usage_rss
values << gc_total_time
values << tms.utime + tms.cutime
values << tms.stime + tms.cstime
values << tms.real
puts values.join(',')