905f8d763a
This reduces the overhead of the method instrumentation code primarily by reducing the number of method calls. There are also some other small optimisations such as not casting timing values to Floats (there's no particular need for this), using Symbols for method call metric names, and reducing the number of Hash lookups for instrumented methods. The exact impact depends on the code being executed. For example, for a method that's only called once the difference won't be very noticeable. However, for methods that are called many times the difference can be more significant. For example, the loading time of a large commit (nrclark/dummy_project@81ebdea5df) was reduced from around 19 seconds to around 15 seconds using these changes.
62 lines
1.7 KiB
Ruby
62 lines
1.7 KiB
Ruby
module Gitlab
|
|
module Metrics
|
|
# Module for gathering system/process statistics such as the memory usage.
|
|
#
|
|
# This module relies on the /proc filesystem being available. If /proc is
|
|
# not available the methods of this module will be stubbed.
|
|
module System
|
|
if File.exist?('/proc')
|
|
# Returns the current process' memory usage in bytes.
|
|
def self.memory_usage
|
|
mem = 0
|
|
match = File.read('/proc/self/status').match(/VmRSS:\s+(\d+)/)
|
|
|
|
if match and match[1]
|
|
mem = match[1].to_f * 1024
|
|
end
|
|
|
|
mem
|
|
end
|
|
|
|
def self.file_descriptor_count
|
|
Dir.glob('/proc/self/fd/*').length
|
|
end
|
|
else
|
|
def self.memory_usage
|
|
0.0
|
|
end
|
|
|
|
def self.file_descriptor_count
|
|
0
|
|
end
|
|
end
|
|
|
|
# THREAD_CPUTIME is not supported on OS X
|
|
if Process.const_defined?(:CLOCK_THREAD_CPUTIME_ID)
|
|
def self.cpu_time
|
|
Process.
|
|
clock_gettime(Process::CLOCK_THREAD_CPUTIME_ID, :millisecond)
|
|
end
|
|
else
|
|
def self.cpu_time
|
|
Process.
|
|
clock_gettime(Process::CLOCK_PROCESS_CPUTIME_ID, :millisecond)
|
|
end
|
|
end
|
|
|
|
# Returns the current real time in a given precision.
|
|
#
|
|
# Returns the time as a Float.
|
|
def self.real_time(precision = :millisecond)
|
|
Process.clock_gettime(Process::CLOCK_REALTIME, precision)
|
|
end
|
|
|
|
# Returns the current monotonic clock time in a given precision.
|
|
#
|
|
# Returns the time as a Float.
|
|
def self.monotonic_time(precision = :millisecond)
|
|
Process.clock_gettime(Process::CLOCK_MONOTONIC, precision)
|
|
end
|
|
end
|
|
end
|
|
end
|