perfmonger 0.11.1 → 0.13.1

Sign up to get free protection for your applications and to get access to all the features.
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