Skip to content

Commit 378d178

Browse files
author
Vincent Landgraf
committed
#10 use kstat for all queries (enables host and zone use)
1 parent 3a4c087 commit 378d178

1 file changed

Lines changed: 43 additions & 55 deletions

File tree

lib/vmstat/solaris.rb

Lines changed: 43 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,61 @@
1-
require "time"
2-
31
module Vmstat
42
def self.cpu
5-
mpstat = `mpstat 1 1`.lines
6-
mpstat.shift # ignore header
7-
mpstat.map do |line|
8-
num, *rest, user, sys, _, idle = line.strip.split(/\s+/)
9-
Cpu.new(num.to_i, user.to_i, sys.to_i, 0, idle.to_i)
3+
kstat = `kstat -p "cpu_stat:::/idle|kernel|user/"`
4+
cpus = Hash.new { |h, k| h[k] = Hash.new }
5+
6+
kstat.lines.each do |line|
7+
_, _, cpu, key, value = line.strip.split(/:|\s+/)
8+
values[cpu] = value
109
end
11-
end
12-
13-
def self.boot_time
14-
Time.parse(`who -b`.gsub(/^.*boot\s+/, "").gsub(/\s+/, " ").strip)
15-
end
1610

17-
def self.load_average
18-
uptime = `uptime`.gsub(",", ".")
19-
LoadAverage.new(*uptime.gsub(/\d+(\.\d+)?/).to_a[-3..-1].map(&:to_f))
11+
cpus.map do |k, v|
12+
name = k.gsub(/cpu_stat/, "").to_i
13+
Cpu.new(name, v["user"].to_i, v["kernel"].to_i, 0, v["idle"].to_i)
14+
end
2015
end
2116

22-
def self.pagesize
23-
`pagesize`.to_i
17+
def self.boot_time
18+
Time.at(`kstat -p unix:::boot_time`.strip.split(/\s+/).last.to_i)
2419
end
2520

2621
def self.memory
27-
memstat = `echo ::memstat | mdb -k`
28-
vmstat = `vmstat -s`
22+
kstat = `kstat -p -n system_pages`
23+
values = Hash.new
2924

30-
Memory.new(
31-
pagesize,
32-
# wired
33-
extract_solaris_mval(memstat, 'Kernel', 'Boot pages', 'ZFS File Data'),
34-
# active
35-
extract_solaris_mval(memstat, 'Exec and libs'),
36-
# inactive
37-
extract_solaris_mval(memstat, 'Page cache', 'Anon'),
38-
# free
39-
extract_solaris_mval(memstat, 'Free \(cachelist\)', 'Free \(freelist\)'),
40-
extract_solaris_val(vmstat, 'page ins'), # pageins
41-
extract_solaris_val(vmstat, 'page outs') # pageouts
42-
)
25+
kstat.lines.each do |line|
26+
_, _, _, key, value = line.strip.split(/:|\s+/)
27+
values[key] = value
28+
end
29+
30+
total = values['pagestotal'].to_i
31+
free = values['pagesfree'].to_i
32+
locked = values['pageslocked'].to_i
33+
34+
Memory.new(pagesize,
35+
locked, # wired
36+
total - free - locked, # active
37+
0, # inactive
38+
free, # free
39+
0, #pageins
40+
0) #pageouts
4341
end
4442

4543
def self.network_interfaces
46-
dlstat = `dlstat -u R`
47-
dlstat.shift # ignore header
48-
dlstat.map do |line|
49-
# LINK IPKTS RBYTES OPKTS OBYTES
50-
link, ipkts, rbytes, opkts, obytes = line.strip.split(/\s+/)
51-
NetworkInterface.new(link, rbytes, 0, 0, obytes, 0,
52-
NetworkInterface::ETHERNET_TYPE)
53-
end
54-
end
44+
kstat = `kstat -p link:::`
45+
itfs = Hash.new { |h, k| h[k] = Hash.new }
5546

56-
def self.extract_solaris_val(uvmexp, name)
57-
regexp = Regexp.new('(\d+)\s' + name)
58-
uvmexp.lines.grep(regexp) do |line|
59-
return $1.to_i
47+
kstat.lines.each do |line|
48+
_, _, name, key, value = line.strip.split(/:|\s+/)
49+
itfs[name][key] = value
6050
end
61-
end
62-
63-
def self.extract_solaris_mval(memstat, *names)
64-
val = 0
65-
names.each do |name|
66-
regexp = Regexp.new(name + '\s+(\d+)')
67-
memstat.grep(regexp) do |line|
68-
val += $1.to_i
69-
end
51+
52+
itfs.map do |k, v|
53+
NetworkInterface.new(k, v['rbytes64'].to_i,
54+
v['ierrors'].to_i,
55+
0,
56+
v['obytes64'].to_i,
57+
v['oerrors'].to_i,
58+
NetworkInterface::ETHERNET_TYPE)
7059
end
71-
val
7260
end
7361
end

0 commit comments

Comments
 (0)