server_metrics 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +19 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +34 -0
- data/Rakefile +10 -0
- data/example_processes.rb +20 -0
- data/example_usage.rb +43 -0
- data/lib/server_metrics/collector.rb +147 -0
- data/lib/server_metrics/collectors/cpu.rb +137 -0
- data/lib/server_metrics/collectors/disk.rb +106 -0
- data/lib/server_metrics/collectors/memory.rb +156 -0
- data/lib/server_metrics/collectors/network.rb +26 -0
- data/lib/server_metrics/collectors/processes.rb +110 -0
- data/lib/server_metrics/multi_collector.rb +91 -0
- data/lib/server_metrics/system_info.rb +47 -0
- data/lib/server_metrics/version.rb +3 -0
- data/lib/server_metrics.rb +8 -0
- data/server_metrics.gemspec +29 -0
- data/test/fixtures/cpu.txt +54 -0
- data/test/fixtures/disk.txt +79 -0
- data/test/fixtures/memory.txt +43 -0
- data/test/fixtures/network.txt +13 -0
- data/test/test.rb +14 -0
- data/test/test_basics.rb +153 -0
- data/test/test_helper.rb +49 -0
- data/test/test_with_fixtures.rb +105 -0
- metadata +193 -0
@@ -0,0 +1,156 @@
|
|
1
|
+
class ServerMetrics::Memory < ServerMetrics::Collector
|
2
|
+
# reports darwin units as MB
|
3
|
+
DARWIN_UNITS = { "b" => 1/(1024*1024),
|
4
|
+
"k" => 1/1024,
|
5
|
+
"m" => 1,
|
6
|
+
"g" => 1024 }
|
7
|
+
|
8
|
+
def build_report
|
9
|
+
if solaris?
|
10
|
+
solaris_memory
|
11
|
+
elsif darwin?
|
12
|
+
darwin_memory
|
13
|
+
else
|
14
|
+
linux_memory
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def linux_memory
|
19
|
+
mem_info = {}
|
20
|
+
`cat /proc/meminfo`.each_line do |line|
|
21
|
+
_, key, value = *line.match(/^(\w+):\s+(\d+)\s/)
|
22
|
+
mem_info[key] = value.to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
# memory info is empty - operating system may not support it (why doesn't an exception get raised earlier on mac osx?)
|
26
|
+
if mem_info.empty?
|
27
|
+
raise "No such file or directory"
|
28
|
+
end
|
29
|
+
|
30
|
+
mem_info['MemTotal'] ||= 0
|
31
|
+
mem_info['MemFree'] ||= 0
|
32
|
+
mem_info['Buffers'] ||= 0
|
33
|
+
mem_info['Cached'] ||= 0
|
34
|
+
mem_info['SwapTotal'] ||= 0
|
35
|
+
mem_info['SwapFree'] ||= 0
|
36
|
+
|
37
|
+
mem_total = mem_info['MemTotal'] / 1024
|
38
|
+
mem_free = (mem_info['MemFree'] + mem_info['Buffers'] + mem_info['Cached']) / 1024
|
39
|
+
mem_used = mem_total - mem_free
|
40
|
+
mem_percent_used = (mem_used / mem_total.to_f * 100).to_i
|
41
|
+
|
42
|
+
swap_total = mem_info['SwapTotal'] / 1024
|
43
|
+
swap_free = mem_info['SwapFree'] / 1024
|
44
|
+
swap_used = swap_total - swap_free
|
45
|
+
unless swap_total == 0
|
46
|
+
swap_percent_used = (swap_used / swap_total.to_f * 100).to_i
|
47
|
+
end
|
48
|
+
|
49
|
+
# will be passed at the end to report to Scout
|
50
|
+
report_data = Hash.new
|
51
|
+
|
52
|
+
report_data['Memory total'] = mem_total
|
53
|
+
report_data['Memory used'] = mem_used
|
54
|
+
report_data['Memory available'] = mem_total - mem_used
|
55
|
+
report_data['% Memory used'] = mem_percent_used
|
56
|
+
|
57
|
+
report_data['Swap total'] = swap_total
|
58
|
+
report_data['Swap used'] = swap_used
|
59
|
+
unless swap_total == 0
|
60
|
+
report_data['% Swap used'] = swap_percent_used
|
61
|
+
end
|
62
|
+
@data = report_data
|
63
|
+
|
64
|
+
rescue Exception => e
|
65
|
+
if e.message =~ /No such file or directory/
|
66
|
+
error('Unable to find /proc/meminfo',%Q(Unable to find /proc/meminfo. Please ensure your operationg system supports procfs:
|
67
|
+
http://en.wikipedia.org/wiki/Procfs)
|
68
|
+
)
|
69
|
+
else
|
70
|
+
raise
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Parses top output. Does not report swap usage.
|
75
|
+
def darwin_memory
|
76
|
+
report_data = Hash.new
|
77
|
+
top_output = `top -l1 -n0 -u`
|
78
|
+
mem = top_output[/^(?:Phys)?Mem:.+/i]
|
79
|
+
|
80
|
+
mem.scan(/(\d+|\d+\.\d+)([bkmg])\s+(\w+)/i) do |amount, unit, label|
|
81
|
+
case label
|
82
|
+
when 'used'
|
83
|
+
report_data["Memory used"] =
|
84
|
+
(amount.to_f * DARWIN_UNITS[unit.downcase]).round
|
85
|
+
when 'free'
|
86
|
+
report_data["Memory available"] =
|
87
|
+
(amount.to_f * DARWIN_UNITS[unit.downcase]).round
|
88
|
+
end
|
89
|
+
end
|
90
|
+
report_data["Memory total"] = report_data["Memory used"]+report_data["Memory available"]
|
91
|
+
report_data['% Memory used'] = ((report_data["Memory used"].to_f/report_data["Memory total"])*100).to_i
|
92
|
+
@data = report_data
|
93
|
+
end
|
94
|
+
|
95
|
+
# Memory Used and Swap Used come from the prstat command.
|
96
|
+
# Memory Total comes from prtconf
|
97
|
+
# Swap Total comes from swap -s
|
98
|
+
def solaris_memory
|
99
|
+
report_data = Hash.new
|
100
|
+
|
101
|
+
prstat = `prstat -c -Z 1 1`
|
102
|
+
prstat =~ /(ZONEID[^\n]*)\n(.*)/
|
103
|
+
values = $2.split(' ')
|
104
|
+
|
105
|
+
report_data['Memory used'] = convert_to_mb(values[3])
|
106
|
+
report_data['Swap used'] = convert_to_mb(values[2])
|
107
|
+
|
108
|
+
prtconf = `/usr/sbin/prtconf | grep Memory`
|
109
|
+
|
110
|
+
prtconf =~ /\d+/
|
111
|
+
report_data['Memory total'] = $&.to_i
|
112
|
+
report_data['% Memory used'] = (report_data['Memory used'] / report_data['Memory total'].to_f * 100).to_i
|
113
|
+
|
114
|
+
swap = `swap -s`
|
115
|
+
swap =~ /\d+[a-zA-Z]\sused/
|
116
|
+
swap_used = convert_to_mb($&)
|
117
|
+
swap =~ /\d+[a-zA-Z]\savailable/
|
118
|
+
swap_available = convert_to_mb($&)
|
119
|
+
report_data['Swap total'] = swap_used+swap_available
|
120
|
+
unless report_data['Swap total'] == 0
|
121
|
+
report_data['% Swap used'] = (report_data['Swap used'] / report_data['Swap total'].to_f * 100).to_i
|
122
|
+
end
|
123
|
+
|
124
|
+
@data = report_data
|
125
|
+
end
|
126
|
+
|
127
|
+
# True if on solaris. Only checked on the first run (assumes OS does not change).
|
128
|
+
def solaris?
|
129
|
+
solaris = if @memory.has_key?(:solaris)
|
130
|
+
memory(:solaris) || false
|
131
|
+
else
|
132
|
+
solaris = false
|
133
|
+
begin
|
134
|
+
solaris = true if `uname` =~ /sunos/i
|
135
|
+
rescue
|
136
|
+
end
|
137
|
+
end
|
138
|
+
remember(:solaris => solaris)
|
139
|
+
return solaris
|
140
|
+
end
|
141
|
+
|
142
|
+
# True if on darwin. Only checked on the first run (assumes OS does not change).
|
143
|
+
def darwin?
|
144
|
+
darwin = if @memory.has_key?(:darwin)
|
145
|
+
memory(:darwin) || false
|
146
|
+
else
|
147
|
+
darwin = false
|
148
|
+
begin
|
149
|
+
darwin = true if `uname` =~ /darwin/i
|
150
|
+
rescue
|
151
|
+
end
|
152
|
+
end
|
153
|
+
remember(:darwin => darwin)
|
154
|
+
return darwin
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "server_metrics/system_info"
|
2
|
+
|
3
|
+
class ServerMetrics::Network < ServerMetrics::MultiCollector
|
4
|
+
|
5
|
+
def build_report
|
6
|
+
|
7
|
+
if linux?
|
8
|
+
lines = %x(cat /proc/net/dev).split("\n")[2..-1]
|
9
|
+
interfaces = []
|
10
|
+
lines.each do |line|
|
11
|
+
iface, rest = line.split(':', 2).collect { |e| e.strip }
|
12
|
+
interfaces << iface
|
13
|
+
next unless iface =~ /venet|eth/
|
14
|
+
found = true
|
15
|
+
cols = rest.split(/\s+/)
|
16
|
+
|
17
|
+
bytes_in, packets_in, bytes_out, packets_out = cols.values_at(0, 1, 8, 9).collect { |i| i.to_i }
|
18
|
+
|
19
|
+
counter(iface, "Bytes in", bytes_in.to_f / 1024.0, :per => :second, :round => 2)
|
20
|
+
counter(iface, "Packets in", packets_in.to_f, :per => :second, :round => 2)
|
21
|
+
counter(iface, "Bytes out", bytes_out.to_f / 1024.0, :per => :second, :round => 2)
|
22
|
+
counter(iface, "Packets out", packets_out.to_f, :per => :second, :round => 2)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'sys/proctable'
|
2
|
+
|
3
|
+
# Collects information on processes. Groups processes running under the same command, and sums up their CPU & memory usage.
|
4
|
+
# CPU is calculated **since the last run**
|
5
|
+
#
|
6
|
+
|
7
|
+
class ServerMetrics::Processes
|
8
|
+
|
9
|
+
def initialize(options={})
|
10
|
+
@last_run
|
11
|
+
@last_process_list
|
12
|
+
end
|
13
|
+
|
14
|
+
# This is the main method to call. It returns a hash of two arrays.
|
15
|
+
# The arrays have the top 10 memory using processes, and the top 10 CPU using processes, respectively.
|
16
|
+
# The array elements are hashes that look like this:
|
17
|
+
#
|
18
|
+
# {:top_memory=>
|
19
|
+
# [
|
20
|
+
# {
|
21
|
+
# :cmd => "mysqld", # the command (without the path of arguments being run)
|
22
|
+
# :count => 1, # the number of these processes (grouped by the above command)
|
23
|
+
# :cpu => 34, # the total CPU usag of the processes
|
24
|
+
# :memory => 2 # the total memory usage of the processes
|
25
|
+
# }, ...
|
26
|
+
# ],
|
27
|
+
# :top_cpu=>
|
28
|
+
# [
|
29
|
+
# {
|
30
|
+
# :cmd => "mysqld",
|
31
|
+
# :count => 1,
|
32
|
+
# :cpu => 34,
|
33
|
+
# :memory => 2
|
34
|
+
# }, ...
|
35
|
+
# ]
|
36
|
+
# }
|
37
|
+
def run
|
38
|
+
@processes = calculate_processes # returns a hash
|
39
|
+
|
40
|
+
{
|
41
|
+
:top_memory => get_top_processes(:memory, 10),
|
42
|
+
:top_cpu => get_top_processes(:cpu, 10)
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
# called from run(). This method lists all the processes running on the server, groups them by command,
|
47
|
+
# and calculates CPU time for each process. Since CPU time has to be calculated relative to the last sample,
|
48
|
+
# the collector has to be run twice to get CPU data.
|
49
|
+
def calculate_processes
|
50
|
+
## 1. get a list of all processes grouped by command
|
51
|
+
processes = Sys::ProcTable.ps
|
52
|
+
grouped = Hash.new
|
53
|
+
processes.each do |proc|
|
54
|
+
grouped[proc.comm] ||= {
|
55
|
+
:count => 0,
|
56
|
+
:raw_cpu => 0,
|
57
|
+
:cpu => 0,
|
58
|
+
:memory => 0,
|
59
|
+
:uid => 0,
|
60
|
+
:cmdlines => []
|
61
|
+
}
|
62
|
+
grouped[proc.comm][:count] += 1
|
63
|
+
grouped[proc.comm][:raw_cpu] += proc.cutime + proc.cstime
|
64
|
+
grouped[proc.comm][:memory] += proc.rss.to_f / 1024.0
|
65
|
+
grouped[proc.comm][:uid] = proc.uid
|
66
|
+
grouped[proc.comm][:cmdlines] << proc.cmdline if !grouped[proc.comm][:cmdlines].include?(proc.cmdline)
|
67
|
+
end # processes.each
|
68
|
+
|
69
|
+
## 2. loop through each and calculate the CPU time. To do this, you need to compare the current values against the last run
|
70
|
+
now = Time.now
|
71
|
+
if @last_run and @last_process_list
|
72
|
+
elapsed_time = now - @last_run # in seconds
|
73
|
+
if elapsed_time >= 1
|
74
|
+
grouped.each do |name, values|
|
75
|
+
if last_values = @last_process_list[name]
|
76
|
+
cpu_since_last_sample = values[:raw_cpu] - last_values[:raw_cpu]
|
77
|
+
grouped[name][:cpu] = (cpu_since_last_sample/(elapsed_time * ServerMetrics::SystemInfo.num_processors))*100
|
78
|
+
else
|
79
|
+
grouped.reject!(name) # no data from last run. don't report anything.
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
@last_process_list = grouped
|
85
|
+
@last_run = now
|
86
|
+
grouped
|
87
|
+
end
|
88
|
+
|
89
|
+
# Can only be called after @processes is set. Based on @processes, calcuates the top {num} processes, as ordered by {order_by}.
|
90
|
+
# Returns an array of hashes:
|
91
|
+
# [{:cmd=>"ruby", :cpu=>30.0, :memory=>100, :uid=>1,:cmdlines=>[]}, {:cmd => ...} ]
|
92
|
+
def get_top_processes(order_by, num)
|
93
|
+
@processes.map { |key, hash| {:cmd => key}.merge(hash) }.sort { |a, b| a[order_by] <=> b[order_by] }.reverse[0...num-1]
|
94
|
+
end
|
95
|
+
|
96
|
+
# for persisting to a file -- conforms to same basic API as the Collectors do.
|
97
|
+
# why not just use marshall? This is a lot more manageable written to the Scout agent's history file.
|
98
|
+
def to_hash
|
99
|
+
{:last_run=>@last_run, :last_process_list=>@last_process_list}
|
100
|
+
end
|
101
|
+
|
102
|
+
# for reinstantiating from a hash
|
103
|
+
# why not just use marshall? this is a lot more manageable written to the Scout agent's history file.
|
104
|
+
def self.from_hash(hash)
|
105
|
+
p.instance_variable_set('@last_run', hash[:last_run])
|
106
|
+
p.instance_variable_set('@last_process_list', hash[:last_process_list])
|
107
|
+
p
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# MultiCollector is a special case of Collector that returns N metric bundles. For example, Disk uses MultiCollector:
|
2
|
+
# you can have any number of mounted disks. MultiCollector generates a nested result:
|
3
|
+
#{
|
4
|
+
# "dev/disk1" => {
|
5
|
+
# "Avail" => 295936.0,
|
6
|
+
# "Capacity" => 38.0,
|
7
|
+
# ...
|
8
|
+
# },
|
9
|
+
# "dev/disk2" => {
|
10
|
+
# "Avail" => 295936.0,
|
11
|
+
# "Capacity" => 38.0,
|
12
|
+
# ...
|
13
|
+
# }
|
14
|
+
#
|
15
|
+
#}
|
16
|
+
|
17
|
+
module ServerMetrics
|
18
|
+
class MultiCollector < ServerMetrics::Collector
|
19
|
+
|
20
|
+
# report("/dev/desk2", :key=>value)
|
21
|
+
def report(bundle_name, values)
|
22
|
+
@data[bundle_name] ||= {}
|
23
|
+
@data[bundle_name].merge!(values)
|
24
|
+
end
|
25
|
+
|
26
|
+
# for MultiCollector, Memory takes an additional argument specifying the sub-hash (bundle) in memory.
|
27
|
+
# The bundle name corresponds to the disk/network/whatever we're storing memory for.
|
28
|
+
#
|
29
|
+
# memory("/dev/desk2", :no_track)
|
30
|
+
# memory.delete("/dev/desk2",:no_track)
|
31
|
+
# memory.clear("/dev/desk2")
|
32
|
+
#
|
33
|
+
def memory(bundle_name, name)
|
34
|
+
@memory[bundle_name] ||= {}
|
35
|
+
if name.nil?
|
36
|
+
@memory[bundle_name]
|
37
|
+
else
|
38
|
+
@memory[bundle_name][name] || @memory[name.is_a?(String) ? name.to_sym : String(name)]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# just like the memory function, "remember" takes an additional argument to partition memory by bundle name
|
43
|
+
def remember(bundle_name, hash)
|
44
|
+
@memory[bundle_name] ||= {}
|
45
|
+
@memory[bundle_name].merge!(hash)
|
46
|
+
end
|
47
|
+
|
48
|
+
# counters are also partitioned by bundle name
|
49
|
+
#
|
50
|
+
# counter("/dev/desk2", :rkbps, stats['rsect'] / 2, :per => :second)
|
51
|
+
# counter("/dev/desk2", :rpm, request_counter, :per => :minute)
|
52
|
+
# counter("/dev/desk2", :swap_ins, vmstat['pswpin'], :per => :second, :round => true)
|
53
|
+
#
|
54
|
+
def counter(bundle_name, name, value, options = {}, &block)
|
55
|
+
current_time = Time.now
|
56
|
+
|
57
|
+
if data = memory(bundle_name, "_counter_#{name}")
|
58
|
+
last_time, last_value = data[:time], data[:value]
|
59
|
+
elapsed_seconds = current_time - last_time
|
60
|
+
|
61
|
+
# We won't log it if the value has wrapped or enough time hasn't
|
62
|
+
# elapsed
|
63
|
+
if value >= last_value && elapsed_seconds >= 1
|
64
|
+
if block
|
65
|
+
result = block.call(last_value, value)
|
66
|
+
else
|
67
|
+
result = value - last_value
|
68
|
+
end
|
69
|
+
|
70
|
+
case options[:per]
|
71
|
+
when :second, 'second'
|
72
|
+
result = result / elapsed_seconds.to_f
|
73
|
+
when :minute, 'minute'
|
74
|
+
result = result / elapsed_seconds.to_f * 60.0
|
75
|
+
else
|
76
|
+
raise "Unknown option for ':per': #{options[:per].inspect}"
|
77
|
+
end
|
78
|
+
|
79
|
+
if options[:round]
|
80
|
+
result = (result * (10 ** options[:round])).round / (10 ** options[:round]).to_f
|
81
|
+
end
|
82
|
+
report(bundle_name, name => result)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
remember(bundle_name, "_counter_#{name}" => {:time => current_time, :value => value})
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
require 'socket'
|
3
|
+
|
4
|
+
module ServerMetrics
|
5
|
+
class SystemInfo
|
6
|
+
|
7
|
+
def self.architecture
|
8
|
+
RbConfig::CONFIG['target_cpu']
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.os
|
12
|
+
RbConfig::CONFIG['target_os']
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.os_version
|
16
|
+
`uname -r`.chomp
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.num_processors
|
20
|
+
if os =~ /(darwin|freebsd)/
|
21
|
+
`sysctl -n hw.ncpu`.to_i
|
22
|
+
elsif os =~ /linux/
|
23
|
+
lines = `cat /proc/cpuinfo`.split("\n")
|
24
|
+
lines.grep(/^processor\s*:/).size
|
25
|
+
end
|
26
|
+
rescue
|
27
|
+
nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.timezone
|
31
|
+
Time.now.zone
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.timezone_offset
|
35
|
+
Time.now.utc_offset/60/60
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.hostname
|
39
|
+
Socket.gethostname
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.to_h
|
43
|
+
{:architecture => architecture, :os=>os, :os_version=>os_version, :num_processors=>num_processors, :hostname=>hostname, :timezone=>timezone, :timezone_offset=>timezone_offset }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
@@ -0,0 +1,8 @@
|
|
1
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'server_metrics/version'
|
4
|
+
require 'server_metrics/collector'
|
5
|
+
require 'server_metrics/multi_collector'
|
6
|
+
require 'server_metrics/system_info'
|
7
|
+
|
8
|
+
Dir[File.dirname(__FILE__) + '/server_metrics/collectors/*.rb'].each {|file| require file }
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'server_metrics/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "server_metrics"
|
8
|
+
spec.version = ServerMetrics::VERSION
|
9
|
+
spec.authors = ["Andre Lewis"]
|
10
|
+
spec.email = ["andre@scoutapp.com"]
|
11
|
+
spec.description = %q{Collect information about disks, memory, CPU, etc}
|
12
|
+
spec.summary = %q{For use with the Scout agent}
|
13
|
+
spec.homepage = "http://scoutapp.com"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "sys-proctable"
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "awesome_print"
|
26
|
+
spec.add_development_dependency "pry"
|
27
|
+
spec.add_development_dependency "timecop"
|
28
|
+
spec.add_development_dependency "mocha"
|
29
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
### `uptime`
|
2
|
+
15:13:55 up 725 days, 4:38, 1 user, load average: 0.25, 0.17, 0.11
|
3
|
+
|
4
|
+
### `cat /proc/stat 2>&1`
|
5
|
+
cpu 253276049 0 211470167 199385636972 232887976 266 10404969 2594848 0
|
6
|
+
cpu0 26258010 0 63099690 12159411413 154920140 209 10383230 1570451 0
|
7
|
+
cpu1 19716882 0 18824493 12440168280 36129197 2 10257 271408 0
|
8
|
+
cpu2 48760918 0 92301309 12224785690 31350071 2 2419 177223 0
|
9
|
+
cpu3 25895845 0 21522019 12450568993 3291899 50 970 98284 0
|
10
|
+
cpu4 11296887 0 5820262 12500438642 1947239 2 7044 54477 0
|
11
|
+
cpu5 8502709 0 1828148 12513356260 1150749 1 823 48403 0
|
12
|
+
cpu6 19194947 0 1629648 12492448267 739021 0 123 47058 0
|
13
|
+
cpu7 17140517 0 1188241 12497432755 603142 0 27 42314 0
|
14
|
+
cpu8 10694747 0 752902 12511144513 572602 0 18 38049 0
|
15
|
+
cpu9 8515823 0 972863 12514815849 569090 0 21 36494 0
|
16
|
+
cpu10 15081064 0 1236446 12501172690 564510 0 9 36791 0
|
17
|
+
cpu11 9545841 0 1243077 12511944994 499031 0 8 35688 0
|
18
|
+
cpu12 7989439 0 656867 12516676150 228349 0 6 35040 0
|
19
|
+
cpu13 5911108 0 217671 12521436037 176917 0 3 34314 0
|
20
|
+
cpu14 9319500 0 111002 12515078835 105552 0 4 34491 0
|
21
|
+
cpu15 9451812 0 65529 12514757604 40467 0 7 34363 0
|
22
|
+
intr 18459488402 2755874654 1017677 55413955 82133 0 54724 2942722106 475489 692034931 2605639 0 275311442 1598632894 746202 354826058 1925619 0 184532554 1155096944 324016 106102984 795578 0 42763672 394451178 229380 33834720 467309 0 11308782 308906115 129442 17063974 244811 0 3997464 265430585 105706 11954591 152129 0 1738087 172309019 113600 10724263 65982 0 1163168 100445334 175788 10261326 48634 0 895391 70077699 279924 9960808 53621 0 758273 63089327 440431 9924133 65612 0 524841 51555427 468341 9899685 72769 0 381391 42700159 236140 9173080 55776 0 232790 37547876 65187 8490695 31194 0 113388 38159546 34759 8273005 14428 0 58326 36980910 15441 8185709 6749 0 28331 510 24 987009450 324 603787722 3056504028 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
23
|
+
ctxt 14426396271
|
24
|
+
btime 1319380546
|
25
|
+
processes 326424395
|
26
|
+
procs_running 1
|
27
|
+
procs_blocked 0
|
28
|
+
softirq 32527853666 0 1108802755 2174422434 1018051663 0 0 1 2867463785 2329513 3881947035
|
29
|
+
|
30
|
+
### `cat /proc/stat 2>&1` second run
|
31
|
+
cpu 253276061 0 211470191 199385731316 232888034 266 10404973 2594849 0
|
32
|
+
cpu0 26258016 0 63099704 12159417013 154920196 209 10383234 1570452 0
|
33
|
+
cpu1 19716883 0 18824496 12440173979 36129199 2 10257 271408 0
|
34
|
+
cpu2 48760923 0 92301315 12224791382 31350071 2 2419 177223 0
|
35
|
+
cpu3 25895845 0 21522020 12450574714 3291899 50 970 98284 0
|
36
|
+
cpu4 11296887 0 5820262 12500444377 1947239 2 7044 54477 0
|
37
|
+
cpu5 8502709 0 1828148 12513361442 1150749 1 823 48403 0
|
38
|
+
cpu6 19194947 0 1629648 12492453169 739021 0 123 47058 0
|
39
|
+
cpu7 17140517 0 1188241 12497439108 603142 0 27 42314 0
|
40
|
+
cpu8 10694747 0 752902 12511150916 572602 0 18 38049 0
|
41
|
+
cpu9 8515823 0 972863 12514822202 569090 0 21 36494 0
|
42
|
+
cpu10 15081064 0 1236446 12501178712 564510 0 9 36791 0
|
43
|
+
cpu11 9545841 0 1243077 12511950920 499031 0 8 35688 0
|
44
|
+
cpu12 7989439 0 656867 12516682073 228349 0 6 35040 0
|
45
|
+
cpu13 5911108 0 217671 12521442486 176917 0 3 34314 0
|
46
|
+
cpu14 9319500 0 111002 12515085190 105552 0 4 34491 0
|
47
|
+
cpu15 9451812 0 65529 12514763633 40467 0 7 34363 0
|
48
|
+
intr 18459496216 2755875459 1017677 55413984 82133 0 54724 2942722875 475489 692035015 2605642 0 275311473 1598633404 746202 354826103 1925622 0 184532578 1155097563 324016 106102998 795578 0 42763672 394451429 229380 33834727 467309 0 11308782 308906125 129442 17063977 244811 0 3997464 265430626 105706 11954595 152129 0 1738087 172309028 113600 10724267 65982 0 1163168 100445345 175788 10261330 48634 0 895391 70077708 279924 9960812 53621 0 758273 63089346 440431 9924137 65613 0 524841 51555489 468341 9899692 72770 0 381391 42700167 236140 9173084 55776 0 232790 37547885 65187 8490699 31194 0 113388 38159557 34759 8273009 14428 0 58326 36980918 15441 8185713 6749 0 28331 510 24 987009627 324 603787861 3056507799 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
49
|
+
ctxt 14426401515
|
50
|
+
btime 1319380546
|
51
|
+
processes 326424434
|
52
|
+
procs_running 1
|
53
|
+
procs_blocked 0
|
54
|
+
softirq 32527865769 0 1108805769 2174424404 1018053487 0 0 1 2867465761 2329513 3881950354
|
@@ -0,0 +1,79 @@
|
|
1
|
+
### `mount` ubuntu
|
2
|
+
/dev/xvda1 on / type ext3 (rw,noatime,nodiratime)
|
3
|
+
proc on /proc type proc (rw)
|
4
|
+
none on /sys type sysfs (rw,noexec,nosuid,nodev)
|
5
|
+
none on /sys/fs/fuse/connections type fusectl (rw)
|
6
|
+
none on /sys/kernel/debug type debugfs (rw)
|
7
|
+
none on /sys/kernel/security type securityfs (rw)
|
8
|
+
none on /dev type devtmpfs (rw,mode=0755)
|
9
|
+
none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
|
10
|
+
none on /dev/shm type tmpfs (rw,nosuid,nodev)
|
11
|
+
none on /var/run type tmpfs (rw,nosuid,mode=0755)
|
12
|
+
none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)
|
13
|
+
none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
|
14
|
+
nfsd on /proc/fs/nfsd type nfsd (rw)
|
15
|
+
|
16
|
+
### `df -h` ubuntu
|
17
|
+
Filesystem Size Used Avail Use% Mounted on
|
18
|
+
/dev/xvda1 124G 84G 37G 70% /
|
19
|
+
none 7.9G 128K 7.9G 1% /dev
|
20
|
+
none 7.9G 0 7.9G 0% /dev/shm
|
21
|
+
none 7.9G 64K 7.9G 1% /var/run
|
22
|
+
none 7.9G 0 7.9G 0% /var/lock
|
23
|
+
none 7.9G 0 7.9G 0% /lib/init/rw
|
24
|
+
|
25
|
+
### `cat /proc/diskstats` ubuntu
|
26
|
+
1 0 ram0 0 0 0 0 0 0 0 0 0 0 0
|
27
|
+
1 1 ram1 0 0 0 0 0 0 0 0 0 0 0
|
28
|
+
1 2 ram2 0 0 0 0 0 0 0 0 0 0 0
|
29
|
+
1 3 ram3 0 0 0 0 0 0 0 0 0 0 0
|
30
|
+
1 4 ram4 0 0 0 0 0 0 0 0 0 0 0
|
31
|
+
1 5 ram5 0 0 0 0 0 0 0 0 0 0 0
|
32
|
+
1 6 ram6 0 0 0 0 0 0 0 0 0 0 0
|
33
|
+
1 7 ram7 0 0 0 0 0 0 0 0 0 0 0
|
34
|
+
1 8 ram8 0 0 0 0 0 0 0 0 0 0 0
|
35
|
+
1 9 ram9 0 0 0 0 0 0 0 0 0 0 0
|
36
|
+
1 10 ram10 0 0 0 0 0 0 0 0 0 0 0
|
37
|
+
1 11 ram11 0 0 0 0 0 0 0 0 0 0 0
|
38
|
+
1 12 ram12 0 0 0 0 0 0 0 0 0 0 0
|
39
|
+
1 13 ram13 0 0 0 0 0 0 0 0 0 0 0
|
40
|
+
1 14 ram14 0 0 0 0 0 0 0 0 0 0 0
|
41
|
+
1 15 ram15 0 0 0 0 0 0 0 0 0 0 0
|
42
|
+
7 0 loop0 0 0 0 0 0 0 0 0 0 0 0
|
43
|
+
7 1 loop1 0 0 0 0 0 0 0 0 0 0 0
|
44
|
+
7 2 loop2 0 0 0 0 0 0 0 0 0 0 0
|
45
|
+
7 3 loop3 0 0 0 0 0 0 0 0 0 0 0
|
46
|
+
7 4 loop4 0 0 0 0 0 0 0 0 0 0 0
|
47
|
+
7 5 loop5 0 0 0 0 0 0 0 0 0 0 0
|
48
|
+
7 6 loop6 0 0 0 0 0 0 0 0 0 0 0
|
49
|
+
7 7 loop7 0 0 0 0 0 0 0 0 0 0 0
|
50
|
+
202 1 xvda1 75413629 1344 743739154 105524030 1053781681 1294891028 18878505976 209944886 0 1628702090 315544316
|
51
|
+
202 2 xvda2 281 29 2480 130 1011 312 10584 6380 0 620 6510
|
52
|
+
|
53
|
+
### `cat /proc/diskstats` ubuntu second run
|
54
|
+
1 0 ram0 0 0 0 0 0 0 0 0 0 0 0
|
55
|
+
1 1 ram1 0 0 0 0 0 0 0 0 0 0 0
|
56
|
+
1 2 ram2 0 0 0 0 0 0 0 0 0 0 0
|
57
|
+
1 3 ram3 0 0 0 0 0 0 0 0 0 0 0
|
58
|
+
1 4 ram4 0 0 0 0 0 0 0 0 0 0 0
|
59
|
+
1 5 ram5 0 0 0 0 0 0 0 0 0 0 0
|
60
|
+
1 6 ram6 0 0 0 0 0 0 0 0 0 0 0
|
61
|
+
1 7 ram7 0 0 0 0 0 0 0 0 0 0 0
|
62
|
+
1 8 ram8 0 0 0 0 0 0 0 0 0 0 0
|
63
|
+
1 9 ram9 0 0 0 0 0 0 0 0 0 0 0
|
64
|
+
1 10 ram10 0 0 0 0 0 0 0 0 0 0 0
|
65
|
+
1 11 ram11 0 0 0 0 0 0 0 0 0 0 0
|
66
|
+
1 12 ram12 0 0 0 0 0 0 0 0 0 0 0
|
67
|
+
1 13 ram13 0 0 0 0 0 0 0 0 0 0 0
|
68
|
+
1 14 ram14 0 0 0 0 0 0 0 0 0 0 0
|
69
|
+
1 15 ram15 0 0 0 0 0 0 0 0 0 0 0
|
70
|
+
7 0 loop0 0 0 0 0 0 0 0 0 0 0 0
|
71
|
+
7 1 loop1 0 0 0 0 0 0 0 0 0 0 0
|
72
|
+
7 2 loop2 0 0 0 0 0 0 0 0 0 0 0
|
73
|
+
7 3 loop3 0 0 0 0 0 0 0 0 0 0 0
|
74
|
+
7 4 loop4 0 0 0 0 0 0 0 0 0 0 0
|
75
|
+
7 5 loop5 0 0 0 0 0 0 0 0 0 0 0
|
76
|
+
7 6 loop6 0 0 0 0 0 0 0 0 0 0 0
|
77
|
+
7 7 loop7 0 0 0 0 0 0 0 0 0 0 0
|
78
|
+
202 1 xvda1 75413637 1344 743739218 105524040 1053781994 1294891526 18878512088 209956216 9 1628702500 315555746
|
79
|
+
202 2 xvda2 281 29 2480 130 1011 312 10584 6380 0 620 6510
|
@@ -0,0 +1,43 @@
|
|
1
|
+
### `cat /proc/meminfo`
|
2
|
+
MemTotal: 4332028 kB
|
3
|
+
MemFree: 245236 kB
|
4
|
+
Buffers: 50592 kB
|
5
|
+
Cached: 1961296 kB
|
6
|
+
SwapCached: 2252 kB
|
7
|
+
Active: 2035620 kB
|
8
|
+
Inactive: 1372484 kB
|
9
|
+
Active(anon): 1144828 kB
|
10
|
+
Inactive(anon): 251720 kB
|
11
|
+
Active(file): 890792 kB
|
12
|
+
Inactive(file): 1120764 kB
|
13
|
+
Unevictable: 0 kB
|
14
|
+
Mlocked: 0 kB
|
15
|
+
SwapTotal: 2097148 kB
|
16
|
+
SwapFree: 2085364 kB
|
17
|
+
Dirty: 1008 kB
|
18
|
+
Writeback: 0 kB
|
19
|
+
AnonPages: 1394372 kB
|
20
|
+
Mapped: 13624 kB
|
21
|
+
Shmem: 336 kB
|
22
|
+
Slab: 122924 kB
|
23
|
+
SReclaimable: 86536 kB
|
24
|
+
SUnreclaim: 36388 kB
|
25
|
+
KernelStack: 2968 kB
|
26
|
+
PageTables: 12064 kB
|
27
|
+
NFS_Unstable: 0 kB
|
28
|
+
Bounce: 0 kB
|
29
|
+
WritebackTmp: 0 kB
|
30
|
+
CommitLimit: 4263160 kB
|
31
|
+
Committed_AS: 2346404 kB
|
32
|
+
VmallocTotal: 34359738367 kB
|
33
|
+
VmallocUsed: 116640 kB
|
34
|
+
VmallocChunk: 34359619676 kB
|
35
|
+
HardwareCorrupted: 0 kB
|
36
|
+
AnonHugePages: 0 kB
|
37
|
+
HugePages_Total: 0
|
38
|
+
HugePages_Free: 0
|
39
|
+
HugePages_Rsvd: 0
|
40
|
+
HugePages_Surp: 0
|
41
|
+
Hugepagesize: 2048 kB
|
42
|
+
DirectMap4k: 52428800 kB
|
43
|
+
DirectMap2M: 0 kB
|
@@ -0,0 +1,13 @@
|
|
1
|
+
### `cat /proc/net/dev`
|
2
|
+
Inter-| Receive | Transmit
|
3
|
+
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
|
4
|
+
lo: 374560323 1856730 0 0 0 0 0 0 374560323 1856730 0 0 0 0 0 0
|
5
|
+
eth0: 552462517623 3558957087 0 1364584 0 0 0 0 587598134392 2577271905 0 0 0 0 0 0
|
6
|
+
eth1: 6858417585848 11678891991 0 1364584 0 0 0 0 1746386430035 10460881172 0 0 0 0 0 0
|
7
|
+
|
8
|
+
### `cat /proc/net/dev` second run
|
9
|
+
Inter-| Receive | Transmit
|
10
|
+
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
|
11
|
+
lo: 374560323 1856730 0 0 0 0 0 0 374560323 1856730 0 0 0 0 0 0
|
12
|
+
eth0: 552465252508 3558974617 0 1364590 0 0 0 0 587600612397 2577284599 0 0 0 0 0 0
|
13
|
+
eth1: 6858453491060 11678952278 0 1364590 0 0 0 0 1746395339079 10460934020 0 0 0 0 0 0
|