Class: PhusionPassenger::AdminTools::MemoryStats
- Defined in:
- lib/phusion_passenger/admin_tools/memory_stats.rb
Defined Under Namespace
Classes: Process
Instance Method Summary collapse
-
#apache_processes ⇒ Object
Returns a list of Apache processes, which may be the empty list if Apache is not running.
-
#nginx_processes ⇒ Object
Returns a list of Nginx processes, which may be the empty list if Nginx is not running.
-
#passenger_processes ⇒ Object
Returns a list of Phusion Passenger processes, which may be the empty list if Phusion Passenger is not running.
- #platform_provides_private_dirty_rss_information? ⇒ Boolean
-
#root_privileges_required_for_private_dirty_rss? ⇒ Boolean
Returns whether root privileges are required in order to measure private dirty RSS.
- #should_show_private_dirty_rss? ⇒ Boolean
-
#sum_memory_usage(processes) ⇒ Object
Returns the sum of the memory usages of all given processes.
-
#system_ram_usage ⇒ Object
Determine the system’s RAM usage, not including swap.
Instance Method Details
#apache_processes ⇒ Object
Returns a list of Apache processes, which may be the empty list if Apache is not running. If the Apache executable name is unknown then nil will be returned.
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/phusion_passenger/admin_tools/memory_stats.rb', line 64 def apache_processes @apache_processes ||= begin if PlatformInfo.httpd processes = list_processes(:exe => PlatformInfo.httpd) if processes.empty? # On some Linux distros, the Apache worker processes # are called "httpd.worker" processes = list_processes(:exe => "#{PlatformInfo.httpd}.worker") end processes else nil end end end |
#nginx_processes ⇒ Object
Returns a list of Nginx processes, which may be the empty list if Nginx is not running.
82 83 84 |
# File 'lib/phusion_passenger/admin_tools/memory_stats.rb', line 82 def nginx_processes @nginx_processes ||= list_processes(:exe => "nginx") end |
#passenger_processes ⇒ Object
Returns a list of Phusion Passenger processes, which may be the empty list if Phusion Passenger is not running.
88 89 90 91 |
# File 'lib/phusion_passenger/admin_tools/memory_stats.rb', line 88 def passenger_processes @passenger_processes ||= list_processes(:match => /((^| )Passenger |(^| )Rails:|(^| )Rack:|PassengerHelperAgent|PassengerWatchdog|PassengerLoggingAgent)/) end |
#platform_provides_private_dirty_rss_information? ⇒ Boolean
117 118 119 |
# File 'lib/phusion_passenger/admin_tools/memory_stats.rb', line 117 def platform_provides_private_dirty_rss_information? return ruby_platform =~ /linux/ end |
#root_privileges_required_for_private_dirty_rss? ⇒ Boolean
Returns whether root privileges are required in order to measure private dirty RSS. Only meaningful if #platform_provides_private_dirty_rss_information? returns true.
123 124 125 126 |
# File 'lib/phusion_passenger/admin_tools/memory_stats.rb', line 123 def root_privileges_required_for_private_dirty_rss? all_processes = (apache_processes || []) + nginx_processes + passenger_processes return all_processes.any?{ |p| p.private_dirty_rss.nil? } end |
#should_show_private_dirty_rss? ⇒ Boolean
128 129 130 131 |
# File 'lib/phusion_passenger/admin_tools/memory_stats.rb', line 128 def should_show_private_dirty_rss? return platform_provides_private_dirty_rss_information? && (::Process.euid == 0 || root_privileges_required_for_private_dirty_rss?) end |
#sum_memory_usage(processes) ⇒ Object
Returns the sum of the memory usages of all given processes. Returns a pair [usage, accurate]. usage
is the summed memory usage in KB, and accurate
indicates whether this sum is accurate. This may be false if some process’s memory usage cannot be determined.
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/phusion_passenger/admin_tools/memory_stats.rb', line 97 def sum_memory_usage(processes) total = 0 if should_show_private_dirty_rss? accurate = true processes.each do |p| if p.private_dirty_rss.is_a?(Numeric) total += p.private_dirty_rss else accurate = true end end return [total, accurate] else processes.each do |p| total += p.rss end return [total, true] end end |
#system_ram_usage ⇒ Object
Determine the system’s RAM usage, not including swap. Returns a tuple [total, used] where both numbers are in KB, or nil if the system’s RAM usage cannot be determined.
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/phusion_passenger/admin_tools/memory_stats.rb', line 136 def system_ram_usage @total_system_ram ||= begin case ruby_platform when /linux/ free_text = `free -k` free_text =~ %r{Mem:(.+)$} line = $1.strip total = line.split(/ +/).first.to_i free_text =~ %r{buffers/cache:(.+)$} line = $1.strip used = line.split(/ +/).first.to_i [total, used] when /darwin/ vm_stat = `vm_stat` vm_stat =~ /page size of (\d+) bytes/ page_size = $1 vm_stat =~ /Pages free: +(\d+)/ free = $1 vm_stat =~ /Pages active: +(\d+)/ active = $1 vm_stat =~ /Pages inactive: +(\d+)/ inactive = $1 vm_stat =~ /Pages wired down: +(\d+)/ wired = $1 if page_size && free && active && inactive && wired page_size = page_size.to_i free = free.to_i * page_size / 1024 active = active.to_i * page_size / 1024 inactive = inactive.to_i * page_size / 1024 wired = wired.to_i * page_size / 1024 used = active + wired [free + inactive + used, used] else nil end else `top` =~ /(\d+)(K|M) Active, (\d+)(K|M) Inact, (\d+)(K|M) Wired,.*?(\d+)(K|M) Free/ if $1 && $2 && $3 && $4 && $5 && $6 && $7 && $8 to_kb = lambda do |number, unit| if unit == 'K' number.to_i else number.to_i * 1024 end end active = to_kb.call($1, $2) inactive = to_kb.call($3, $4) wired = to_kb.call($5, $6) free = to_kb.call($7, $8) used = active + wired [free + inactive + used, used] else nil end end end end |