|
1 | | -require "time" |
2 | | - |
3 | 1 | module Vmstat |
4 | 2 | 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 |
10 | 9 | end |
11 | | - end |
12 | | - |
13 | | - def self.boot_time |
14 | | - Time.parse(`who -b`.gsub(/^.*boot\s+/, "").gsub(/\s+/, " ").strip) |
15 | | - end |
16 | 10 |
|
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 |
20 | 15 | end |
21 | 16 |
|
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) |
24 | 19 | end |
25 | 20 |
|
26 | 21 | def self.memory |
27 | | - memstat = `echo ::memstat | mdb -k` |
28 | | - vmstat = `vmstat -s` |
| 22 | + kstat = `kstat -p -n system_pages` |
| 23 | + values = Hash.new |
29 | 24 |
|
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 |
43 | 41 | end |
44 | 42 |
|
45 | 43 | 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 } |
55 | 46 |
|
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 |
60 | 50 | 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) |
70 | 59 | end |
71 | | - val |
72 | 60 | end |
73 | 61 | end |
0 commit comments