perfmonger 0.11.1 → 0.13.1
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 +5 -5
- data/.travis.yml +6 -9
- data/NEWS +36 -0
- data/README.md +1 -1
- data/Rakefile +20 -7
- data/core/Makefile +26 -19
- data/core/build.sh +5 -7
- data/core/{perfmonger-player.go → cmd/perfmonger-player/perfmonger-player.go} +53 -10
- data/core/{perfmonger-plot-formatter.go → cmd/perfmonger-plot-formatter/perfmonger-plot-formatter.go} +2 -1
- data/core/{perfmonger-recorder.go → cmd/perfmonger-recorder/perfmonger-recorder.go} +6 -0
- data/core/{perfmonger-summarizer.go → cmd/perfmonger-summarizer/perfmonger-summarizer.go} +4 -2
- data/core/cmd/perfmonger-viewer/perfmonger-viewer.go +164 -0
- data/core/go.mod +10 -0
- data/core/go.sum +17 -0
- data/core/subsystem/Makefile +4 -0
- data/core/subsystem/perfmonger_linux.go +95 -0
- data/core/subsystem/perfmonger_linux_test.go +40 -0
- data/core/subsystem/stat.go +70 -0
- data/core/subsystem/stat_test.go +9 -0
- data/core/subsystem/usage.go +80 -0
- data/core/utils.go +2 -2
- data/lib/exec/perfmonger-player_darwin_amd64 +0 -0
- data/lib/exec/perfmonger-player_linux_amd64 +0 -0
- data/lib/exec/perfmonger-plot-formatter_darwin_amd64 +0 -0
- data/lib/exec/perfmonger-plot-formatter_linux_amd64 +0 -0
- data/lib/exec/perfmonger-recorder_darwin_amd64 +0 -0
- data/lib/exec/perfmonger-recorder_linux_amd64 +0 -0
- data/lib/exec/perfmonger-summarizer_darwin_amd64 +0 -0
- data/lib/exec/perfmonger-summarizer_linux_amd64 +0 -0
- data/lib/exec/perfmonger-viewer_darwin_amd64 +0 -0
- data/lib/exec/perfmonger-viewer_linux_amd64 +0 -0
- data/lib/perfmonger/command/play.rb +10 -0
- data/lib/perfmonger/command/plot.rb +9 -1
- data/lib/perfmonger/command/record.rb +23 -2
- data/lib/perfmonger/command/record_option.rb +16 -0
- data/lib/perfmonger/version.rb +1 -1
- data/misc/werker-box/Dockerfile +16 -17
- data/misc/werker-box/build-push.sh +4 -2
- data/wercker.yml +12 -30
- metadata +13 -26
data/core/subsystem/stat_test.go
CHANGED
@@ -262,6 +262,14 @@ func TestNewNetStat(t *testing.T) {
|
|
262
262
|
}
|
263
263
|
}
|
264
264
|
|
265
|
+
func TestNewMemStat(t *testing.T) {
|
266
|
+
memstat := NewMemStat()
|
267
|
+
|
268
|
+
if memstat == nil {
|
269
|
+
t.Error("failed to create MemStat")
|
270
|
+
}
|
271
|
+
}
|
272
|
+
|
265
273
|
func TestNewStatRecord(t *testing.T) {
|
266
274
|
stat_record := NewStatRecord()
|
267
275
|
|
@@ -278,4 +286,5 @@ func TestNewStatRecord(t *testing.T) {
|
|
278
286
|
checkFieldIsNil("Disk")
|
279
287
|
checkFieldIsNil("Softirq")
|
280
288
|
checkFieldIsNil("Net")
|
289
|
+
checkFieldIsNil("Mem")
|
281
290
|
}
|
data/core/subsystem/usage.go
CHANGED
@@ -85,6 +85,10 @@ type NetUsageEntry struct {
|
|
85
85
|
|
86
86
|
type NetUsage map[string]*NetUsageEntry
|
87
87
|
|
88
|
+
type MemUsage struct {
|
89
|
+
mem *MemStat
|
90
|
+
}
|
91
|
+
|
88
92
|
var UseColor = false
|
89
93
|
|
90
94
|
func SetUseColor(use_color bool) {
|
@@ -562,6 +566,82 @@ func (nusage *NetUsage) WriteJsonTo(printer *projson.JsonPrinter) {
|
|
562
566
|
printer.FinishObject()
|
563
567
|
}
|
564
568
|
|
569
|
+
func GetMemUsage(mem *MemStat) (*MemUsage, error) {
|
570
|
+
if mem == nil {
|
571
|
+
return nil, errors.New("invalid memstat")
|
572
|
+
}
|
573
|
+
|
574
|
+
musage := new(MemUsage)
|
575
|
+
musage.mem = mem
|
576
|
+
|
577
|
+
return musage, nil
|
578
|
+
}
|
579
|
+
|
580
|
+
func (musage *MemUsage) WriteJsonTo(printer *projson.JsonPrinter) {
|
581
|
+
printer.BeginObject()
|
582
|
+
|
583
|
+
printer.PutKey("mem_total")
|
584
|
+
printer.PutInt64(musage.mem.MemTotal)
|
585
|
+
printer.PutKey("mem_used")
|
586
|
+
printer.PutInt64(musage.mem.MemTotal - musage.mem.MemFree - musage.mem.Buffers - musage.mem.Cached - musage.mem.SReclaimable)
|
587
|
+
printer.PutKey("mem_free")
|
588
|
+
printer.PutInt64(musage.mem.MemFree)
|
589
|
+
printer.PutKey("buffers")
|
590
|
+
printer.PutInt64(musage.mem.Buffers)
|
591
|
+
printer.PutKey("cached")
|
592
|
+
printer.PutInt64(musage.mem.Cached)
|
593
|
+
printer.PutKey("swap_cached")
|
594
|
+
printer.PutInt64(musage.mem.SwapCached)
|
595
|
+
printer.PutKey("active")
|
596
|
+
printer.PutInt64(musage.mem.Active)
|
597
|
+
printer.PutKey("inactive")
|
598
|
+
printer.PutInt64(musage.mem.Inactive)
|
599
|
+
printer.PutKey("swap_total")
|
600
|
+
printer.PutInt64(musage.mem.SwapTotal)
|
601
|
+
printer.PutKey("swap_free")
|
602
|
+
printer.PutInt64(musage.mem.SwapFree)
|
603
|
+
printer.PutKey("dirty")
|
604
|
+
printer.PutInt64(musage.mem.Dirty)
|
605
|
+
printer.PutKey("writeback")
|
606
|
+
printer.PutInt64(musage.mem.Writeback)
|
607
|
+
printer.PutKey("anon_pages")
|
608
|
+
printer.PutInt64(musage.mem.AnonPages)
|
609
|
+
printer.PutKey("mapped")
|
610
|
+
printer.PutInt64(musage.mem.Mapped)
|
611
|
+
printer.PutKey("shmem")
|
612
|
+
printer.PutInt64(musage.mem.Shmem)
|
613
|
+
printer.PutKey("slab")
|
614
|
+
printer.PutInt64(musage.mem.Slab)
|
615
|
+
printer.PutKey("s_reclaimable")
|
616
|
+
printer.PutInt64(musage.mem.SReclaimable)
|
617
|
+
printer.PutKey("s_unreclaim")
|
618
|
+
printer.PutInt64(musage.mem.SUnreclaim)
|
619
|
+
printer.PutKey("kernel_stack")
|
620
|
+
printer.PutInt64(musage.mem.KernelStack)
|
621
|
+
printer.PutKey("page_tables")
|
622
|
+
printer.PutInt64(musage.mem.PageTables)
|
623
|
+
printer.PutKey("nfs_unstable")
|
624
|
+
printer.PutInt64(musage.mem.NFS_Unstable)
|
625
|
+
printer.PutKey("bounce")
|
626
|
+
printer.PutInt64(musage.mem.Bounce)
|
627
|
+
printer.PutKey("commit_limit")
|
628
|
+
printer.PutInt64(musage.mem.CommitLimit)
|
629
|
+
printer.PutKey("committed_as")
|
630
|
+
printer.PutInt64(musage.mem.Committed_AS)
|
631
|
+
printer.PutKey("anon_huge_pages")
|
632
|
+
printer.PutInt64(musage.mem.AnonHugePages)
|
633
|
+
printer.PutKey("huge_pages_total")
|
634
|
+
printer.PutInt64(musage.mem.HugePages_Total)
|
635
|
+
printer.PutKey("huge_pages_free")
|
636
|
+
printer.PutInt64(musage.mem.HugePages_Free)
|
637
|
+
printer.PutKey("huge_pages_rsvd")
|
638
|
+
printer.PutInt64(musage.mem.HugePages_Rsvd)
|
639
|
+
printer.PutKey("huge_pages_surp")
|
640
|
+
printer.PutInt64(musage.mem.HugePages_Surp)
|
641
|
+
|
642
|
+
printer.FinishObject()
|
643
|
+
}
|
644
|
+
|
565
645
|
func (entry *NetUsageEntry) WriteJsonTo(printer *projson.JsonPrinter) {
|
566
646
|
printer.BeginObject()
|
567
647
|
|
data/core/utils.go
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
package
|
1
|
+
package core
|
2
2
|
|
3
3
|
import (
|
4
4
|
"bufio"
|
@@ -6,7 +6,7 @@ import (
|
|
6
6
|
"io"
|
7
7
|
)
|
8
8
|
|
9
|
-
func
|
9
|
+
func NewPerfmongerLogReader(source io.Reader) io.Reader {
|
10
10
|
var ret io.Reader
|
11
11
|
reader := bufio.NewReader(source)
|
12
12
|
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -26,6 +26,10 @@ EOS
|
|
26
26
|
@pretty = true
|
27
27
|
end
|
28
28
|
|
29
|
+
@disk_only_regex = nil
|
30
|
+
@parser.on('--disk-only REGEX', "Select disk devices that matches REGEX (Ex. 'sd[b-d]')") do |regex|
|
31
|
+
@disk_only_regex = regex
|
32
|
+
end
|
29
33
|
end
|
30
34
|
|
31
35
|
def parse_args(argv)
|
@@ -62,6 +66,12 @@ EOS
|
|
62
66
|
if @pretty
|
63
67
|
cmd << "-pretty"
|
64
68
|
end
|
69
|
+
|
70
|
+
if @disk_only_regex
|
71
|
+
cmd << "-disk-only"
|
72
|
+
cmd << @disk_only_regex
|
73
|
+
end
|
74
|
+
|
65
75
|
cmd << @logfile
|
66
76
|
|
67
77
|
Process.exec(*cmd)
|
@@ -30,6 +30,7 @@ EOS
|
|
30
30
|
@disk_plot_write = true
|
31
31
|
@disk_numkey_threshold = 10
|
32
32
|
@plot_iops_max = nil
|
33
|
+
@gnuplot_bin = `which gnuplot`
|
33
34
|
end
|
34
35
|
|
35
36
|
def parse_args(argv)
|
@@ -47,6 +48,10 @@ EOS
|
|
47
48
|
@output_dir = dir
|
48
49
|
end
|
49
50
|
|
51
|
+
@parser.on('--with-gnuplot GNUPLOT_BIN') do |gnuplot_bin|
|
52
|
+
@gnuplot_bin = gnuplot_bin
|
53
|
+
end
|
54
|
+
|
50
55
|
@parser.on('-T', '--output-type TYPE', 'Available: pdf, png') do |typ|
|
51
56
|
unless ['pdf', 'png'].include?(typ)
|
52
57
|
puts("ERROR: non supported image type: #{typ}")
|
@@ -119,13 +124,14 @@ EOS
|
|
119
124
|
end
|
120
125
|
|
121
126
|
def run(argv)
|
122
|
-
parse_args(argv)
|
123
127
|
unless system('which gnuplot >/dev/null 2>&1')
|
124
128
|
puts("ERROR: gnuplot not found")
|
125
129
|
puts(@parser.help)
|
126
130
|
exit(false)
|
127
131
|
end
|
128
132
|
|
133
|
+
parse_args(argv)
|
134
|
+
|
129
135
|
unless system('gnuplot -e "set terminal" < /dev/null 2>&1 | grep pdfcairo >/dev/null 2>&1')
|
130
136
|
puts("ERROR: pdfcairo is not supported by installed gnuplot")
|
131
137
|
puts("ERROR: PerfMonger requires pdfcairo-supported gnuplot")
|
@@ -159,6 +165,8 @@ EOS
|
|
159
165
|
plot_disk(meta)
|
160
166
|
plot_cpu(meta)
|
161
167
|
|
168
|
+
FileUtils.rm_rf(@tmpdir)
|
169
|
+
|
162
170
|
true
|
163
171
|
end
|
164
172
|
|
@@ -31,7 +31,8 @@ class RecordCommand < BaseCommand
|
|
31
31
|
if @option.kill
|
32
32
|
unless session_pid
|
33
33
|
# There is nothing to be killed
|
34
|
-
|
34
|
+
$stderr.puts("[ERROR] No perfmonger record session is running.")
|
35
|
+
return false
|
35
36
|
end
|
36
37
|
|
37
38
|
begin
|
@@ -44,12 +45,32 @@ class RecordCommand < BaseCommand
|
|
44
45
|
f.flock(File::LOCK_UN)
|
45
46
|
end
|
46
47
|
end
|
48
|
+
|
49
|
+
# wait until the process surely exits
|
50
|
+
sleeptime = 0.05
|
51
|
+
try = 0
|
52
|
+
while true
|
53
|
+
begin
|
54
|
+
Process.kill(:INT, session_pid)
|
55
|
+
rescue Errno::ESRCH
|
56
|
+
# no such process
|
57
|
+
break
|
58
|
+
end
|
59
|
+
sleep(sleeptime)
|
60
|
+
sleeptime *= 2
|
61
|
+
try += 1
|
62
|
+
if try >= 5
|
63
|
+
$stderr.puts("[ERROR] Cannot stop perfmonger record session correctly. PID=#{session_pid}")
|
64
|
+
return false
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
47
68
|
return true
|
48
69
|
end
|
49
70
|
|
50
71
|
if @option.status
|
51
72
|
unless session_pid
|
52
|
-
puts "[ERROR] No perfmonger
|
73
|
+
puts "[ERROR] No perfmonger record session is running."
|
53
74
|
return false
|
54
75
|
end
|
55
76
|
|
@@ -63,6 +63,12 @@ class RecordOption
|
|
63
63
|
if @no_intr
|
64
64
|
cmd << "-no-intr"
|
65
65
|
end
|
66
|
+
if @no_net
|
67
|
+
cmd << "-no-net"
|
68
|
+
end
|
69
|
+
if @no_mem
|
70
|
+
cmd << "-no-mem"
|
71
|
+
end
|
66
72
|
if @devices.size > 0
|
67
73
|
cmd << "-disks"
|
68
74
|
cmd << @devices.join(",")
|
@@ -98,6 +104,8 @@ class RecordOption
|
|
98
104
|
@no_cpu = false
|
99
105
|
@no_disk = false
|
100
106
|
@no_intr = true
|
107
|
+
@no_net = true
|
108
|
+
@no_mem = false
|
101
109
|
@devices = []
|
102
110
|
@logfile = "perfmonger.pgr"
|
103
111
|
@logfile_set = false
|
@@ -141,6 +149,14 @@ class RecordOption
|
|
141
149
|
@no_cpu = true
|
142
150
|
end
|
143
151
|
|
152
|
+
@parser.on('--no-net', 'Suppress recording network usage') do
|
153
|
+
@no_net = false
|
154
|
+
end
|
155
|
+
|
156
|
+
@parser.on('--no-mem', 'Suppress recording memory usage') do
|
157
|
+
@no_mem = true
|
158
|
+
end
|
159
|
+
|
144
160
|
@parser.on('-l', '--logfile FILE') do |file|
|
145
161
|
@logfile = file
|
146
162
|
@logfile_set = true
|
data/lib/perfmonger/version.rb
CHANGED
data/misc/werker-box/Dockerfile
CHANGED
@@ -1,35 +1,34 @@
|
|
1
|
-
FROM golang:1.
|
1
|
+
FROM golang:1.14
|
2
2
|
|
3
3
|
WORKDIR /app
|
4
4
|
|
5
5
|
## install packages
|
6
6
|
RUN apt-get update
|
7
|
-
RUN apt-get install -y build-essential libncurses-dev libreadline-dev libssl-dev gnuplot git
|
7
|
+
RUN apt-get install -y build-essential libncurses-dev libreadline-dev libssl-dev gnuplot git gnupg2
|
8
|
+
RUN apt-get install -y autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev gawk libsqlite3-dev libtool sqlite3 libgmp-dev # ruby build dep
|
8
9
|
|
9
10
|
## get source code
|
10
11
|
RUN git clone https://github.com/hayamiz/perfmonger .
|
11
12
|
|
12
13
|
## install RVM
|
13
|
-
RUN
|
14
|
+
RUN gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
|
15
|
+
RUN curl -O https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer
|
16
|
+
RUN curl -O https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer.asc
|
17
|
+
RUN gpg --verify rvm-installer.asc
|
18
|
+
RUN bash rvm-installer stable
|
14
19
|
RUN ln -sf /bin/bash /bin/sh
|
15
20
|
|
16
21
|
## install ruby
|
17
|
-
RUN bash -l -c "rvm install
|
18
|
-
RUN bash -l -c "rvm use
|
22
|
+
RUN bash -l -c "rvm install 2.4.9"
|
23
|
+
RUN bash -l -c "rvm use 2.4.9 && gem install bundler && bundle"
|
19
24
|
|
20
|
-
RUN bash -l -c "rvm install 2.
|
21
|
-
RUN bash -l -c "rvm use 2.
|
25
|
+
RUN bash -l -c "rvm install 2.5.7"
|
26
|
+
RUN bash -l -c "rvm use 2.5.7 && gem install bundler && bundle"
|
22
27
|
|
23
|
-
RUN bash -l -c "rvm install 2.
|
24
|
-
RUN bash -l -c "rvm use 2.
|
28
|
+
RUN bash -l -c "rvm install 2.6.5"
|
29
|
+
RUN bash -l -c "rvm use 2.6.5 && gem install bundler && bundle"
|
25
30
|
|
26
|
-
RUN bash -l -c "rvm install 2.
|
27
|
-
RUN bash -l -c "rvm use 2.
|
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"
|
31
|
+
RUN bash -l -c "rvm install 2.7.0"
|
32
|
+
RUN bash -l -c "rvm use 2.7.0 && gem install bundler && bundle"
|
34
33
|
|
35
34
|
CMD true
|
data/wercker.yml
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
box: hayamiz/go-rvm:wercker-env
|
1
|
+
box: hayamiz/go-rvm:wercker-env-0.11.2
|
2
2
|
# Build definition
|
3
3
|
build:
|
4
4
|
# The steps that will be executed on build
|
@@ -6,35 +6,17 @@ build:
|
|
6
6
|
# http://devcenter.wercker.com/articles/languages/ruby.html
|
7
7
|
steps:
|
8
8
|
- script:
|
9
|
-
name:
|
9
|
+
name: prepare perfmonger go subsystem
|
10
10
|
code: |
|
11
11
|
source /etc/profile.d/rvm.sh
|
12
|
-
rvm use
|
13
|
-
|
14
|
-
- script:
|
15
|
-
name: run rspec
|
16
|
-
code: |
|
17
|
-
bundle exec rake clean
|
18
|
-
bundle exec rake go_get
|
19
|
-
bundle exec rake spec
|
12
|
+
rvm use 2.4.9
|
13
|
+
rake go_get
|
20
14
|
|
21
15
|
- script:
|
22
|
-
name: switch ruby to 2.
|
23
|
-
code: |
|
24
|
-
source /etc/profile.d/rvm.sh
|
25
|
-
rvm use 2.0.0
|
26
|
-
- bundle-install
|
27
|
-
- script:
|
28
|
-
name: run rspec
|
29
|
-
code: |
|
30
|
-
bundle exec rake clean
|
31
|
-
bundle exec rake spec
|
32
|
-
- script:
|
33
|
-
name: switch ruby to 2.1.10
|
16
|
+
name: switch ruby to 2.4.9
|
34
17
|
code: |
|
35
|
-
|
36
18
|
source /etc/profile.d/rvm.sh
|
37
|
-
rvm use 2.
|
19
|
+
rvm use 2.4.9
|
38
20
|
- bundle-install
|
39
21
|
- script:
|
40
22
|
name: run rspec
|
@@ -43,10 +25,10 @@ build:
|
|
43
25
|
bundle exec rake spec
|
44
26
|
|
45
27
|
- script:
|
46
|
-
name: switch ruby to 2.
|
28
|
+
name: switch ruby to 2.5.7
|
47
29
|
code: |
|
48
30
|
source /etc/profile.d/rvm.sh
|
49
|
-
rvm use 2.
|
31
|
+
rvm use 2.5.7
|
50
32
|
- bundle-install
|
51
33
|
- script:
|
52
34
|
name: run rspec
|
@@ -55,10 +37,10 @@ build:
|
|
55
37
|
bundle exec rake spec
|
56
38
|
|
57
39
|
- script:
|
58
|
-
name: switch ruby to 2.
|
40
|
+
name: switch ruby to 2.6.5
|
59
41
|
code: |
|
60
42
|
source /etc/profile.d/rvm.sh
|
61
|
-
rvm use 2.
|
43
|
+
rvm use 2.6.5
|
62
44
|
- bundle-install
|
63
45
|
- script:
|
64
46
|
name: run rspec
|
@@ -67,10 +49,10 @@ build:
|
|
67
49
|
bundle exec rake spec
|
68
50
|
|
69
51
|
- script:
|
70
|
-
name: switch ruby to 2.
|
52
|
+
name: switch ruby to 2.7.0
|
71
53
|
code: |
|
72
54
|
source /etc/profile.d/rvm.sh
|
73
|
-
rvm use 2.
|
55
|
+
rvm use 2.7.0
|
74
56
|
- bundle-install
|
75
57
|
- script:
|
76
58
|
name: run rspec
|