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.
Files changed (40) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +6 -9
  3. data/NEWS +36 -0
  4. data/README.md +1 -1
  5. data/Rakefile +20 -7
  6. data/core/Makefile +26 -19
  7. data/core/build.sh +5 -7
  8. data/core/{perfmonger-player.go → cmd/perfmonger-player/perfmonger-player.go} +53 -10
  9. data/core/{perfmonger-plot-formatter.go → cmd/perfmonger-plot-formatter/perfmonger-plot-formatter.go} +2 -1
  10. data/core/{perfmonger-recorder.go → cmd/perfmonger-recorder/perfmonger-recorder.go} +6 -0
  11. data/core/{perfmonger-summarizer.go → cmd/perfmonger-summarizer/perfmonger-summarizer.go} +4 -2
  12. data/core/cmd/perfmonger-viewer/perfmonger-viewer.go +164 -0
  13. data/core/go.mod +10 -0
  14. data/core/go.sum +17 -0
  15. data/core/subsystem/Makefile +4 -0
  16. data/core/subsystem/perfmonger_linux.go +95 -0
  17. data/core/subsystem/perfmonger_linux_test.go +40 -0
  18. data/core/subsystem/stat.go +70 -0
  19. data/core/subsystem/stat_test.go +9 -0
  20. data/core/subsystem/usage.go +80 -0
  21. data/core/utils.go +2 -2
  22. data/lib/exec/perfmonger-player_darwin_amd64 +0 -0
  23. data/lib/exec/perfmonger-player_linux_amd64 +0 -0
  24. data/lib/exec/perfmonger-plot-formatter_darwin_amd64 +0 -0
  25. data/lib/exec/perfmonger-plot-formatter_linux_amd64 +0 -0
  26. data/lib/exec/perfmonger-recorder_darwin_amd64 +0 -0
  27. data/lib/exec/perfmonger-recorder_linux_amd64 +0 -0
  28. data/lib/exec/perfmonger-summarizer_darwin_amd64 +0 -0
  29. data/lib/exec/perfmonger-summarizer_linux_amd64 +0 -0
  30. data/lib/exec/perfmonger-viewer_darwin_amd64 +0 -0
  31. data/lib/exec/perfmonger-viewer_linux_amd64 +0 -0
  32. data/lib/perfmonger/command/play.rb +10 -0
  33. data/lib/perfmonger/command/plot.rb +9 -1
  34. data/lib/perfmonger/command/record.rb +23 -2
  35. data/lib/perfmonger/command/record_option.rb +16 -0
  36. data/lib/perfmonger/version.rb +1 -1
  37. data/misc/werker-box/Dockerfile +16 -17
  38. data/misc/werker-box/build-push.sh +4 -2
  39. data/wercker.yml +12 -30
  40. metadata +13 -26
@@ -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
  }
@@ -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 main
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 newPerfmongerLogReader(source io.Reader) io.Reader {
9
+ func NewPerfmongerLogReader(source io.Reader) io.Reader {
10
10
  var ret io.Reader
11
11
  reader := bufio.NewReader(source)
12
12
 
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
- return true
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-recorder is running."
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
@@ -1,3 +1,3 @@
1
1
  module PerfMonger
2
- VERSION = "0.11.1"
2
+ VERSION = "0.13.1"
3
3
  end
@@ -1,35 +1,34 @@
1
- FROM golang:1.8
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 curl -sSL https://get.rvm.io | bash -s stable
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 1.9.3"
18
- RUN bash -l -c "rvm use 1.9.3 && gem install bundler && bundle"
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.0.0"
21
- RUN bash -l -c "rvm use 2.0.0 && gem install bundler && bundle"
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.1.10"
24
- RUN bash -l -c "rvm use 2.1.10 && gem install bundler && bundle"
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.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"
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
@@ -1,5 +1,7 @@
1
1
  #!/bin/bash
2
2
 
3
+ set -e
4
+
3
5
  docker build -t go-rvm .
4
- docker tag go-rvm hayamiz/go-rvm:wercker-env
5
- docker push hayamiz/go-rvm:wercker-env
6
+ docker tag go-rvm hayamiz/go-rvm:wercker-env-0.11.2
7
+ docker push hayamiz/go-rvm:wercker-env-0.11.2
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: switch ruby to 1.9.3
9
+ name: prepare perfmonger go subsystem
10
10
  code: |
11
11
  source /etc/profile.d/rvm.sh
12
- rvm use 1.9.3
13
- - bundle-install
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.0.0
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.1.10
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.2.5
28
+ name: switch ruby to 2.5.7
47
29
  code: |
48
30
  source /etc/profile.d/rvm.sh
49
- rvm use 2.2.5
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.3.1
40
+ name: switch ruby to 2.6.5
59
41
  code: |
60
42
  source /etc/profile.d/rvm.sh
61
- rvm use 2.3.1
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.4.0
52
+ name: switch ruby to 2.7.0
71
53
  code: |
72
54
  source /etc/profile.d/rvm.sh
73
- rvm use 2.4.0
55
+ rvm use 2.7.0
74
56
  - bundle-install
75
57
  - script:
76
58
  name: run rspec