├── .github └── workflows │ ├── check_changelog.yml │ └── ci.yml ├── .gitignore ├── .standard.yml ├── .travis.yml ├── CHANGELOG.md ├── Gemfile ├── README.md ├── Rakefile ├── appveyor.yml ├── get_process_mem.gemspec ├── lib ├── get_process_mem.rb └── get_process_mem │ ├── darwin.rb │ └── version.rb └── test ├── fixtures ├── heroku-bash-smap └── heroku-bash-status ├── get_process_mem_test.rb └── test_helper.rb /.github/workflows/check_changelog.yml: -------------------------------------------------------------------------------- 1 | name: Check Changelog 2 | 3 | on: [pull_request] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v1 10 | - name: Check that CHANGELOG is touched 11 | run: | 12 | cat $GITHUB_EVENT_PATH | jq .pull_request.title | grep -i '\[\(\(changelog skip\)\|\(ci skip\)\)\]' || git diff remotes/origin/${{ github.base_ref }} --name-only | grep CHANGELOG.md 13 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | - push 5 | - pull_request 6 | 7 | jobs: 8 | test: 9 | runs-on: ubuntu-latest 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | ruby: 14 | - 2.6 15 | - 2.7 16 | - 3.0 17 | - 3.1 18 | - 3.2 19 | - 3.3 20 | - head 21 | steps: 22 | - name: Checkout code 23 | uses: actions/checkout@v4 24 | - name: Set up Ruby 25 | uses: ruby/setup-ruby@v1 26 | with: 27 | ruby-version: ${{ matrix.ruby }} 28 | bundler-cache: true 29 | - name: Ruby linting 30 | run: bundle exec standardrb 31 | - name: test 32 | run: bundle exec rake test 33 | continue-on-error: ${{ matrix.ruby == 'head' }} 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.gem 2 | Gemfile.lock 3 | -------------------------------------------------------------------------------- /.standard.yml: -------------------------------------------------------------------------------- 1 | ruby_version: 2.6 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | os: 3 | - linux 4 | - osx 5 | 6 | before_install: 7 | - gem install bundler -v 1.17.3 8 | 9 | rvm: 10 | - 2.2 11 | - 2.6 12 | - ruby-head 13 | - jruby-head 14 | - truffleruby 15 | 16 | matrix: 17 | allow_failures: 18 | - rvm: 2.2 19 | if: os = osx 20 | - rvm: ruby-head 21 | - rvm: jruby-head 22 | - rvm: truffleruby 23 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## HEAD (unreleased) 2 | 3 | ## 1.0.0 4 | 5 | - Ensure PID is an integer (https://github.com/schneems/get_process_mem/pull/46) 6 | - Minimum Ruby version is now Ruby 2.6 7 | - Add `bigdecimal` as a dependency. 8 | 9 | ## 0.2.7 10 | 11 | - Native (faster) support for returning memory from different PIDs on mac (https://github.com/schneems/get_process_mem/pull/42) 12 | 13 | ## 0.2.6 14 | 15 | - Support returning memory from different PIDs on mac (https://github.com/schneems/get_process_mem/pull/41) 16 | 17 | ## 0.2.5 18 | 19 | - Use new sys-proctable interface (https://github.com/schneems/get_process_mem/pull/36) 20 | 21 | ## 0.2.4 22 | 23 | - Use FFI to speed up memory lookup on Mac (darwin) by roughly 12x (#32) 24 | 25 | ## 0.2.3 26 | 27 | - Silence BigDecimal deprecation warning under Ruby 2.5 (#26) 28 | 29 | ## 0.2.2 30 | 31 | - Fix support for Ruby 2.4 (#23) 32 | 33 | ## 0.2.1 34 | 35 | - ??? 36 | 37 | ## 0.2.0 38 | 39 | - Reverting back to RSS for linux until (#7) is resolved 40 | 41 | ## 0.1.1 42 | 43 | - Bugfix: the `ps` style of memory reporting should always use RSS, and Linux should always use PSS 44 | 45 | ## 0.1.0 46 | 47 | - Default to using PSS for linux (#2 & #3) @ksoderstrom 48 | - Correct for bit shifting truncation (#4) @ksoderstrom 49 | 50 | ## 0.0.1 51 | 52 | - Initial 53 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | gem "sys-proctable" 3 | 4 | gemspec 5 | 6 | gem "standard" 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Get Process Memory 2 | 3 | [![CI](https://github.com/zombocom/get_process_mem/actions/workflows/ci.yml/badge.svg)](https://github.com/zombocom/get_process_mem/actions/workflows/ci.yml) 4 | [![Help Contribute to Open Source](https://www.codetriage.com/zombocom/get_process_mem/badges/users.svg)](https://www.codetriage.com/zombocom/get_process_mem) 5 | 6 | Do you need to get the memory usage of a process? Great because this library does that. 7 | 8 | ## Install 9 | 10 | In your `Gemfile` add 11 | 12 | ```ruby 13 | gem 'get_process_mem' 14 | ``` 15 | 16 | then run `$ bundle install`. 17 | 18 | If you're using Windows you'll also need to have the `sys-proctable` gem. 19 | 20 | ## Use It 21 | 22 | Get the current process memory usage: 23 | 24 | ```ruby 25 | mem = GetProcessMem.new 26 | puts mem.inspect 27 | # 28 | mem.bytes # => 25460736 29 | mem.kb # => 24864.0 30 | mem.mb # => 24.28125 31 | mem.gb # => 0.023712158203125 32 | ``` 33 | 34 | Note: All numeric values returned as a float except bytes which is an integer. 35 | 36 | Get memory usage of another process: 37 | 38 | ```ruby 39 | `echo 'nothing to see here' > tmplogf` 40 | pid = Process.spawn('tail -f tmplog') 41 | mem = GetProcessMem.new(pid) 42 | puts mem.inspect 43 | # => # 44 | 45 | Process.kill('TERM', pid) 46 | Process.wait(pid) 47 | 48 | mem.inspect 49 | # => "#" 50 | `rm tmplog` 51 | ``` 52 | 53 | On Linux, for memory size we return the RSS or the [Resident Set Size](http://en.wikipedia.org/wiki/Resident_set_size), basically how much memory the program takes up in RAM at the time, including all the shared memory. 54 | 55 | 56 | ## License 57 | 58 | MIT 59 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require "bundler/gem_tasks" 2 | 3 | require "rake" 4 | require "rake/testtask" 5 | 6 | task default: [:test] 7 | 8 | Rake::TestTask.new(:test) do |t| 9 | t.libs << "lib" 10 | t.libs << "test" 11 | t.pattern = "test/**/*_test.rb" 12 | t.verbose = false 13 | end 14 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | install: 2 | - set PATH=C:\Ruby22\bin;%PATH% 3 | - bundle install 4 | 5 | build: off 6 | 7 | before_test: 8 | - ruby -v 9 | - gem -v 10 | - bundle -v 11 | 12 | test_script: 13 | - bundle exec rake 14 | 15 | environment: 16 | matrix: 17 | - RUBY_VERSION: 23 18 | - RUBY_VERSION: 22 19 | - RUBY_VERSION: 21 20 | - RUBY_VERSION: 200 21 | -------------------------------------------------------------------------------- /get_process_mem.gemspec: -------------------------------------------------------------------------------- 1 | lib = File.expand_path("../lib", __FILE__) 2 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 3 | require "get_process_mem/version" 4 | 5 | Gem::Specification.new do |gem| 6 | gem.name = "get_process_mem" 7 | gem.version = GetProcessMem::VERSION 8 | gem.authors = ["Richard Schneeman"] 9 | gem.email = ["richard.schneeman+rubygems@gmail.com"] 10 | gem.description = " Get memory usage of a process in Ruby " 11 | gem.summary = " Use GetProcessMem to find out the amount of RAM used by any process " 12 | gem.homepage = "https://github.com/schneems/get_process_mem" 13 | gem.license = "MIT" 14 | 15 | gem.files = `git ls-files`.split($/) 16 | gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) } 17 | gem.require_paths = ["lib"] 18 | 19 | gem.required_ruby_version = ">= 2.6" 20 | 21 | gem.add_dependency "ffi", "~> 1.0" 22 | gem.add_dependency "bigdecimal", ">= 2.0" 23 | 24 | gem.add_development_dependency "sys-proctable", "~> 1.2" 25 | gem.add_development_dependency "rake", "~> 12" 26 | gem.add_development_dependency "test-unit", "~> 3" 27 | end 28 | -------------------------------------------------------------------------------- /lib/get_process_mem.rb: -------------------------------------------------------------------------------- 1 | require "pathname" 2 | require "bigdecimal" 3 | 4 | # Cribbed from Unicorn Worker Killer, thanks! 5 | class GetProcessMem 6 | private_class_method def self.number_to_bigdecimal(value) 7 | BigDecimal(value) 8 | end 9 | 10 | private def number_to_bigdecimal(value) 11 | self.class.send(:number_to_bigdecimal, value) 12 | end 13 | 14 | KB_TO_BYTE = number_to_bigdecimal 1024 # 2**10 = 1024 15 | MB_TO_BYTE = number_to_bigdecimal 1_048_576 # 1024**2 = 1_048_576 16 | GB_TO_BYTE = number_to_bigdecimal 1_073_741_824 # 1024**3 = 1_073_741_824 17 | CONVERSION = {"kb" => KB_TO_BYTE, "mb" => MB_TO_BYTE, "gb" => GB_TO_BYTE} 18 | ROUND_UP = number_to_bigdecimal "0.5" 19 | attr_reader :pid 20 | 21 | RUNS_ON_WINDOWS = Gem.win_platform? 22 | 23 | if RUNS_ON_WINDOWS 24 | begin 25 | require "sys/proctable" 26 | rescue LoadError => e 27 | message = "Please add `sys-proctable` to your Gemfile for windows machines\n" 28 | message << e.message 29 | raise e, message 30 | end 31 | include Sys 32 | end 33 | 34 | RUNS_ON_DARWIN = Gem.platforms.detect do |p| 35 | p.is_a?(Gem::Platform) && p.os == "darwin" 36 | end 37 | 38 | if RUNS_ON_DARWIN 39 | begin 40 | require "get_process_mem/darwin" 41 | rescue LoadError => e 42 | message = "Please add `ffi` to your Gemfile for darwin (macos) machines\n" 43 | message << e.message 44 | raise e, message 45 | end 46 | end 47 | 48 | def initialize(pid = Process.pid) 49 | @status_file = Pathname.new "/proc/#{pid}/status" 50 | @process_file = Pathname.new "/proc/#{pid}/smaps" 51 | @pid = Integer(pid) 52 | @linux = @status_file.exist? 53 | end 54 | 55 | def linux? 56 | @linux 57 | end 58 | 59 | def bytes 60 | memory = linux_status_memory if linux? 61 | memory ||= darwin_memory if RUNS_ON_DARWIN 62 | memory ||= ps_memory 63 | memory 64 | end 65 | 66 | def kb(b = bytes) 67 | (b / KB_TO_BYTE).to_f 68 | end 69 | 70 | def mb(b = bytes) 71 | (b / MB_TO_BYTE).to_f 72 | end 73 | 74 | def gb(b = bytes) 75 | (b / GB_TO_BYTE).to_f 76 | end 77 | 78 | def inspect 79 | b = bytes 80 | "#<#{self.class}:0x%08x @mb=#{mb b} @gb=#{gb b} @kb=#{kb b} @bytes=#{b}>" % (object_id * 2) 81 | end 82 | 83 | # linux stores memory info in a file "/proc/#{pid}/status" 84 | # If it's available it uses less resources than shelling out to ps 85 | def linux_status_memory(file = @status_file) 86 | line = file.each_line.detect { |line| line.start_with? "VmRSS".freeze } 87 | return unless line 88 | return unless (_name, value, unit = line.split(nil)).length == 3 89 | CONVERSION[unit.downcase!] * value.to_i 90 | rescue Errno::EACCES, Errno::ENOENT 91 | 0 92 | end 93 | 94 | # linux stores detailed memory info in a file "/proc/#{pid}/smaps" 95 | def linux_memory(file = @process_file) 96 | lines = file.each_line.select { |line| line.match(/^Rss/) } 97 | return if lines.empty? 98 | lines.reduce(0) do |sum, line| 99 | line.match(/(?\d*\.{0,1}\d+)\s+(?\w\w)/) do |m| 100 | value = number_to_bigdecimal(m[:value]) + ROUND_UP 101 | unit = m[:unit].downcase 102 | sum += CONVERSION[unit] * value 103 | end 104 | sum 105 | end 106 | rescue Errno::EACCES 107 | 0 108 | end 109 | 110 | # Pull memory from `ps` command, takes more resources and can freeze 111 | # in low memory situations 112 | def ps_memory 113 | if RUNS_ON_WINDOWS 114 | size = ProcTable.ps(pid: pid).working_set_size 115 | number_to_bigdecimal(size) 116 | else 117 | mem = `ps -o rss= -p #{pid}` 118 | KB_TO_BYTE * number_to_bigdecimal((mem == "") ? 0 : mem) 119 | end 120 | end 121 | 122 | def darwin_memory 123 | Darwin.resident_size(pid) 124 | rescue Errno::EPERM 125 | nil 126 | end 127 | end 128 | -------------------------------------------------------------------------------- /lib/get_process_mem/darwin.rb: -------------------------------------------------------------------------------- 1 | require "ffi" 2 | 3 | class GetProcessMem 4 | class Darwin 5 | extend FFI::Library 6 | ffi_lib "proc" 7 | 8 | class TaskInfo < FFI::Struct 9 | layout :pti_virtual_size, :uint64, 10 | :pti_resident_size, :uint64, 11 | :pti_total_user, :uint64, 12 | :pti_total_system, :uint64, 13 | :pti_threads_user, :uint64, 14 | :pti_threads_system, :uint64, 15 | :pti_policy, :int32, 16 | :pti_faults, :int32, 17 | :pti_pageins, :int32, 18 | :pti_cow_faults, :int32, 19 | :pti_messages_sent, :int32, 20 | :pti_messages_received, :int32, 21 | :pti_syscalls_mach, :int32, 22 | :pti_syscalls_unix, :int32, 23 | :pti_csw, :int32, 24 | :pti_threadnum, :int32, 25 | :pti_numrunning, :int32, 26 | :pti_priority, :int32 27 | end 28 | 29 | attach_function :proc_pidinfo, 30 | [ 31 | :int, # pid 32 | :int, # flavour 33 | :uint64, # arg, not needed for this selector 34 | TaskInfo.by_ref, # output buffer 35 | :int # size of buffer 36 | ], 37 | :int 38 | 39 | PROC_PIDTASKINFO = 4 # from sys/proc_info.h 40 | 41 | class << self 42 | def resident_size(pid) 43 | get_proc_pidinfo(pid)[:pti_resident_size] 44 | end 45 | 46 | private 47 | 48 | def get_proc_pidinfo(pid) 49 | data = TaskInfo.new 50 | result = proc_pidinfo(pid, PROC_PIDTASKINFO, 0, data, TaskInfo.size) 51 | if result == TaskInfo.size 52 | data 53 | else 54 | raise SystemCallError.new("proc_pidinfo returned #{result}", FFI.errno) 55 | end 56 | end 57 | end 58 | end 59 | end 60 | -------------------------------------------------------------------------------- /lib/get_process_mem/version.rb: -------------------------------------------------------------------------------- 1 | class GetProcessMem 2 | VERSION = "1.0.0" 3 | end 4 | -------------------------------------------------------------------------------- /test/fixtures/heroku-bash-smap: -------------------------------------------------------------------------------- 1 | 00400000-004db000 r-xp 00000000 07:01 72877 /bin/bash 2 | Size: 876 kB 3 | Rss: 532 kB 4 | Pss: 532 kB 5 | Shared_Clean: 0 kB 6 | Shared_Dirty: 0 kB 7 | Private_Clean: 532 kB 8 | Private_Dirty: 0 kB 9 | Referenced: 532 kB 10 | Anonymous: 0 kB 11 | AnonHugePages: 0 kB 12 | Swap: 0 kB 13 | KernelPageSize: 4 kB 14 | MMUPageSize: 4 kB 15 | Locked: 0 kB 16 | VmFlags: rd ex mr mw me dw 17 | 006da000-006db000 r--p 000da000 07:01 72877 /bin/bash 18 | Size: 4 kB 19 | Rss: 4 kB 20 | Pss: 4 kB 21 | Shared_Clean: 0 kB 22 | Shared_Dirty: 0 kB 23 | Private_Clean: 0 kB 24 | Private_Dirty: 4 kB 25 | Referenced: 4 kB 26 | Anonymous: 4 kB 27 | AnonHugePages: 0 kB 28 | Swap: 0 kB 29 | KernelPageSize: 4 kB 30 | MMUPageSize: 4 kB 31 | Locked: 0 kB 32 | VmFlags: rd mr mw me dw ac 33 | 006db000-006e4000 rw-p 000db000 07:01 72877 /bin/bash 34 | Size: 36 kB 35 | Rss: 36 kB 36 | Pss: 36 kB 37 | Shared_Clean: 0 kB 38 | Shared_Dirty: 0 kB 39 | Private_Clean: 0 kB 40 | Private_Dirty: 36 kB 41 | Referenced: 36 kB 42 | Anonymous: 36 kB 43 | AnonHugePages: 0 kB 44 | Swap: 0 kB 45 | KernelPageSize: 4 kB 46 | MMUPageSize: 4 kB 47 | Locked: 0 kB 48 | VmFlags: rd wr mr mw me dw ac 49 | 006e4000-006ea000 rw-p 00000000 00:00 0 50 | Size: 24 kB 51 | Rss: 24 kB 52 | Pss: 24 kB 53 | Shared_Clean: 0 kB 54 | Shared_Dirty: 0 kB 55 | Private_Clean: 0 kB 56 | Private_Dirty: 24 kB 57 | Referenced: 24 kB 58 | Anonymous: 24 kB 59 | AnonHugePages: 0 kB 60 | Swap: 0 kB 61 | KernelPageSize: 4 kB 62 | MMUPageSize: 4 kB 63 | Locked: 0 kB 64 | VmFlags: rd wr mr mw me ac 65 | 020c0000-0210e000 rw-p 00000000 00:00 0 [heap] 66 | Size: 312 kB 67 | Rss: 312 kB 68 | Pss: 312 kB 69 | Shared_Clean: 0 kB 70 | Shared_Dirty: 0 kB 71 | Private_Clean: 0 kB 72 | Private_Dirty: 312 kB 73 | Referenced: 312 kB 74 | Anonymous: 312 kB 75 | AnonHugePages: 0 kB 76 | Swap: 0 kB 77 | KernelPageSize: 4 kB 78 | MMUPageSize: 4 kB 79 | Locked: 0 kB 80 | VmFlags: rd wr mr mw me ac 81 | 7f28ff505000-7f28ff511000 r-xp 00000000 07:01 81120 /lib/libnss_files-2.11.1.so 82 | Size: 48 kB 83 | Rss: 16 kB 84 | Pss: 0 kB 85 | Shared_Clean: 16 kB 86 | Shared_Dirty: 0 kB 87 | Private_Clean: 0 kB 88 | Private_Dirty: 0 kB 89 | Referenced: 16 kB 90 | Anonymous: 0 kB 91 | AnonHugePages: 0 kB 92 | Swap: 0 kB 93 | KernelPageSize: 4 kB 94 | MMUPageSize: 4 kB 95 | Locked: 0 kB 96 | VmFlags: rd ex mr mw me 97 | 7f28ff511000-7f28ff710000 ---p 0000c000 07:01 81120 /lib/libnss_files-2.11.1.so 98 | Size: 2044 kB 99 | Rss: 0 kB 100 | Pss: 0 kB 101 | Shared_Clean: 0 kB 102 | Shared_Dirty: 0 kB 103 | Private_Clean: 0 kB 104 | Private_Dirty: 0 kB 105 | Referenced: 0 kB 106 | Anonymous: 0 kB 107 | AnonHugePages: 0 kB 108 | Swap: 0 kB 109 | KernelPageSize: 4 kB 110 | MMUPageSize: 4 kB 111 | Locked: 0 kB 112 | VmFlags: mr mw me 113 | 7f28ff710000-7f28ff711000 r--p 0000b000 07:01 81120 /lib/libnss_files-2.11.1.so 114 | Size: 4 kB 115 | Rss: 4 kB 116 | Pss: 4 kB 117 | Shared_Clean: 0 kB 118 | Shared_Dirty: 0 kB 119 | Private_Clean: 0 kB 120 | Private_Dirty: 4 kB 121 | Referenced: 4 kB 122 | Anonymous: 4 kB 123 | AnonHugePages: 0 kB 124 | Swap: 0 kB 125 | KernelPageSize: 4 kB 126 | MMUPageSize: 4 kB 127 | Locked: 0 kB 128 | VmFlags: rd mr mw me ac 129 | 7f28ff711000-7f28ff712000 rw-p 0000c000 07:01 81120 /lib/libnss_files-2.11.1.so 130 | Size: 4 kB 131 | Rss: 4 kB 132 | Pss: 4 kB 133 | Shared_Clean: 0 kB 134 | Shared_Dirty: 0 kB 135 | Private_Clean: 0 kB 136 | Private_Dirty: 4 kB 137 | Referenced: 4 kB 138 | Anonymous: 4 kB 139 | AnonHugePages: 0 kB 140 | Swap: 0 kB 141 | KernelPageSize: 4 kB 142 | MMUPageSize: 4 kB 143 | Locked: 0 kB 144 | VmFlags: rd wr mr mw me ac 145 | 7f28ff712000-7f28ff71c000 r-xp 00000000 07:01 81122 /lib/libnss_nis-2.11.1.so 146 | Size: 40 kB 147 | Rss: 20 kB 148 | Pss: 0 kB 149 | Shared_Clean: 20 kB 150 | Shared_Dirty: 0 kB 151 | Private_Clean: 0 kB 152 | Private_Dirty: 0 kB 153 | Referenced: 20 kB 154 | Anonymous: 0 kB 155 | AnonHugePages: 0 kB 156 | Swap: 0 kB 157 | KernelPageSize: 4 kB 158 | MMUPageSize: 4 kB 159 | Locked: 0 kB 160 | VmFlags: rd ex mr mw me 161 | 7f28ff71c000-7f28ff91b000 ---p 0000a000 07:01 81122 /lib/libnss_nis-2.11.1.so 162 | Size: 2044 kB 163 | Rss: 0 kB 164 | Pss: 0 kB 165 | Shared_Clean: 0 kB 166 | Shared_Dirty: 0 kB 167 | Private_Clean: 0 kB 168 | Private_Dirty: 0 kB 169 | Referenced: 0 kB 170 | Anonymous: 0 kB 171 | AnonHugePages: 0 kB 172 | Swap: 0 kB 173 | KernelPageSize: 4 kB 174 | MMUPageSize: 4 kB 175 | Locked: 0 kB 176 | VmFlags: mr mw me 177 | 7f28ff91b000-7f28ff91c000 r--p 00009000 07:01 81122 /lib/libnss_nis-2.11.1.so 178 | Size: 4 kB 179 | Rss: 4 kB 180 | Pss: 4 kB 181 | Shared_Clean: 0 kB 182 | Shared_Dirty: 0 kB 183 | Private_Clean: 0 kB 184 | Private_Dirty: 4 kB 185 | Referenced: 4 kB 186 | Anonymous: 4 kB 187 | AnonHugePages: 0 kB 188 | Swap: 0 kB 189 | KernelPageSize: 4 kB 190 | MMUPageSize: 4 kB 191 | Locked: 0 kB 192 | VmFlags: rd mr mw me ac 193 | 7f28ff91c000-7f28ff91d000 rw-p 0000a000 07:01 81122 /lib/libnss_nis-2.11.1.so 194 | Size: 4 kB 195 | Rss: 4 kB 196 | Pss: 4 kB 197 | Shared_Clean: 0 kB 198 | Shared_Dirty: 0 kB 199 | Private_Clean: 0 kB 200 | Private_Dirty: 4 kB 201 | Referenced: 4 kB 202 | Anonymous: 4 kB 203 | AnonHugePages: 0 kB 204 | Swap: 0 kB 205 | KernelPageSize: 4 kB 206 | MMUPageSize: 4 kB 207 | Locked: 0 kB 208 | VmFlags: rd wr mr mw me ac 209 | 7f28ff91d000-7f28ff934000 r-xp 00000000 07:01 81117 /lib/libnsl-2.11.1.so 210 | Size: 92 kB 211 | Rss: 24 kB 212 | Pss: 0 kB 213 | Shared_Clean: 24 kB 214 | Shared_Dirty: 0 kB 215 | Private_Clean: 0 kB 216 | Private_Dirty: 0 kB 217 | Referenced: 24 kB 218 | Anonymous: 0 kB 219 | AnonHugePages: 0 kB 220 | Swap: 0 kB 221 | KernelPageSize: 4 kB 222 | MMUPageSize: 4 kB 223 | Locked: 0 kB 224 | VmFlags: rd ex mr mw me 225 | 7f28ff934000-7f28ffb33000 ---p 00017000 07:01 81117 /lib/libnsl-2.11.1.so 226 | Size: 2044 kB 227 | Rss: 0 kB 228 | Pss: 0 kB 229 | Shared_Clean: 0 kB 230 | Shared_Dirty: 0 kB 231 | Private_Clean: 0 kB 232 | Private_Dirty: 0 kB 233 | Referenced: 0 kB 234 | Anonymous: 0 kB 235 | AnonHugePages: 0 kB 236 | Swap: 0 kB 237 | KernelPageSize: 4 kB 238 | MMUPageSize: 4 kB 239 | Locked: 0 kB 240 | VmFlags: mr mw me 241 | 7f28ffb33000-7f28ffb34000 r--p 00016000 07:01 81117 /lib/libnsl-2.11.1.so 242 | Size: 4 kB 243 | Rss: 4 kB 244 | Pss: 4 kB 245 | Shared_Clean: 0 kB 246 | Shared_Dirty: 0 kB 247 | Private_Clean: 0 kB 248 | Private_Dirty: 4 kB 249 | Referenced: 4 kB 250 | Anonymous: 4 kB 251 | AnonHugePages: 0 kB 252 | Swap: 0 kB 253 | KernelPageSize: 4 kB 254 | MMUPageSize: 4 kB 255 | Locked: 0 kB 256 | VmFlags: rd mr mw me ac 257 | 7f28ffb34000-7f28ffb35000 rw-p 00017000 07:01 81117 /lib/libnsl-2.11.1.so 258 | Size: 4 kB 259 | Rss: 4 kB 260 | Pss: 4 kB 261 | Shared_Clean: 0 kB 262 | Shared_Dirty: 0 kB 263 | Private_Clean: 0 kB 264 | Private_Dirty: 4 kB 265 | Referenced: 4 kB 266 | Anonymous: 4 kB 267 | AnonHugePages: 0 kB 268 | Swap: 0 kB 269 | KernelPageSize: 4 kB 270 | MMUPageSize: 4 kB 271 | Locked: 0 kB 272 | VmFlags: rd wr mr mw me ac 273 | 7f28ffb35000-7f28ffb37000 rw-p 00000000 00:00 0 274 | Size: 8 kB 275 | Rss: 0 kB 276 | Pss: 0 kB 277 | Shared_Clean: 0 kB 278 | Shared_Dirty: 0 kB 279 | Private_Clean: 0 kB 280 | Private_Dirty: 0 kB 281 | Referenced: 0 kB 282 | Anonymous: 0 kB 283 | AnonHugePages: 0 kB 284 | Swap: 0 kB 285 | KernelPageSize: 4 kB 286 | MMUPageSize: 4 kB 287 | Locked: 0 kB 288 | VmFlags: rd wr mr mw me ac 289 | 7f28ffb37000-7f28ffb3f000 r-xp 00000000 07:01 81118 /lib/libnss_compat-2.11.1.so 290 | Size: 32 kB 291 | Rss: 24 kB 292 | Pss: 0 kB 293 | Shared_Clean: 24 kB 294 | Shared_Dirty: 0 kB 295 | Private_Clean: 0 kB 296 | Private_Dirty: 0 kB 297 | Referenced: 24 kB 298 | Anonymous: 0 kB 299 | AnonHugePages: 0 kB 300 | Swap: 0 kB 301 | KernelPageSize: 4 kB 302 | MMUPageSize: 4 kB 303 | Locked: 0 kB 304 | VmFlags: rd ex mr mw me 305 | 7f28ffb3f000-7f28ffd3e000 ---p 00008000 07:01 81118 /lib/libnss_compat-2.11.1.so 306 | Size: 2044 kB 307 | Rss: 0 kB 308 | Pss: 0 kB 309 | Shared_Clean: 0 kB 310 | Shared_Dirty: 0 kB 311 | Private_Clean: 0 kB 312 | Private_Dirty: 0 kB 313 | Referenced: 0 kB 314 | Anonymous: 0 kB 315 | AnonHugePages: 0 kB 316 | Swap: 0 kB 317 | KernelPageSize: 4 kB 318 | MMUPageSize: 4 kB 319 | Locked: 0 kB 320 | VmFlags: mr mw me 321 | 7f28ffd3e000-7f28ffd3f000 r--p 00007000 07:01 81118 /lib/libnss_compat-2.11.1.so 322 | Size: 4 kB 323 | Rss: 4 kB 324 | Pss: 4 kB 325 | Shared_Clean: 0 kB 326 | Shared_Dirty: 0 kB 327 | Private_Clean: 0 kB 328 | Private_Dirty: 4 kB 329 | Referenced: 4 kB 330 | Anonymous: 4 kB 331 | AnonHugePages: 0 kB 332 | Swap: 0 kB 333 | KernelPageSize: 4 kB 334 | MMUPageSize: 4 kB 335 | Locked: 0 kB 336 | VmFlags: rd mr mw me ac 337 | 7f28ffd3f000-7f28ffd40000 rw-p 00008000 07:01 81118 /lib/libnss_compat-2.11.1.so 338 | Size: 4 kB 339 | Rss: 4 kB 340 | Pss: 4 kB 341 | Shared_Clean: 0 kB 342 | Shared_Dirty: 0 kB 343 | Private_Clean: 0 kB 344 | Private_Dirty: 4 kB 345 | Referenced: 4 kB 346 | Anonymous: 4 kB 347 | AnonHugePages: 0 kB 348 | Swap: 0 kB 349 | KernelPageSize: 4 kB 350 | MMUPageSize: 4 kB 351 | Locked: 0 kB 352 | VmFlags: rd wr mr mw me ac 353 | 7f28ffd40000-7f28ffebd000 r-xp 00000000 07:01 81088 /lib/libc-2.11.1.so 354 | Size: 1524 kB 355 | Rss: 540 kB 356 | Pss: 10 kB 357 | Shared_Clean: 532 kB 358 | Shared_Dirty: 0 kB 359 | Private_Clean: 8 kB 360 | Private_Dirty: 0 kB 361 | Referenced: 540 kB 362 | Anonymous: 0 kB 363 | AnonHugePages: 0 kB 364 | Swap: 0 kB 365 | KernelPageSize: 4 kB 366 | MMUPageSize: 4 kB 367 | Locked: 0 kB 368 | VmFlags: rd ex mr mw me 369 | 7f28ffebd000-7f29000bc000 ---p 0017d000 07:01 81088 /lib/libc-2.11.1.so 370 | Size: 2044 kB 371 | Rss: 0 kB 372 | Pss: 0 kB 373 | Shared_Clean: 0 kB 374 | Shared_Dirty: 0 kB 375 | Private_Clean: 0 kB 376 | Private_Dirty: 0 kB 377 | Referenced: 0 kB 378 | Anonymous: 0 kB 379 | AnonHugePages: 0 kB 380 | Swap: 0 kB 381 | KernelPageSize: 4 kB 382 | MMUPageSize: 4 kB 383 | Locked: 0 kB 384 | VmFlags: mr mw me 385 | 7f29000bc000-7f29000c0000 r--p 0017c000 07:01 81088 /lib/libc-2.11.1.so 386 | Size: 16 kB 387 | Rss: 16 kB 388 | Pss: 16 kB 389 | Shared_Clean: 0 kB 390 | Shared_Dirty: 0 kB 391 | Private_Clean: 0 kB 392 | Private_Dirty: 16 kB 393 | Referenced: 16 kB 394 | Anonymous: 16 kB 395 | AnonHugePages: 0 kB 396 | Swap: 0 kB 397 | KernelPageSize: 4 kB 398 | MMUPageSize: 4 kB 399 | Locked: 0 kB 400 | VmFlags: rd mr mw me ac 401 | 7f29000c0000-7f29000c1000 rw-p 00180000 07:01 81088 /lib/libc-2.11.1.so 402 | Size: 4 kB 403 | Rss: 4 kB 404 | Pss: 4 kB 405 | Shared_Clean: 0 kB 406 | Shared_Dirty: 0 kB 407 | Private_Clean: 0 kB 408 | Private_Dirty: 4 kB 409 | Referenced: 4 kB 410 | Anonymous: 4 kB 411 | AnonHugePages: 0 kB 412 | Swap: 0 kB 413 | KernelPageSize: 4 kB 414 | MMUPageSize: 4 kB 415 | Locked: 0 kB 416 | VmFlags: rd wr mr mw me ac 417 | 7f29000c1000-7f29000c6000 rw-p 00000000 00:00 0 418 | Size: 20 kB 419 | Rss: 16 kB 420 | Pss: 16 kB 421 | Shared_Clean: 0 kB 422 | Shared_Dirty: 0 kB 423 | Private_Clean: 0 kB 424 | Private_Dirty: 16 kB 425 | Referenced: 16 kB 426 | Anonymous: 16 kB 427 | AnonHugePages: 0 kB 428 | Swap: 0 kB 429 | KernelPageSize: 4 kB 430 | MMUPageSize: 4 kB 431 | Locked: 0 kB 432 | VmFlags: rd wr mr mw me ac 433 | 7f29000c6000-7f29000c8000 r-xp 00000000 07:01 81095 /lib/libdl-2.11.1.so 434 | Size: 8 kB 435 | Rss: 8 kB 436 | Pss: 0 kB 437 | Shared_Clean: 8 kB 438 | Shared_Dirty: 0 kB 439 | Private_Clean: 0 kB 440 | Private_Dirty: 0 kB 441 | Referenced: 8 kB 442 | Anonymous: 0 kB 443 | AnonHugePages: 0 kB 444 | Swap: 0 kB 445 | KernelPageSize: 4 kB 446 | MMUPageSize: 4 kB 447 | Locked: 0 kB 448 | VmFlags: rd ex mr mw me 449 | 7f29000c8000-7f29002c8000 ---p 00002000 07:01 81095 /lib/libdl-2.11.1.so 450 | Size: 2048 kB 451 | Rss: 0 kB 452 | Pss: 0 kB 453 | Shared_Clean: 0 kB 454 | Shared_Dirty: 0 kB 455 | Private_Clean: 0 kB 456 | Private_Dirty: 0 kB 457 | Referenced: 0 kB 458 | Anonymous: 0 kB 459 | AnonHugePages: 0 kB 460 | Swap: 0 kB 461 | KernelPageSize: 4 kB 462 | MMUPageSize: 4 kB 463 | Locked: 0 kB 464 | VmFlags: mr mw me 465 | 7f29002c8000-7f29002c9000 r--p 00002000 07:01 81095 /lib/libdl-2.11.1.so 466 | Size: 4 kB 467 | Rss: 4 kB 468 | Pss: 4 kB 469 | Shared_Clean: 0 kB 470 | Shared_Dirty: 0 kB 471 | Private_Clean: 0 kB 472 | Private_Dirty: 4 kB 473 | Referenced: 4 kB 474 | Anonymous: 4 kB 475 | AnonHugePages: 0 kB 476 | Swap: 0 kB 477 | KernelPageSize: 4 kB 478 | MMUPageSize: 4 kB 479 | Locked: 0 kB 480 | VmFlags: rd mr mw me ac 481 | 7f29002c9000-7f29002ca000 rw-p 00003000 07:01 81095 /lib/libdl-2.11.1.so 482 | Size: 4 kB 483 | Rss: 4 kB 484 | Pss: 4 kB 485 | Shared_Clean: 0 kB 486 | Shared_Dirty: 0 kB 487 | Private_Clean: 0 kB 488 | Private_Dirty: 4 kB 489 | Referenced: 4 kB 490 | Anonymous: 4 kB 491 | AnonHugePages: 0 kB 492 | Swap: 0 kB 493 | KernelPageSize: 4 kB 494 | MMUPageSize: 4 kB 495 | Locked: 0 kB 496 | VmFlags: rd wr mr mw me ac 497 | 7f29002ca000-7f2900308000 r-xp 00000000 07:01 81113 /lib/libncurses.so.5.7 498 | Size: 248 kB 499 | Rss: 136 kB 500 | Pss: 77 kB 501 | Shared_Clean: 68 kB 502 | Shared_Dirty: 0 kB 503 | Private_Clean: 68 kB 504 | Private_Dirty: 0 kB 505 | Referenced: 136 kB 506 | Anonymous: 0 kB 507 | AnonHugePages: 0 kB 508 | Swap: 0 kB 509 | KernelPageSize: 4 kB 510 | MMUPageSize: 4 kB 511 | Locked: 0 kB 512 | VmFlags: rd ex mr mw me 513 | 7f2900308000-7f2900508000 ---p 0003e000 07:01 81113 /lib/libncurses.so.5.7 514 | Size: 2048 kB 515 | Rss: 0 kB 516 | Pss: 0 kB 517 | Shared_Clean: 0 kB 518 | Shared_Dirty: 0 kB 519 | Private_Clean: 0 kB 520 | Private_Dirty: 0 kB 521 | Referenced: 0 kB 522 | Anonymous: 0 kB 523 | AnonHugePages: 0 kB 524 | Swap: 0 kB 525 | KernelPageSize: 4 kB 526 | MMUPageSize: 4 kB 527 | Locked: 0 kB 528 | VmFlags: mr mw me 529 | 7f2900508000-7f290050c000 r--p 0003e000 07:01 81113 /lib/libncurses.so.5.7 530 | Size: 16 kB 531 | Rss: 16 kB 532 | Pss: 16 kB 533 | Shared_Clean: 0 kB 534 | Shared_Dirty: 0 kB 535 | Private_Clean: 0 kB 536 | Private_Dirty: 16 kB 537 | Referenced: 16 kB 538 | Anonymous: 16 kB 539 | AnonHugePages: 0 kB 540 | Swap: 0 kB 541 | KernelPageSize: 4 kB 542 | MMUPageSize: 4 kB 543 | Locked: 0 kB 544 | VmFlags: rd mr mw me ac 545 | 7f290050c000-7f290050d000 rw-p 00042000 07:01 81113 /lib/libncurses.so.5.7 546 | Size: 4 kB 547 | Rss: 4 kB 548 | Pss: 4 kB 549 | Shared_Clean: 0 kB 550 | Shared_Dirty: 0 kB 551 | Private_Clean: 0 kB 552 | Private_Dirty: 4 kB 553 | Referenced: 4 kB 554 | Anonymous: 4 kB 555 | AnonHugePages: 0 kB 556 | Swap: 0 kB 557 | KernelPageSize: 4 kB 558 | MMUPageSize: 4 kB 559 | Locked: 0 kB 560 | VmFlags: rd wr mr mw me ac 561 | 7f290050d000-7f290052d000 r-xp 00000000 07:01 81079 /lib/ld-2.11.1.so 562 | Size: 128 kB 563 | Rss: 112 kB 564 | Pss: 0 kB 565 | Shared_Clean: 112 kB 566 | Shared_Dirty: 0 kB 567 | Private_Clean: 0 kB 568 | Private_Dirty: 0 kB 569 | Referenced: 112 kB 570 | Anonymous: 0 kB 571 | AnonHugePages: 0 kB 572 | Swap: 0 kB 573 | KernelPageSize: 4 kB 574 | MMUPageSize: 4 kB 575 | Locked: 0 kB 576 | VmFlags: rd ex mr mw me dw 577 | 7f29005b9000-7f29005f8000 r--p 00000000 07:01 33875 /usr/lib/locale/en_US.utf8/LC_CTYPE 578 | Size: 252 kB 579 | Rss: 24 kB 580 | Pss: 8 kB 581 | Shared_Clean: 16 kB 582 | Shared_Dirty: 0 kB 583 | Private_Clean: 8 kB 584 | Private_Dirty: 0 kB 585 | Referenced: 24 kB 586 | Anonymous: 0 kB 587 | AnonHugePages: 0 kB 588 | Swap: 0 kB 589 | KernelPageSize: 4 kB 590 | MMUPageSize: 4 kB 591 | Locked: 0 kB 592 | VmFlags: rd mr mw me 593 | 7f29005f8000-7f2900716000 r--p 00000000 07:01 33874 /usr/lib/locale/en_US.utf8/LC_COLLATE 594 | Size: 1144 kB 595 | Rss: 12 kB 596 | Pss: 1 kB 597 | Shared_Clean: 12 kB 598 | Shared_Dirty: 0 kB 599 | Private_Clean: 0 kB 600 | Private_Dirty: 0 kB 601 | Referenced: 12 kB 602 | Anonymous: 0 kB 603 | AnonHugePages: 0 kB 604 | Swap: 0 kB 605 | KernelPageSize: 4 kB 606 | MMUPageSize: 4 kB 607 | Locked: 0 kB 608 | VmFlags: rd mr mw me 609 | 7f2900716000-7f2900719000 rw-p 00000000 00:00 0 610 | Size: 12 kB 611 | Rss: 12 kB 612 | Pss: 12 kB 613 | Shared_Clean: 0 kB 614 | Shared_Dirty: 0 kB 615 | Private_Clean: 0 kB 616 | Private_Dirty: 12 kB 617 | Referenced: 12 kB 618 | Anonymous: 12 kB 619 | AnonHugePages: 0 kB 620 | Swap: 0 kB 621 | KernelPageSize: 4 kB 622 | MMUPageSize: 4 kB 623 | Locked: 0 kB 624 | VmFlags: rd wr mr mw me ac 625 | 7f2900719000-7f290071a000 r--p 00000000 07:01 33880 /usr/lib/locale/en_US.utf8/LC_NUMERIC 626 | Size: 4 kB 627 | Rss: 4 kB 628 | Pss: 0 kB 629 | Shared_Clean: 4 kB 630 | Shared_Dirty: 0 kB 631 | Private_Clean: 0 kB 632 | Private_Dirty: 0 kB 633 | Referenced: 4 kB 634 | Anonymous: 0 kB 635 | AnonHugePages: 0 kB 636 | Swap: 0 kB 637 | KernelPageSize: 4 kB 638 | MMUPageSize: 4 kB 639 | Locked: 0 kB 640 | VmFlags: rd mr mw me 641 | 7f290071a000-7f290071b000 r--p 00000000 07:01 33883 /usr/lib/locale/en_US.utf8/LC_TIME 642 | Size: 4 kB 643 | Rss: 4 kB 644 | Pss: 0 kB 645 | Shared_Clean: 4 kB 646 | Shared_Dirty: 0 kB 647 | Private_Clean: 0 kB 648 | Private_Dirty: 0 kB 649 | Referenced: 4 kB 650 | Anonymous: 0 kB 651 | AnonHugePages: 0 kB 652 | Swap: 0 kB 653 | KernelPageSize: 4 kB 654 | MMUPageSize: 4 kB 655 | Locked: 0 kB 656 | VmFlags: rd mr mw me 657 | 7f290071b000-7f290071c000 r--p 00000000 07:01 33878 /usr/lib/locale/en_US.utf8/LC_MONETARY 658 | Size: 4 kB 659 | Rss: 4 kB 660 | Pss: 0 kB 661 | Shared_Clean: 4 kB 662 | Shared_Dirty: 0 kB 663 | Private_Clean: 0 kB 664 | Private_Dirty: 0 kB 665 | Referenced: 4 kB 666 | Anonymous: 0 kB 667 | AnonHugePages: 0 kB 668 | Swap: 0 kB 669 | KernelPageSize: 4 kB 670 | MMUPageSize: 4 kB 671 | Locked: 0 kB 672 | VmFlags: rd mr mw me 673 | 7f290071c000-7f290071d000 r--p 00000000 07:01 48708 /usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES 674 | Size: 4 kB 675 | Rss: 4 kB 676 | Pss: 0 kB 677 | Shared_Clean: 4 kB 678 | Shared_Dirty: 0 kB 679 | Private_Clean: 0 kB 680 | Private_Dirty: 0 kB 681 | Referenced: 4 kB 682 | Anonymous: 0 kB 683 | AnonHugePages: 0 kB 684 | Swap: 0 kB 685 | KernelPageSize: 4 kB 686 | MMUPageSize: 4 kB 687 | Locked: 0 kB 688 | VmFlags: rd mr mw me 689 | 7f290071d000-7f290071e000 r--p 00000000 07:01 33881 /usr/lib/locale/en_US.utf8/LC_PAPER 690 | Size: 4 kB 691 | Rss: 4 kB 692 | Pss: 0 kB 693 | Shared_Clean: 4 kB 694 | Shared_Dirty: 0 kB 695 | Private_Clean: 0 kB 696 | Private_Dirty: 0 kB 697 | Referenced: 4 kB 698 | Anonymous: 0 kB 699 | AnonHugePages: 0 kB 700 | Swap: 0 kB 701 | KernelPageSize: 4 kB 702 | MMUPageSize: 4 kB 703 | Locked: 0 kB 704 | VmFlags: rd mr mw me 705 | 7f290071e000-7f290071f000 r--p 00000000 07:01 33879 /usr/lib/locale/en_US.utf8/LC_NAME 706 | Size: 4 kB 707 | Rss: 4 kB 708 | Pss: 0 kB 709 | Shared_Clean: 4 kB 710 | Shared_Dirty: 0 kB 711 | Private_Clean: 0 kB 712 | Private_Dirty: 0 kB 713 | Referenced: 4 kB 714 | Anonymous: 0 kB 715 | AnonHugePages: 0 kB 716 | Swap: 0 kB 717 | KernelPageSize: 4 kB 718 | MMUPageSize: 4 kB 719 | Locked: 0 kB 720 | VmFlags: rd mr mw me 721 | 7f290071f000-7f2900720000 r--p 00000000 07:01 33873 /usr/lib/locale/en_US.utf8/LC_ADDRESS 722 | Size: 4 kB 723 | Rss: 4 kB 724 | Pss: 0 kB 725 | Shared_Clean: 4 kB 726 | Shared_Dirty: 0 kB 727 | Private_Clean: 0 kB 728 | Private_Dirty: 0 kB 729 | Referenced: 4 kB 730 | Anonymous: 0 kB 731 | AnonHugePages: 0 kB 732 | Swap: 0 kB 733 | KernelPageSize: 4 kB 734 | MMUPageSize: 4 kB 735 | Locked: 0 kB 736 | VmFlags: rd mr mw me 737 | 7f2900720000-7f2900721000 r--p 00000000 07:01 33882 /usr/lib/locale/en_US.utf8/LC_TELEPHONE 738 | Size: 4 kB 739 | Rss: 4 kB 740 | Pss: 0 kB 741 | Shared_Clean: 4 kB 742 | Shared_Dirty: 0 kB 743 | Private_Clean: 0 kB 744 | Private_Dirty: 0 kB 745 | Referenced: 4 kB 746 | Anonymous: 0 kB 747 | AnonHugePages: 0 kB 748 | Swap: 0 kB 749 | KernelPageSize: 4 kB 750 | MMUPageSize: 4 kB 751 | Locked: 0 kB 752 | VmFlags: rd mr mw me 753 | 7f2900721000-7f2900722000 r--p 00000000 07:01 33877 /usr/lib/locale/en_US.utf8/LC_MEASUREMENT 754 | Size: 4 kB 755 | Rss: 4 kB 756 | Pss: 0 kB 757 | Shared_Clean: 4 kB 758 | Shared_Dirty: 0 kB 759 | Private_Clean: 0 kB 760 | Private_Dirty: 0 kB 761 | Referenced: 4 kB 762 | Anonymous: 0 kB 763 | AnonHugePages: 0 kB 764 | Swap: 0 kB 765 | KernelPageSize: 4 kB 766 | MMUPageSize: 4 kB 767 | Locked: 0 kB 768 | VmFlags: rd mr mw me 769 | 7f2900722000-7f2900729000 r--s 00000000 07:01 97395 /usr/lib/gconv/gconv-modules.cache 770 | Size: 28 kB 771 | Rss: 20 kB 772 | Pss: 0 kB 773 | Shared_Clean: 20 kB 774 | Shared_Dirty: 0 kB 775 | Private_Clean: 0 kB 776 | Private_Dirty: 0 kB 777 | Referenced: 20 kB 778 | Anonymous: 0 kB 779 | AnonHugePages: 0 kB 780 | Swap: 0 kB 781 | KernelPageSize: 4 kB 782 | MMUPageSize: 4 kB 783 | Locked: 0 kB 784 | VmFlags: rd mr me ms 785 | 7f2900729000-7f290072a000 r--p 00000000 07:01 33876 /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION 786 | Size: 4 kB 787 | Rss: 4 kB 788 | Pss: 0 kB 789 | Shared_Clean: 4 kB 790 | Shared_Dirty: 0 kB 791 | Private_Clean: 0 kB 792 | Private_Dirty: 0 kB 793 | Referenced: 4 kB 794 | Anonymous: 0 kB 795 | AnonHugePages: 0 kB 796 | Swap: 0 kB 797 | KernelPageSize: 4 kB 798 | MMUPageSize: 4 kB 799 | Locked: 0 kB 800 | VmFlags: rd mr mw me 801 | 7f290072a000-7f290072c000 rw-p 00000000 00:00 0 802 | Size: 8 kB 803 | Rss: 8 kB 804 | Pss: 8 kB 805 | Shared_Clean: 0 kB 806 | Shared_Dirty: 0 kB 807 | Private_Clean: 0 kB 808 | Private_Dirty: 8 kB 809 | Referenced: 8 kB 810 | Anonymous: 8 kB 811 | AnonHugePages: 0 kB 812 | Swap: 0 kB 813 | KernelPageSize: 4 kB 814 | MMUPageSize: 4 kB 815 | Locked: 0 kB 816 | VmFlags: rd wr mr mw me ac 817 | 7f290072c000-7f290072d000 r--p 0001f000 07:01 81079 /lib/ld-2.11.1.so 818 | Size: 4 kB 819 | Rss: 4 kB 820 | Pss: 4 kB 821 | Shared_Clean: 0 kB 822 | Shared_Dirty: 0 kB 823 | Private_Clean: 0 kB 824 | Private_Dirty: 4 kB 825 | Referenced: 4 kB 826 | Anonymous: 4 kB 827 | AnonHugePages: 0 kB 828 | Swap: 0 kB 829 | KernelPageSize: 4 kB 830 | MMUPageSize: 4 kB 831 | Locked: 0 kB 832 | VmFlags: rd mr mw me dw ac 833 | 7f290072d000-7f290072e000 rw-p 00020000 07:01 81079 /lib/ld-2.11.1.so 834 | Size: 4 kB 835 | Rss: 4 kB 836 | Pss: 4 kB 837 | Shared_Clean: 0 kB 838 | Shared_Dirty: 0 kB 839 | Private_Clean: 0 kB 840 | Private_Dirty: 4 kB 841 | Referenced: 4 kB 842 | Anonymous: 4 kB 843 | AnonHugePages: 0 kB 844 | Swap: 0 kB 845 | KernelPageSize: 4 kB 846 | MMUPageSize: 4 kB 847 | Locked: 0 kB 848 | VmFlags: rd wr mr mw me dw ac 849 | 7f290072e000-7f290072f000 rw-p 00000000 00:00 0 850 | Size: 4 kB 851 | Rss: 4 kB 852 | Pss: 4 kB 853 | Shared_Clean: 0 kB 854 | Shared_Dirty: 0 kB 855 | Private_Clean: 0 kB 856 | Private_Dirty: 4 kB 857 | Referenced: 4 kB 858 | Anonymous: 4 kB 859 | AnonHugePages: 0 kB 860 | Swap: 0 kB 861 | KernelPageSize: 4 kB 862 | MMUPageSize: 4 kB 863 | Locked: 0 kB 864 | VmFlags: rd wr mr mw me ac 865 | 7ffff83a4000-7ffff83c5000 rw-p 00000000 00:00 0 [stack] 866 | Size: 136 kB 867 | Rss: 28 kB 868 | Pss: 28 kB 869 | Shared_Clean: 0 kB 870 | Shared_Dirty: 0 kB 871 | Private_Clean: 0 kB 872 | Private_Dirty: 28 kB 873 | Referenced: 28 kB 874 | Anonymous: 28 kB 875 | AnonHugePages: 0 kB 876 | Swap: 0 kB 877 | KernelPageSize: 4 kB 878 | MMUPageSize: 4 kB 879 | Locked: 0 kB 880 | VmFlags: rd wr mr mw me gd ac 881 | 7ffff83fe000-7ffff8400000 r-xp 00000000 00:00 0 [vdso] 882 | Size: 8 kB 883 | Rss: 4 kB 884 | Pss: 0 kB 885 | Shared_Clean: 4 kB 886 | Shared_Dirty: 0 kB 887 | Private_Clean: 0 kB 888 | Private_Dirty: 0 kB 889 | Referenced: 4 kB 890 | Anonymous: 0 kB 891 | AnonHugePages: 0 kB 892 | Swap: 0 kB 893 | KernelPageSize: 4 kB 894 | MMUPageSize: 4 kB 895 | Locked: 0 kB 896 | VmFlags: rd ex mr mw me de 897 | ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] 898 | Size: 4 kB 899 | Rss: 0 kB 900 | Pss: 0 kB 901 | Shared_Clean: 0 kB 902 | Shared_Dirty: 0 kB 903 | Private_Clean: 0 kB 904 | Private_Dirty: 0 kB 905 | Referenced: 0 kB 906 | Anonymous: 0 kB 907 | AnonHugePages: 0 kB 908 | Swap: 0 kB 909 | KernelPageSize: 4 kB 910 | MMUPageSize: 4 kB 911 | Locked: 0 kB 912 | VmFlags: rd ex -------------------------------------------------------------------------------- /test/fixtures/heroku-bash-status: -------------------------------------------------------------------------------- 1 | Name: bash 2 | State: S (sleeping) 3 | Tgid: 3 4 | Ngid: 0 5 | Pid: 3 6 | PPid: 1 7 | TracerPid: 0 8 | Uid: 58790 58790 58790 58790 9 | Gid: 58790 58790 58790 58790 10 | FDSize: 256 11 | Groups: 12 | VmPeak: 109120 kB 13 | VmSize: 109120 kB 14 | VmLck: 0 kB 15 | VmPin: 0 kB 16 | VmHWM: 2032 kB 17 | VmRSS: 2032 kB 18 | VmData: 356 kB 19 | VmStk: 136 kB 20 | VmExe: 956 kB 21 | VmLib: 2288 kB 22 | VmPTE: 64 kB 23 | VmSwap: 0 kB 24 | Threads: 1 25 | SigQ: 0/274188 26 | SigPnd: 0000000000000000 27 | ShdPnd: 0000000000000000 28 | SigBlk: 0000000000010000 29 | SigIgn: 0000000000380004 30 | SigCgt: 000000004b817efb 31 | CapInh: 0000000000000000 32 | CapPrm: 0000000000000000 33 | CapEff: 0000000000000000 34 | CapBnd: 0000001ff598cffe 35 | Seccomp: 2 36 | Cpus_allowed: f 37 | Cpus_allowed_list: 0-3 38 | Mems_allowed: 00000000,00000001 39 | Mems_allowed_list: 0 40 | voluntary_ctxt_switches: 34 41 | nonvoluntary_ctxt_switches: 35 42 | -------------------------------------------------------------------------------- /test/get_process_mem_test.rb: -------------------------------------------------------------------------------- 1 | require "test_helper" 2 | 3 | class GetProcessMemTest < Test::Unit::TestCase 4 | def setup 5 | @mem = GetProcessMem.new 6 | end 7 | 8 | def test_different_pid_returns_different_memory 9 | pid = Process.spawn("tail -f Gemfile") 10 | 11 | other_mem = GetProcessMem.new(pid) 12 | assert @mem.kb > other_mem.kb 13 | ensure 14 | Process.kill("TERM", pid) if pid 15 | Process.wait(pid) if pid 16 | end 17 | 18 | def test_invalid_pid 19 | raised_exception = false 20 | GetProcessMem.new("ls") 21 | rescue ArgumentError 22 | raised_exception = true 23 | ensure 24 | assert raised_exception 25 | end 26 | 27 | def test_seems_to_work 28 | assert @mem.kb > 0 29 | assert @mem.mb > 0 30 | assert @mem.gb > 0 31 | assert @mem.bytes > 0 32 | end 33 | 34 | def test_linux_smap 35 | delta = 1 36 | bytes = @mem.linux_memory(fixture_path("heroku-bash-smap")) 37 | assert_in_delta BigDecimal("2122240.0"), bytes, delta 38 | end 39 | 40 | def test_linux_status 41 | bytes = @mem.linux_status_memory(fixture_path("heroku-bash-status")) 42 | assert_equal bytes, 2080768 43 | end 44 | 45 | def test_conversions 46 | bytes = 0 47 | delta = BigDecimal("0.0000001") 48 | assert_in_delta 0.0, @mem.kb(bytes), delta 49 | assert_in_delta 0.0, @mem.mb(bytes), delta 50 | assert_in_delta 0.0, @mem.gb(bytes), delta 51 | 52 | # kb 53 | bytes = 1024 54 | assert_in_delta 1.0, @mem.kb(bytes), delta 55 | assert_in_delta 0.0009765625, @mem.mb(bytes), delta 56 | assert_in_delta 9.5367431640625e-07, @mem.gb(bytes), delta 57 | 58 | # mb 59 | bytes = 1_048_576 60 | assert_in_delta 1024.0, @mem.kb(bytes), delta 61 | assert_in_delta 1.0, @mem.mb(bytes), delta 62 | assert_in_delta 0.0009765625, @mem.gb(bytes), delta 63 | 64 | # gb 65 | bytes = 1_073_741_824 66 | assert_in_delta 1048576.0, @mem.kb(bytes), delta 67 | assert_in_delta 1024.0, @mem.mb(bytes), delta 68 | assert_in_delta 1.0, @mem.gb(bytes), delta 69 | end 70 | end 71 | -------------------------------------------------------------------------------- /test/test_helper.rb: -------------------------------------------------------------------------------- 1 | Bundler.require 2 | 3 | require "get_process_mem" 4 | require "test/unit" 5 | 6 | def fixture_path(name = nil) 7 | path = Pathname.new(File.expand_path("../fixtures", __FILE__)) 8 | return path.join(name) if name 9 | path 10 | end 11 | --------------------------------------------------------------------------------