Sha256: 004a431e4ab7c1cb15bf7689fe110b90dff174ccd1ac6185a17e1616b0db02c7

Contents?: true

Size: 1.48 KB

Versions: 39

Compression:

Stored size: 1.48 KB

Contents

# encoding: utf-8

# The GC::Profiler class available on MRI has to be reset periodically to avoid
# memory "leaking" in the underlying implementation. However, it's a major
# bummer for how we want to gather those statistics.
#
# This class comes to the rescue. It relies on being the only party to reset
# the underlying GC::Profiler, but otherwise gives us a steadily increasing
# total time.

module OneApm
  module Support
    module VM
      class MonotonicGCProfiler
        def initialize
          @total_time_s = 0
          @lock         = Mutex.new
        end

        def total_time_s
          if OneApm::LanguageSupport.gc_profiler_enabled?
            # There's a race here if the next two lines don't execute as an atomic
            # unit - we may end up double-counting some GC time in that scenario.
            # Locking around them guarantees atomicity of the read/increment/reset
            # sequence.
            @lock.synchronize do
              # The Ruby 1.9.x docs claim that GC::Profiler.total_time returns
              # a value in milliseconds. They are incorrect - both 1.9.x and 2.x
              # return values in seconds.
              @total_time_s += ::GC::Profiler.total_time
              ::GC::Profiler.clear
            end
          else
            OneApm::Manager.logger.log_once(:warn, :gc_profiler_disabled,
              "Tried to measure GC time, but GC::Profiler was not enabled.")
          end

          @total_time_s
        end
      end
    end
  end
end

Version data entries

39 entries across 39 versions & 1 rubygems

Version Path
oneapm_rpm-1.2.9.rc1 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.8 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.8.rc1 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.7 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.7.rc1 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.6 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.6.rc1 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.5 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.5.rc1 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.4 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.4.rc1 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.3 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.3.rc2 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.2 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.2.rc lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.1 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.1.rc lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.2.0 lib/one_apm/support/vm/monotonic_gc_profiler.rb
oneapm_rpm-1.1.3 lib/one_apm/support/vm/monotonic_gc_profiler.rb