perfmonger 0.10.2 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.travis.yml +6 -2
- data/HOWTO.md +0 -1
- data/NEWS +15 -6
- data/README.md +77 -27
- data/Rakefile +18 -9
- data/core/Makefile +2 -18
- data/core/build.sh +1 -1
- data/core/perfmonger-player.go +71 -40
- data/core/perfmonger-plot-formatter.go +18 -4
- data/core/perfmonger-recorder.go +16 -2
- data/core/perfmonger-summarizer.go +19 -13
- data/core/subsystem/usage.go +143 -66
- data/core/subsystem/usage_test.go +62 -32
- data/{bin → exe}/perfmonger +0 -0
- data/lib/perfmonger/command/fingerprint.rb +26 -1
- data/lib/perfmonger/command/live.rb +19 -0
- data/lib/perfmonger/command/play.rb +16 -0
- data/lib/perfmonger/command/plot.rb +16 -10
- data/lib/perfmonger/command/server.rb +1 -1
- data/lib/perfmonger/version.rb +1 -1
- data/misc/werker-box/Dockerfile +35 -0
- data/misc/werker-box/build-push.sh +5 -0
- data/perfmonger.gemspec +2 -1
- data/spec/data/busy100.pgr.played +3 -3
- data/spec/fingerprint_spec.rb +1 -1
- data/spec/live_spec.rb +2 -3
- data/spec/perfmonger_spec.rb +1 -1
- data/spec/play_spec.rb +1 -1
- data/spec/plot_spec.rb +16 -1
- data/spec/record_spec.rb +10 -1
- data/spec/spec_helper.rb +28 -3
- data/spec/stat_spec.rb +2 -2
- data/spec/summary_spec.rb +1 -1
- data/wercker.yml +47 -16
- metadata +25 -10
data/{bin → exe}/perfmonger
RENAMED
File without changes
|
@@ -57,6 +57,10 @@ EOS
|
|
57
57
|
save_proc_info()
|
58
58
|
end
|
59
59
|
|
60
|
+
do_with_message("Saving numactl info") do
|
61
|
+
save_numactl_info()
|
62
|
+
end
|
63
|
+
|
60
64
|
do_with_message("Saving IRQ info") do
|
61
65
|
save_irq_info()
|
62
66
|
end
|
@@ -109,9 +113,14 @@ EOS
|
|
109
113
|
save_nvme_info()
|
110
114
|
end
|
111
115
|
|
112
|
-
|
113
116
|
## Collect vendor specific info
|
114
117
|
|
118
|
+
# https://aws.amazon.com/jp/code/ec2-instance-metadata-query-tool/
|
119
|
+
if find_executable("ec2-metadata")
|
120
|
+
do_with_message("Saving EC2 metadata info") do
|
121
|
+
save_ec2metadata_info()
|
122
|
+
end
|
123
|
+
end
|
115
124
|
|
116
125
|
# LSI MegaRAID
|
117
126
|
megacli_bin = "/opt/MegaRAID/MegaCli/MegaCli64"
|
@@ -241,6 +250,22 @@ EOS
|
|
241
250
|
end
|
242
251
|
end
|
243
252
|
|
253
|
+
def save_numactl_info()
|
254
|
+
numactl_bin = find_executable("numactl")
|
255
|
+
|
256
|
+
File.open("#{@output_dir}/numactl.log", "w") do |f|
|
257
|
+
f.puts(`#{numactl_bin} --hardware`)
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
def save_ec2metadata_info()
|
262
|
+
ec2metadata_bin = find_executable("ec2-metadata")
|
263
|
+
|
264
|
+
File.open("#{@output_dir}/ec2-metadata.log", "w") do |f|
|
265
|
+
f.puts(`#{ec2metadata_bin} --all`)
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
244
269
|
def save_lsblk_info()
|
245
270
|
lsblk_bin = find_executable("lsblk")
|
246
271
|
|
@@ -7,10 +7,29 @@ module PerfMonger
|
|
7
7
|
module Command
|
8
8
|
|
9
9
|
class LiveOption < RecordOption
|
10
|
+
def initialize
|
11
|
+
super
|
12
|
+
|
13
|
+
@color = false
|
14
|
+
@parser.on("-c", "--color", "Use colored JSON output") do
|
15
|
+
@color = true
|
16
|
+
end
|
17
|
+
|
18
|
+
@pretty
|
19
|
+
@parser.on("--pretty", "Use human readable JSON output") do
|
20
|
+
@pretty = true
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
10
25
|
def make_command
|
11
26
|
cmd = super()
|
12
27
|
@player_bin = ::PerfMonger::Command::CoreFinder.player()
|
13
28
|
cmd += ["-player-bin", @player_bin]
|
29
|
+
cmd << "-color" if @color
|
30
|
+
cmd << "-pretty" if @pretty
|
31
|
+
|
32
|
+
cmd
|
14
33
|
end
|
15
34
|
end
|
16
35
|
|
@@ -16,6 +16,16 @@ Usage: perfmonger play [options] LOG_FILE
|
|
16
16
|
Options:
|
17
17
|
EOS
|
18
18
|
|
19
|
+
@color = false
|
20
|
+
@parser.on("-c", "--color", "Use colored JSON ouptut") do
|
21
|
+
@color = true
|
22
|
+
end
|
23
|
+
|
24
|
+
@pretty = false
|
25
|
+
@parser.on("-p", "--pretty", "Use human readable JSON ouptut") do
|
26
|
+
@pretty = true
|
27
|
+
end
|
28
|
+
|
19
29
|
end
|
20
30
|
|
21
31
|
def parse_args(argv)
|
@@ -46,6 +56,12 @@ EOS
|
|
46
56
|
end
|
47
57
|
|
48
58
|
cmd = [@player_bin]
|
59
|
+
if @color
|
60
|
+
cmd << "-color"
|
61
|
+
end
|
62
|
+
if @pretty
|
63
|
+
cmd << "-pretty"
|
64
|
+
end
|
49
65
|
cmd << @logfile
|
50
66
|
|
51
67
|
Process.exec(*cmd)
|
@@ -24,6 +24,7 @@ EOS
|
|
24
24
|
@output_type = 'pdf'
|
25
25
|
@output_prefix = ''
|
26
26
|
@save_gpfiles = false
|
27
|
+
@disk_only = nil
|
27
28
|
@disk_only_regex = nil
|
28
29
|
@disk_plot_read = true
|
29
30
|
@disk_plot_write = true
|
@@ -78,6 +79,7 @@ EOS
|
|
78
79
|
end
|
79
80
|
|
80
81
|
@parser.on('--disk-only REGEX', "Select disk devices that matches REGEX") do |regex|
|
82
|
+
@disk_only = regex
|
81
83
|
@disk_only_regex = Regexp.compile(regex)
|
82
84
|
end
|
83
85
|
|
@@ -139,7 +141,13 @@ EOS
|
|
139
141
|
@cpu_dat = File.expand_path("cpu.dat", @tmpdir)
|
140
142
|
|
141
143
|
meta_json = nil
|
142
|
-
|
144
|
+
cmd = [formatter_bin, "-perfmonger", @data_file, "-cpufile", @cpu_dat,
|
145
|
+
"-diskfile", @disk_dat]
|
146
|
+
if @disk_only_regex
|
147
|
+
cmd << "-disk-only"
|
148
|
+
cmd << @disk_only
|
149
|
+
end
|
150
|
+
IO.popen(cmd, "r") do |io|
|
143
151
|
meta_json = io.read
|
144
152
|
end
|
145
153
|
if $?.exitstatus != 0
|
@@ -151,8 +159,6 @@ EOS
|
|
151
159
|
plot_disk(meta)
|
152
160
|
plot_cpu(meta)
|
153
161
|
|
154
|
-
FileUtils.rm_rf(@tmpdir)
|
155
|
-
|
156
162
|
true
|
157
163
|
end
|
158
164
|
|
@@ -391,10 +397,10 @@ EOS
|
|
391
397
|
nr_cols = nr_cpu_factors.select do |x|
|
392
398
|
x <= Math.sqrt(nr_cpu)
|
393
399
|
end.max
|
394
|
-
nr_cols
|
400
|
+
nr_cols = 1
|
395
401
|
nr_rows = nr_cpu / nr_cols
|
396
402
|
|
397
|
-
plot_height = 8
|
403
|
+
plot_height = ([nr_cpu, 8].min) + ([nr_cpu - 8, 0].max) * 0.5
|
398
404
|
|
399
405
|
if nr_rows == 1
|
400
406
|
plot_height /= 2.0
|
@@ -424,14 +430,14 @@ EOS
|
|
424
430
|
end
|
425
431
|
|
426
432
|
all_gpfile.puts <<EOS
|
427
|
-
set title 'cpu #{cpu_idx}' offset
|
433
|
+
set title 'cpu #{cpu_idx}' offset -61,-3 font 'Arial,16'
|
428
434
|
unset key
|
429
435
|
set origin #{xpos}, #{ypos}
|
430
436
|
set size #{1.0/nr_cols}, #{(1.0 - legend_height)/nr_rows}
|
431
|
-
set rmargin
|
432
|
-
set lmargin
|
433
|
-
set tmargin
|
434
|
-
set bmargin
|
437
|
+
set rmargin 2
|
438
|
+
set lmargin 12
|
439
|
+
set tmargin 0.5
|
440
|
+
set bmargin 0.5
|
435
441
|
set xtics offset 0.0,0.5
|
436
442
|
set ytics offset 0.5,0
|
437
443
|
set style fill noborder
|
@@ -114,7 +114,7 @@ EOS
|
|
114
114
|
_, record_option = PerfMonger::Command::RecordOption.parse(@record_cmd_args)
|
115
115
|
|
116
116
|
# find perfmonger command
|
117
|
-
perfmonger_bin = File.expand_path('
|
117
|
+
perfmonger_bin = File.expand_path('exe/perfmonger', PerfMonger::ROOTDIR)
|
118
118
|
if ! File.executable?(perfmonger_bin)
|
119
119
|
puts("ERROR: perfmonger not found!")
|
120
120
|
exit(false)
|
data/lib/perfmonger/version.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
FROM golang:1.8
|
2
|
+
|
3
|
+
WORKDIR /app
|
4
|
+
|
5
|
+
## install packages
|
6
|
+
RUN apt-get update
|
7
|
+
RUN apt-get install -y build-essential libncurses-dev libreadline-dev libssl-dev gnuplot git
|
8
|
+
|
9
|
+
## get source code
|
10
|
+
RUN git clone https://github.com/hayamiz/perfmonger .
|
11
|
+
|
12
|
+
## install RVM
|
13
|
+
RUN curl -sSL https://get.rvm.io | bash -s stable
|
14
|
+
RUN ln -sf /bin/bash /bin/sh
|
15
|
+
|
16
|
+
## install ruby
|
17
|
+
RUN bash -l -c "rvm install 1.9.3"
|
18
|
+
RUN bash -l -c "rvm use 1.9.3 && gem install bundler && bundle"
|
19
|
+
|
20
|
+
RUN bash -l -c "rvm install 2.0.0"
|
21
|
+
RUN bash -l -c "rvm use 2.0.0 && gem install bundler && bundle"
|
22
|
+
|
23
|
+
RUN bash -l -c "rvm install 2.1.10"
|
24
|
+
RUN bash -l -c "rvm use 2.1.10 && gem install bundler && bundle"
|
25
|
+
|
26
|
+
RUN bash -l -c "rvm install 2.2.5"
|
27
|
+
RUN bash -l -c "rvm use 2.2.5 && gem install bundler && bundle"
|
28
|
+
|
29
|
+
RUN bash -l -c "rvm install 2.3.1"
|
30
|
+
RUN bash -l -c "rvm use 2.3.1 && gem install bundler && bundle"
|
31
|
+
|
32
|
+
RUN bash -l -c "rvm install 2.4.0"
|
33
|
+
RUN bash -l -c "rvm use 2.4.0 && gem install bundler && bundle"
|
34
|
+
|
35
|
+
CMD true
|
data/perfmonger.gemspec
CHANGED
@@ -26,7 +26,8 @@ Gem::Specification.new do |s|
|
|
26
26
|
end
|
27
27
|
s.files += Dir.glob("lib/exec/*")
|
28
28
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
29
|
-
s.
|
29
|
+
s.bindir = "exe"
|
30
|
+
s.executables = `git ls-files -- exe/*`.split("\n").map{|f| File.basename(f)}
|
30
31
|
|
31
32
|
s.post_install_message = <<EOS
|
32
33
|
|
@@ -1,3 +1,3 @@
|
|
1
|
-
{"time":1425358686.123,"cpu":{"num_core":2,"all":{"usr":100.00,"nice":0.00,"sys":0.67,"idle":99.33,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00},"cores":[{"usr":0.33,"nice":0.00,"sys":0.33,"idle":99.33,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00},{"usr":99.67,"nice":0.00,"sys":0.33,"idle":0.00,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00}]},"disk":{"devices":["sda","sda1","sda2"],"sda":{"riops":0.00,"wiops":1.67,"rkbyteps":0.00,"wkbyteps":26.66,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":32.00,"qlen":0.00},"sda1":{"riops":0.00,"wiops":1.67,"rkbyteps":0.00,"wkbyteps":26.66,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":32.00,"qlen":0.00},"sda2":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"total":{"riops":0.00,"wiops":3.33,"rkbyteps":0.00,"wkbyteps":53.31,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":32.00,"qlen":0.00}},"net":{"devices":["eth0","lo"],"eth0":{"rxkbyteps":0.04,"rxpktps":0.67,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.24,"txpktps":0.67,"txerrps":0.00,"txdropps":0.00},"lo":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00},"total":{"rxkbyteps":0.04,"rxpktps":0.67,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.24,"txpktps":0.67,"txerrps":0.00,"txdropps":0.00}}}
|
2
|
-
{"time":1425358689.123,"cpu":{"num_core":2,"all":{"usr":100.50,"nice":0.00,"sys":0.33,"idle":99.17,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00},"cores":[{"usr":0.33,"nice":0.00,"sys":0.33,"idle":99.33,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00},{"usr":100.00,"nice":0.00,"sys":0.00,"idle":0.00,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00}]},"disk":{"devices":["sda","sda1","sda2"],"sda":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"sda1":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"sda2":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"total":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00}},"net":{"devices":["eth0","lo"],"eth0":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00},"lo":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00},"total":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00}}}
|
3
|
-
{"time":1425358690.645,"cpu":{"num_core":2,"all":{"usr":100.65,"nice":0.00,"sys":0.00,"idle":99.35,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00},"cores":[{"usr":0.65,"nice":0.00,"sys":0.65,"idle":98.70,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00},{"usr":100.00,"nice":0.00,"sys":0.00,"idle":0.00,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00}]},"disk":{"devices":["sda","sda1","sda2"],"sda":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"sda1":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"sda2":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"total":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00}},"net":{"devices":["eth0","lo"],"eth0":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00},"lo":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00},"total":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00}}}
|
1
|
+
{"time":1425358686.123,"elapsed_time":3.001,"cpu":{"num_core":2,"all":{"usr":100.00,"nice":0.00,"sys":0.67,"idle":99.33,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00},"cores":[{"usr":0.33,"nice":0.00,"sys":0.33,"idle":99.33,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00},{"usr":99.67,"nice":0.00,"sys":0.33,"idle":0.00,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00}]},"disk":{"devices":["sda","sda1","sda2"],"sda":{"riops":0.00,"wiops":1.67,"rkbyteps":0.00,"wkbyteps":26.66,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":32.00,"qlen":0.00},"sda1":{"riops":0.00,"wiops":1.67,"rkbyteps":0.00,"wkbyteps":26.66,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":32.00,"qlen":0.00},"sda2":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"total":{"riops":0.00,"wiops":3.33,"rkbyteps":0.00,"wkbyteps":53.31,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":32.00,"qlen":0.00}},"net":{"devices":["eth0","lo"],"eth0":{"rxkbyteps":0.04,"rxpktps":0.67,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.24,"txpktps":0.67,"txerrps":0.00,"txdropps":0.00},"lo":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00},"total":{"rxkbyteps":0.04,"rxpktps":0.67,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.24,"txpktps":0.67,"txerrps":0.00,"txdropps":0.00}}}
|
2
|
+
{"time":1425358689.123,"elapsed_time":6.001,"cpu":{"num_core":2,"all":{"usr":100.50,"nice":0.00,"sys":0.33,"idle":99.17,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00},"cores":[{"usr":0.33,"nice":0.00,"sys":0.33,"idle":99.33,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00},{"usr":100.00,"nice":0.00,"sys":0.00,"idle":0.00,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00}]},"disk":{"devices":["sda","sda1","sda2"],"sda":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"sda1":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"sda2":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"total":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00}},"net":{"devices":["eth0","lo"],"eth0":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00},"lo":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00},"total":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00}}}
|
3
|
+
{"time":1425358690.645,"elapsed_time":7.524,"cpu":{"num_core":2,"all":{"usr":100.65,"nice":0.00,"sys":0.00,"idle":99.35,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00},"cores":[{"usr":0.65,"nice":0.00,"sys":0.65,"idle":98.70,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00},{"usr":100.00,"nice":0.00,"sys":0.00,"idle":0.00,"iowait":0.00,"hardirq":0.00,"softirq":0.00,"steal":0.00,"guest":0.00,"guestnice":0.00}]},"disk":{"devices":["sda","sda1","sda2"],"sda":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"sda1":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"sda2":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00},"total":{"riops":0.00,"wiops":0.00,"rkbyteps":0.00,"wkbyteps":0.00,"rlatency":0.000,"wlatency":0.000,"rsize":0.00,"wsize":0.00,"qlen":0.00}},"net":{"devices":["eth0","lo"],"eth0":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00},"lo":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00},"total":{"rxkbyteps":0.00,"rxpktps":0.00,"rxerrps":0.00,"rxdropps":0.00,"txkbyteps":0.00,"txpktps":0.00,"txerrps":0.00,"txdropps":0.00}}}
|
data/spec/fingerprint_spec.rb
CHANGED
data/spec/live_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe '[live] subcommand' do
|
3
|
+
RSpec.describe '[live] subcommand' do
|
4
4
|
before(:each) do
|
5
5
|
skip_if_proc_is_not_available
|
6
6
|
end
|
@@ -9,7 +9,6 @@ describe '[live] subcommand' do
|
|
9
9
|
cmd = "#{perfmonger_bin} live --timeout 3"
|
10
10
|
run(cmd, 5)
|
11
11
|
expect(last_command_started).to be_successfully_executed
|
12
|
-
expect(last_command_started.stdout.lines.to_a.size).to eq 3
|
13
12
|
|
14
13
|
run(cmd)
|
15
14
|
last_command_started.stdout.each_line do |line|
|
@@ -21,6 +20,6 @@ describe '[live] subcommand' do
|
|
21
20
|
expect(json.keys.sort).to eq %w{time cpu disk net}.sort
|
22
21
|
end
|
23
22
|
|
24
|
-
expect("perfmonger.pgr").to be_an_existing_file
|
23
|
+
expect("perfmonger.pgr.gz").to be_an_existing_file
|
25
24
|
end
|
26
25
|
end
|
data/spec/perfmonger_spec.rb
CHANGED
data/spec/play_spec.rb
CHANGED
data/spec/plot_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
# TODO: examples for options
|
4
4
|
|
5
|
-
describe '[plot] subcommand' do
|
5
|
+
RSpec.describe '[plot] subcommand' do
|
6
6
|
let(:busy100_disk_dat) {
|
7
7
|
File.read(data_file "busy100.pgr.plot-formatted.disk.dat")
|
8
8
|
}
|
@@ -74,4 +74,19 @@ describe '[plot] subcommand' do
|
|
74
74
|
expect("disk.dat").to have_file_content busy100_disk_dat
|
75
75
|
expect("cpu.dat").to have_file_content busy100_cpu_dat
|
76
76
|
end
|
77
|
+
|
78
|
+
it "should work with --disk-only option" do
|
79
|
+
busy100 = data_file "busy100.pgr.gz"
|
80
|
+
|
81
|
+
cmd = "#{perfmonger_bin} plot --save #{busy100} --disk-only sda1"
|
82
|
+
|
83
|
+
run(cmd, 30)
|
84
|
+
|
85
|
+
expect(last_command_started).to be_successfully_executed
|
86
|
+
|
87
|
+
disk_dat = File.expand_path("disk.dat", last_command_started.working_directory)
|
88
|
+
total_write_iops = `cat #{disk_dat}|grep total -A 2|tail -n1|awk '{print $3}'`.to_f
|
89
|
+
|
90
|
+
expect(total_write_iops).to be_within(1.67).of(0.01)
|
91
|
+
end
|
77
92
|
end
|
data/spec/record_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe '[record] subcommand' do
|
3
|
+
RSpec.describe '[record] subcommand' do
|
4
4
|
before(:each) do
|
5
5
|
skip_if_proc_is_not_available
|
6
6
|
end
|
@@ -9,7 +9,16 @@ describe '[record] subcommand' do
|
|
9
9
|
cmd = "#{perfmonger_bin} record --timeout 1"
|
10
10
|
run(cmd)
|
11
11
|
expect(last_command_started).to be_successfully_executed
|
12
|
+
expect("perfmonger.pgr.gz").to be_an_existing_file # default file name
|
13
|
+
expect(last_command_started.stdout).to be_empty
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should create a non-gzipped logfile' do
|
17
|
+
cmd = "#{perfmonger_bin} record --timeout 1 --no-gzip"
|
18
|
+
run(cmd)
|
19
|
+
expect(last_command_started).to be_successfully_executed
|
12
20
|
expect("perfmonger.pgr").to be_an_existing_file # default file name
|
13
21
|
expect(last_command_started.stdout).to be_empty
|
14
22
|
end
|
23
|
+
|
15
24
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -19,15 +19,40 @@ def data_file(rel_path)
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def perfmonger_bin
|
22
|
-
File.expand_path('../../
|
22
|
+
File.expand_path('../../exe/perfmonger', __FILE__)
|
23
23
|
end
|
24
24
|
|
25
25
|
RSpec.configure do |config|
|
26
|
-
|
26
|
+
config.expect_with :rspec do |expectations|
|
27
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
28
|
+
end
|
29
|
+
|
30
|
+
config.mock_with :rspec do |mocks|
|
31
|
+
mocks.verify_partial_doubles = true
|
32
|
+
end
|
33
|
+
|
34
|
+
config.shared_context_metadata_behavior = :apply_to_host_groups
|
35
|
+
|
36
|
+
config.filter_run_when_matching :focus
|
37
|
+
|
38
|
+
config.example_status_persistence_file_path = "spec/examples.txt"
|
39
|
+
|
40
|
+
config.disable_monkey_patching!
|
41
|
+
|
42
|
+
config.warnings = true
|
43
|
+
|
44
|
+
if config.files_to_run.one?
|
45
|
+
config.default_formatter = "doc"
|
46
|
+
end
|
47
|
+
|
48
|
+
config.profile_examples = 10
|
49
|
+
|
50
|
+
config.order = :random
|
51
|
+
# Kernel.srand config.seed
|
27
52
|
end
|
28
53
|
|
29
54
|
def skip_if_proc_is_not_available
|
30
|
-
if ! File.
|
55
|
+
if ! File.exist?("/proc/diskstats")
|
31
56
|
skip "/proc/diskstats is not available."
|
32
57
|
end
|
33
58
|
end
|
data/spec/stat_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
-
describe '[stat] subcommand' do
|
4
|
+
RSpec.describe '[stat] subcommand' do
|
5
5
|
before(:each) do
|
6
6
|
skip_if_proc_is_not_available
|
7
7
|
end
|
@@ -10,6 +10,6 @@ describe '[stat] subcommand' do
|
|
10
10
|
cmd = "#{perfmonger_bin} stat -- sleep 1"
|
11
11
|
run(cmd)
|
12
12
|
expect(last_command_started).to be_successfully_executed
|
13
|
-
expect("perfmonger.pgr").to be_an_existing_file
|
13
|
+
expect("perfmonger.pgr.gz").to be_an_existing_file
|
14
14
|
end
|
15
15
|
end
|