class Process::Metrics::Memory::Linux
def self.capture(pid, **options)
def self.capture(pid, **options) usage = Memory.zero begin File.foreach("/proc/#{pid}/smaps_rollup") do |line| if /(?<name>.*?):\s+(?<value>\d+) kB/ =~ line if key = SMAP[name] usage[key] += value.to_i end end end usage.map_count += File.readlines("/proc/#{pid}/maps").size rescue Errno::ENOENT => error # Ignore. end return usage end
def self.capture(pid, **options)
def self.capture(pid, **options) usage = Memory.zero begin File.foreach("/proc/#{pid}/smaps") do |line| # The format of this is fixed according to: # https://github.com/torvalds/linux/blob/351c8a09b00b5c51c8f58b016fffe51f87e2d820/fs/proc/task_mmu.c#L804-L814 if /(?<name>.*?):\s+(?<value>\d+) kB/ =~ line if key = SMAP[name] usage[key] += value.to_i end elsif /VmFlags:\s+(?<flags>.*)/ =~ line # It should be possible to extract the number of fibers and each fiber's memory usage. # flags = flags.split(/\s+/) usage.map_count += 1 end end rescue Errno::ENOENT => error # Ignore. end return usage end
def self.supported?
def self.supported? true end
def self.supported?
def self.supported? true end
def self.supported?
def self.supported? false end
def self.total_size
def self.total_size File.read("/proc/meminfo").each_line do |line| if /MemTotal:\s+(?<total>\d+) kB/ =~ line return total.to_i end end end