70 lines
1.6 KiB
Ruby
70 lines
1.6 KiB
Ruby
|
# 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(',')
|