perfmonger 0.10.2 → 0.11.0
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.
- 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
|