We got nominated! Help us out and vote for GitHub as Best Bootstrapped Startup of 2008. (You can vote once a day.) [ hide ]

public
Description: Phusion Passenger (mod_rails)
Homepage: http://www.modrails.com/
Clone URL: git://github.com/FooBarWidget/passenger.git
Click here to lend your support to: passenger and make a donation at www.pledgie.com !
Don't show PPID for Passenger processes. Improve data rendering.
Hongli Lai (Phusion) (author)
Sat Apr 19 12:22:02 -0700 2008
commit  5e583222bf29d11f29d0d1968b25ff370f1bfbd5
tree    debeadb0ed55e9af7bd2c7f5f815deda69772514
parent  56598a64084c5eaacd33030af4cc5776baf4ce57
...
2
3
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
6
7
...
23
24
25
26
27
28
 
 
29
30
31
32
33
34
 
35
36
37
38
 
39
40
41
...
101
102
103
104
105
106
107
108
109
 
 
 
 
 
 
 
 
110
111
112
113
114
115
116
117
118
119
120
121
122
123
...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
...
80
81
82
 
 
 
83
84
85
86
87
88
89
 
90
91
92
93
 
94
95
96
97
...
157
158
159
 
 
 
 
 
 
160
161
162
163
164
165
166
167
168
169
 
 
170
171
172
173
174
175
 
176
177
178
0
@@ -2,6 +2,63 @@
0
 $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../lib")
0
 require 'passenger/platform_info'
0
 
0
+# Container for tabular data.
0
+class Table
0
+ def initialize(column_names)
0
+ @column_names = column_names
0
+ @rows = []
0
+ end
0
+
0
+ def add_row(values)
0
+ @rows << values.to_a
0
+ end
0
+
0
+ def add_rows(list_of_rows)
0
+ list_of_rows.each do |row|
0
+ add_row(row)
0
+ end
0
+ end
0
+
0
+ def remove_column(name)
0
+ i = @column_names.index(name)
0
+ @column_names.delete_at(i)
0
+ @rows.each do |row|
0
+ row.delete_at(i)
0
+ end
0
+ end
0
+
0
+ def to_s(title = nil)
0
+ max_column_widths = [1] * @column_names.size
0
+ (@rows + [@column_names]).each do |row|
0
+ row.each_with_index do |value, i|
0
+ max_column_widths[i] = [value.to_s.size, max_column_widths[i]].max
0
+ end
0
+ end
0
+
0
+ format_string = max_column_widths.map{ |i| "%-#{i}s" }.join(" ") << "\n"
0
+ header = sprintf(format_string, *@column_names)
0
+ if title
0
+ free_space = header.size - title.size - 2
0
+ if free_space <= 0
0
+ left_bar_size = 3
0
+ right_bar_size = 3
0
+ else
0
+ left_bar_size = free_space / 2
0
+ right_bar_size = free_space - left_bar_size
0
+ end
0
+ result = "#{"-" * left_bar_size} #{title} #{"-" * right_bar_size}\n"
0
+ result << header
0
+ else
0
+ result = header.dup
0
+ end
0
+ result << ("-" * header.size) << "\n"
0
+ @rows.each do |row|
0
+ result << sprintf(format_string, *row)
0
+ end
0
+ result
0
+ end
0
+end
0
+
0
 class MemoryStats
0
   class Process
0
     attr_accessor :pid
0
@@ -23,19 +80,18 @@ class MemoryStats
0
       end
0
     end
0
     
0
- def print
0
- printf "%-6d %-6d %-6d %-9s %-9s %s\n", pid, ppid, threads,
0
- vm_size_in_mb, private_dirty_rss_in_mb, name
0
+ def to_a
0
+ return [pid, ppid, threads, vm_size_in_mb, private_dirty_rss_in_mb, name]
0
     end
0
   end
0
   
0
   def start
0
     apache_processes = list_processes(:exe => PlatformInfo::HTTPD)
0
- print_process_list_stats(apache_processes)
0
+ print_process_list("Apache processes", apache_processes)
0
     
0
     puts
0
     passenger_processes = list_processes(:match => /(^Passenger |^Rails:|ApplicationPoolServerExecutable)/)
0
- print_process_list_stats(passenger_processes)
0
+ print_process_list("Passenger processes", passenger_processes, :show_ppid => false)
0
     
0
     if ::Process.uid != 0 && (apache_processes + passenger_processes).any?{ |p| p.private_dirty_rss.nil? }
0
       puts
0
@@ -101,23 +157,22 @@ private
0
     return nil
0
   end
0
   
0
- def print_header
0
- puts "PID PPID Thrds VM Size Private Name"
0
- puts "-" * 79
0
- end
0
-
0
- def print_process_list_stats(processes)
0
+ def print_process_list(title, processes, options = {})
0
+ table = Table.new(%w{PID PPID Threads VMSize Private Name})
0
+ table.add_rows(processes)
0
+ if options.has_key?(:show_ppid) && !options[:show_ppid]
0
+ table.remove_column('PPID')
0
+ end
0
+ puts table.to_s(title)
0
+
0
     total_private_dirty_rss = 0
0
     some_private_dirty_rss_cannot_be_determined = false
0
-
0
- print_header
0
     processes.each do |p|
0
       if p.private_dirty_rss.is_a?(Numeric)
0
         total_private_dirty_rss += p.private_dirty_rss
0
       else
0
         some_private_dirty_rss_cannot_be_determined = true
0
       end
0
- p.print
0
     end
0
     puts "### Processes: #{processes.size}"
0
     printf "### Total private dirty RSS: %.2f MB", total_private_dirty_rss / 1024.0

Comments

    No one has commented yet.