perfmonger 0.6.1 → 0.7.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.
Files changed (87) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +6 -0
  3. data/.tachikoma.yml +1 -0
  4. data/.travis.yml +18 -6
  5. data/Gemfile +1 -3
  6. data/Guardfile +26 -0
  7. data/NEWS +21 -0
  8. data/README.md +8 -9
  9. data/Rakefile +33 -1
  10. data/core/Makefile +23 -0
  11. data/core/build.sh +48 -0
  12. data/core/perfmonger-player.go +165 -0
  13. data/core/perfmonger-recorder.go +296 -0
  14. data/core/perfmonger-summarizer.go +207 -0
  15. data/core/subsystem/Makefile +3 -0
  16. data/core/subsystem/perfmonger.go +60 -0
  17. data/core/subsystem/perfmonger_darwin.go +22 -0
  18. data/core/subsystem/perfmonger_linux.go +292 -0
  19. data/core/subsystem/perfmonger_linux_test.go +73 -0
  20. data/core/subsystem/stat.go +214 -0
  21. data/core/subsystem/stat_test.go +281 -0
  22. data/core/subsystem/usage.go +410 -0
  23. data/core/subsystem/usage_test.go +496 -0
  24. data/lib/exec/operationBinding.rb.svn-base +59 -0
  25. data/lib/exec/perfmonger-player_darwin_amd64 +0 -0
  26. data/lib/exec/perfmonger-player_linux_386 +0 -0
  27. data/lib/exec/perfmonger-player_linux_amd64 +0 -0
  28. data/lib/exec/perfmonger-recorder_darwin_amd64 +0 -0
  29. data/lib/exec/perfmonger-recorder_linux_386 +0 -0
  30. data/lib/exec/perfmonger-recorder_linux_amd64 +0 -0
  31. data/lib/exec/perfmonger-summarizer_darwin_amd64 +0 -0
  32. data/lib/exec/perfmonger-summarizer_linux_386 +0 -0
  33. data/lib/exec/perfmonger-summarizer_linux_amd64 +0 -0
  34. data/lib/exec/perfmonger-summary_linux_386 +0 -0
  35. data/lib/exec/perfmonger-summary_linux_amd64 +0 -0
  36. data/lib/perfmonger/cli.rb +8 -3
  37. data/lib/perfmonger/command/core.rb +62 -0
  38. data/lib/perfmonger/command/live.rb +39 -0
  39. data/lib/perfmonger/command/play.rb +56 -0
  40. data/lib/perfmonger/command/plot.rb +30 -22
  41. data/lib/perfmonger/command/record.rb +3 -2
  42. data/lib/perfmonger/command/record_option.rb +40 -59
  43. data/lib/perfmonger/command/server.rb +7 -2
  44. data/lib/perfmonger/command/stat.rb +2 -2
  45. data/lib/perfmonger/command/stat_option.rb +1 -1
  46. data/lib/perfmonger/command/summary.rb +11 -326
  47. data/lib/perfmonger/version.rb +1 -3
  48. data/lib/perfmonger.rb +3 -0
  49. data/misc/_perfmonger +128 -0
  50. data/misc/perfmonger-completion.bash +49 -0
  51. data/perfmonger.gemspec +6 -5
  52. data/spec/data/busy100.pgr +0 -0
  53. data/spec/fingerprint_spec.rb +35 -0
  54. data/spec/live_spec.rb +25 -0
  55. data/spec/perfmonger_spec.rb +37 -0
  56. data/spec/play_spec.rb +21 -0
  57. data/spec/plot_spec.rb +42 -0
  58. data/spec/record_spec.rb +15 -0
  59. data/spec/spec_helper.rb +33 -0
  60. data/spec/stat_spec.rb +15 -0
  61. data/spec/summary_spec.rb +51 -0
  62. data/spec/support/aruba.rb +11 -0
  63. data/wercker.yml +59 -0
  64. metadata +117 -45
  65. data/ext/perfmonger/extconf.rb +0 -19
  66. data/ext/perfmonger/perfmonger.h +0 -58
  67. data/ext/perfmonger/perfmonger_record.c +0 -754
  68. data/ext/perfmonger/sysstat/common.c +0 -627
  69. data/ext/perfmonger/sysstat/common.h +0 -207
  70. data/ext/perfmonger/sysstat/ioconf.c +0 -515
  71. data/ext/perfmonger/sysstat/ioconf.h +0 -84
  72. data/ext/perfmonger/sysstat/iostat.c +0 -1100
  73. data/ext/perfmonger/sysstat/iostat.h +0 -121
  74. data/ext/perfmonger/sysstat/libsysstat.h +0 -19
  75. data/ext/perfmonger/sysstat/mpstat.c +0 -953
  76. data/ext/perfmonger/sysstat/mpstat.h +0 -79
  77. data/ext/perfmonger/sysstat/rd_stats.c +0 -2388
  78. data/ext/perfmonger/sysstat/rd_stats.h +0 -651
  79. data/ext/perfmonger/sysstat/sysconfig.h +0 -13
  80. data/test/run-test.sh +0 -39
  81. data/test/spec/bin_spec.rb +0 -37
  82. data/test/spec/data/2devices.expected +0 -42
  83. data/test/spec/data/2devices.output +0 -42
  84. data/test/spec/spec_helper.rb +0 -20
  85. data/test/spec/summary_spec.rb +0 -193
  86. data/test/test-perfmonger.c +0 -145
  87. data/test/test.h +0 -9
@@ -1,37 +0,0 @@
1
-
2
- require 'spec_helper'
3
-
4
- describe "PerfmongerCommand" do
5
- before(:each) do
6
- @perfmonger_command = File.expand_path('../../src/perfmonger', __FILE__)
7
- end
8
-
9
- it "should be an executable" do
10
- File.executable?(@perfmonger_command).should be_true
11
- end
12
-
13
- it 'should print version number if --version specified' do
14
- `#{@perfmonger_command} --version`.should include(PerfMonger::VERSION)
15
- end
16
-
17
- describe 'stat subcommand' do
18
- it 'should print "Execution time: XXX.XXX"' do
19
- if File.exists?("/proc/diskstats")
20
- `#{@perfmonger_command} stat -- sleep 1`.should match(/^Execution time: (\d+)\.(\d+)$/)
21
- else
22
- # do nothing
23
- true.should be_true
24
- end
25
- end
26
- end
27
-
28
- describe 'summary subcommand' do
29
- it 'should print expected output with 2devices.log' do
30
- File.open(data_file('2devices.output'), "w") do |f|
31
- f.print(`#{@perfmonger_command} summary #{data_file('2devices.log')}`)
32
- end
33
-
34
- system("diff -u #{data_file('2devices.expected')} #{data_file('2devices.output')}").should be_true
35
- end
36
- end
37
- end
@@ -1,42 +0,0 @@
1
-
2
- == Performance summary of 'spec/data/2devices.log' ==
3
-
4
- record duration: 1.00 sec
5
-
6
- * Average CPU usage (MAX: 200 %)
7
- * Non idle portion: 200.00
8
- %usr: 0.00
9
- %sys: 200.00
10
- %irq: 0.00
11
- %soft: 0.00
12
- %other: 0.00
13
- * Idle portion: 0.00
14
- %iowait: 0.00
15
- %idle: 0.00
16
-
17
- * Average DEVICE usage: sda
18
- read IOPS: 1.00
19
- write IOPS: 0.00
20
- read throughput: 0.00 MB/s
21
- write throughput: 0.00 MB/s
22
- read latency: 53.00 msec
23
- write latency: 0.0 usec
24
- read amount: 512.00 bytes
25
- write amount: 0.00 bytes
26
-
27
- * Average DEVICE usage: sdb
28
- read IOPS: 0.00
29
- write IOPS: 0.00
30
- read throughput: 0.00 MB/s
31
- write throughput: 0.00 MB/s
32
- read latency: 0.0 usec
33
- write latency: 0.0 usec
34
- read amount: 0.00 bytes
35
- write amount: 0.00 bytes
36
-
37
- * TOTAL DEVICE usage: sda, sdb
38
- read IOPS: 1.00
39
- write IOPS: 0.00
40
- read throughput: 0.00 MB/s
41
- write throughput: 0.00 MB/s
42
-
@@ -1,42 +0,0 @@
1
-
2
- == Performance summary of 'spec/data/2devices.log' ==
3
-
4
- record duration: 1.00 sec
5
-
6
- * Average CPU usage (MAX: 200 %)
7
- * Non idle portion: 200.00
8
- %usr: 0.00
9
- %sys: 200.00
10
- %irq: 0.00
11
- %soft: 0.00
12
- %other: 0.00
13
- * Idle portion: 0.00
14
- %iowait: 0.00
15
- %idle: 0.00
16
-
17
- * Average DEVICE usage: sda
18
- read IOPS: 1.00
19
- write IOPS: 0.00
20
- read throughput: 0.00 MB/s
21
- write throughput: 0.00 MB/s
22
- read latency: 53.00 msec
23
- write latency: 0.0 usec
24
- read amount: 512.00 bytes
25
- write amount: 0.00 bytes
26
-
27
- * Average DEVICE usage: sdb
28
- read IOPS: 0.00
29
- write IOPS: 0.00
30
- read throughput: 0.00 MB/s
31
- write throughput: 0.00 MB/s
32
- read latency: 0.0 usec
33
- write latency: 0.0 usec
34
- read amount: 0.00 bytes
35
- write amount: 0.00 bytes
36
-
37
- * TOTAL DEVICE usage: sda, sdb
38
- read IOPS: 1.00
39
- write IOPS: 0.00
40
- read throughput: 0.00 MB/s
41
- write throughput: 0.00 MB/s
42
-
@@ -1,20 +0,0 @@
1
- # encoding: utf-8
2
-
3
- $LOAD_PATH << File.expand_path('../../src/ruby', __FILE__)
4
-
5
- TEST_DATA_DIR = File.expand_path('../data', __FILE__)
6
-
7
- require 'perfmonger'
8
- require 'tempfile'
9
- require 'pathname'
10
-
11
- def data_file(rel_path)
12
- from = Pathname.new(Dir.pwd)
13
- path = Pathname.new(File.expand_path(rel_path, TEST_DATA_DIR))
14
-
15
- path.relative_path_from(from).to_s
16
- end
17
-
18
- RSpec.configure do |config|
19
- # RSpec config here
20
- end
@@ -1,193 +0,0 @@
1
-
2
- require 'spec_helper'
3
-
4
- describe PerfMonger::Command::SummaryCommand do
5
- before(:each) do
6
- @summary = PerfMonger::Command::SummaryCommand.new
7
- @logfile = data_file('test.log')
8
- @logfile_2devices = data_file('2devices.log')
9
- end
10
-
11
- describe 'read_logfile method' do
12
- it 'should return 3 valid records' do
13
- records = @summary.read_logfile(@logfile)
14
- records.size.should == 3
15
- records.each do |record|
16
- record.should be_a Hash
17
- record.should include "time"
18
-
19
- record.should include "ioinfo"
20
- record["ioinfo"].should include "devices"
21
- record["ioinfo"]["devices"].should be_a Array
22
- record["ioinfo"]["devices"].should include "sda"
23
- record["ioinfo"].should include "sda"
24
- record["ioinfo"]["sda"].should be_a Hash
25
- record["ioinfo"]["sda"].should include "riops"
26
- record["ioinfo"]["sda"].should include "wiops"
27
- record["ioinfo"]["sda"].should include "rsecps"
28
- record["ioinfo"]["sda"].should include "wsecps"
29
- record["ioinfo"]["sda"].should include "r_await"
30
- record["ioinfo"]["sda"].should include "w_await"
31
-
32
- record.should include "cpuinfo"
33
- record["cpuinfo"].should be_a Hash
34
- record["cpuinfo"].should include "nr_cpu"
35
- record["cpuinfo"].should include "cpus"
36
- record["cpuinfo"].should include "all"
37
- end
38
- end
39
- end
40
-
41
- describe 'make_summary method' do
42
- before(:each) do
43
- @records = @summary.read_logfile(@logfile)
44
- end
45
-
46
- it 'should return nil for empty records' do
47
- @summary.make_summary([]).should be_nil
48
- end
49
-
50
- it 'should return valid format result' do
51
- summary = @summary.make_summary(@records)
52
-
53
- summary.should be_a Hash
54
- summary.should include "time"
55
-
56
- summary.should include "ioinfo"
57
- summary["ioinfo"].should include "devices"
58
- summary["ioinfo"]["devices"].should be_a Array
59
- summary["ioinfo"]["devices"].should include "sda"
60
- summary["ioinfo"].should include "sda"
61
- summary["ioinfo"]["sda"].should be_a Hash
62
- summary["ioinfo"]["sda"].should include "riops"
63
- summary["ioinfo"]["sda"].should include "wiops"
64
- summary["ioinfo"]["sda"].should include "rsecps"
65
- summary["ioinfo"]["sda"].should include "wsecps"
66
- summary["ioinfo"]["sda"].should include "r_await"
67
- summary["ioinfo"]["sda"].should include "w_await"
68
-
69
- summary.should include "cpuinfo"
70
- summary["cpuinfo"].should include "nr_cpu"
71
- summary["cpuinfo"].should include "cpus"
72
- summary["cpuinfo"].should include "all"
73
- cpu_entries = [summary["cpuinfo"]["all"], *summary["cpuinfo"]["cpus"]]
74
- cpu_entries.each do |entry|
75
- entry.should be_a Hash
76
- entry.should include "usr"
77
- entry.should include "nice"
78
- entry.should include "sys"
79
- entry.should include "iowait"
80
- entry.should include "irq"
81
- entry.should include "soft"
82
- entry.should include "steal"
83
- entry.should include "guest"
84
- entry.should include "idle"
85
- end
86
- end
87
-
88
- it 'should calculate avg. IOPS correctly against non-equal intervals' do
89
- @records[0]["time"] = 0.0
90
- @records[1]["time"] = 1.0
91
- @records[2]["time"] = 3.0
92
-
93
- @records[0]["ioinfo"]["sda"]["riops"] = 0.0 # no effect for result
94
- @records[1]["ioinfo"]["sda"]["riops"] = 3.0
95
- @records[2]["ioinfo"]["sda"]["riops"] = 6.0
96
-
97
- # avg. riops should be ((3.0 * 1.0 + 6.0 * 3.0) / 3.0) == 5.0
98
- summary = @summary.make_summary(@records)
99
-
100
- summary["ioinfo"]["sda"]["riops"].should be_within(5.0e-6).of(5.0)
101
- end
102
-
103
- it 'should return 0.0 for r_await if all values are zero' do
104
- @records[0]["ioinfo"]["sda"]["r_await"] = 0.0
105
- @records[1]["ioinfo"]["sda"]["r_await"] = 0.0
106
- @records[2]["ioinfo"]["sda"]["r_await"] = 0.0
107
-
108
- summary = @summary.make_summary(@records)
109
-
110
- summary["ioinfo"]["sda"]["r_await"].should == 0.0
111
- end
112
-
113
- it 'should calculate avg. r_await/w_await correctly' do
114
- @records[0]["ioinfo"]["sda"]["riops"] = 0.0
115
- @records[0]["ioinfo"]["sda"]["r_await"] = 0.0
116
- @records[1]["ioinfo"]["sda"]["riops"] = 100.0
117
- @records[1]["ioinfo"]["sda"]["r_await"] = 1.0
118
- @records[2]["ioinfo"]["sda"]["riops"] = 200.0
119
- @records[2]["ioinfo"]["sda"]["r_await"] = 4.0
120
-
121
- summary = @summary.make_summary(@records)
122
-
123
- summary["ioinfo"]["sda"]["r_await"].should be_within(3.0e-6).of(3.0)
124
- end
125
- end
126
-
127
- describe 'make_summary method with 2 devices' do
128
- before(:each) do
129
- @records = @summary.read_logfile(@logfile_2devices)
130
- end
131
-
132
- it 'should calculate avg. riops in total' do
133
- @records[0]["time"] = 0.0
134
- @records[1]["time"] = 0.5
135
-
136
- @records[0]["ioinfo"]["total"]["riops"] = 0.0
137
- @records[1]["ioinfo"]["total"]["riops"] = 10.0
138
-
139
- summary = @summary.make_summary(@records)
140
-
141
- summary["ioinfo"]["total"]["riops"].should be_within(10.0e-6).of(10.0)
142
- end
143
- end
144
-
145
- it "should respond to make_accumulation" do
146
- @summary.should respond_to(:make_accumulation)
147
- end
148
-
149
- describe "make_accumulation" do
150
- before(:each) do
151
- @records = @summary.read_logfile(@logfile)
152
- end
153
-
154
- it "should return valid format" do
155
- accum = @summary.make_accumulation(@records)
156
- accum.should be_a Hash
157
- accum.keys.should include "ioinfo"
158
- # accum.keys.should include "cpuinfo"
159
- end
160
-
161
- it "should return nil if no ioinfo" do
162
- @records.each do |record|
163
- record.delete("ioinfo")
164
- end
165
-
166
- @summary.make_accumulation(@records).should be_nil
167
- end
168
-
169
- it "should return nil if only 1 record given" do
170
- @summary.make_accumulation([@records.first]).should be_nil
171
- end
172
-
173
- it "should return valid IO data volume accumulation" do
174
- @records[0]["time"] = 0.0
175
- @records[0]["ioinfo"]["sda"]["riops"] = 0.0
176
- @records[0]["ioinfo"]["sda"]["rsecps"] = 0.0
177
- @records[0]["ioinfo"]["sda"]["avgrq-sz"] = 16.0
178
- @records[1]["time"] = 2.0
179
- @records[1]["ioinfo"]["sda"]["riops"] = 2.0
180
- @records[1]["ioinfo"]["sda"]["rsecps"] = 2.0
181
- @records[1]["ioinfo"]["sda"]["avgrq-sz"] = 16.0
182
- @records[2]["time"] = 4.0
183
- @records[2]["ioinfo"]["sda"]["riops"] = 1.0
184
- @records[2]["ioinfo"]["sda"]["rsecps"] = 4.0
185
- @records[2]["ioinfo"]["sda"]["avgrq-sz"] = 16.0
186
-
187
- accum = @summary.make_accumulation(@records)
188
-
189
- accum["ioinfo"]["sda"]["read_requests"].should be_within(6.0e-6).of(6.0)
190
- accum["ioinfo"]["sda"]["read_bytes"].should be_within(1e-6).of(6144.0)
191
- end
192
- end
193
- end
@@ -1,145 +0,0 @@
1
-
2
- #include "test.h"
3
- #include <perfmonger.h>
4
-
5
-
6
- /* global variables */
7
-
8
- int argc;
9
- char **argv;
10
-
11
- /* utility function proto */
12
-
13
- void setup_arguments(const char *arg, ...);
14
-
15
- /* test function proto */
16
- void test_parse_args (void);
17
- void test_parse_args_switches(void);
18
-
19
- /* cutter setup/teardown */
20
-
21
- void
22
- cut_setup(void)
23
- {
24
- argc = 0;
25
- argv = NULL;
26
- }
27
-
28
- void
29
- cut_teardown(void)
30
- {
31
-
32
- }
33
-
34
- /* utility function bodies */
35
-
36
- void
37
- setup_arguments(const char *arg, ...)
38
- {
39
- va_list ap;
40
-
41
- argc = 1;
42
- argv = malloc(sizeof(char *));
43
- argv[0] = (char *) arg;
44
-
45
- va_start(ap, arg);
46
- while((arg = va_arg(ap, char *)) != NULL) {
47
- argv = realloc(argv, sizeof(char *) * (argc + 1));
48
- argv[argc ++] = (char *) arg;
49
- }
50
- va_end(ap);
51
-
52
- cut_take_memory(argv);
53
- }
54
-
55
- /* test function bodies */
56
-
57
- void
58
- test_parse_args(void)
59
- {
60
- option_t option;
61
-
62
- setup_arguments("collector", NULL);
63
- cut_assert_equal_int(0, parse_args(argc, argv, &option));
64
-
65
- /* show help and exit */
66
- setup_arguments("collector", "-h", NULL);
67
- cut_assert_equal_int(-1, parse_args(argc, argv, &option));
68
-
69
- /* check -d option and default values */
70
- setup_arguments("collector", "-d", "/path/to/dev", NULL);
71
- cut_assert_equal_int(0, parse_args(argc, argv, &option));
72
- cut_assert_equal_int(1, option.nr_dev);
73
- cut_assert_equal_string("/path/to/dev", option.dev_list[0]);
74
- cut_assert_equal_double(1.0, 0.0001, option.interval);
75
- cut_assert_false(option.report_cpu);
76
- cut_assert_true(option.report_io);
77
- cut_assert_false(option.verbose);
78
-
79
- /* with multiple devices */
80
- setup_arguments("collector", "-d", "/path/to/dev0", "-d", "/path/to/dev1", NULL);
81
- cut_assert_equal_int(0, parse_args(argc, argv, &option));
82
- cut_assert_equal_int(2, option.nr_dev);
83
- cut_assert_equal_string("/path/to/dev0", option.dev_list[0]);
84
- cut_assert_equal_string("/path/to/dev1", option.dev_list[1]);
85
- cut_assert_true(option.report_io);
86
-
87
- /* with interval in integer */
88
- setup_arguments("collector", "-d", "/path/to/dev", "-i", "10", NULL);
89
- cut_assert_equal_int(0, parse_args(argc, argv, &option));
90
- cut_assert_equal_double(10.0, 0.0001, option.interval);
91
- cut_assert_true(option.report_io);
92
-
93
- /* with interval in floating point */
94
- setup_arguments("collector", "-d", "/path/to/dev", "-i", "0.5", NULL);
95
- cut_assert_equal_int(0, parse_args(argc, argv, &option));
96
- cut_assert_equal_double(0.5, 0.0001, option.interval);
97
- cut_assert_true(option.report_io);
98
-
99
- /* with verbose */
100
- setup_arguments("collector", "-d", "/path/to/dev", "-v", NULL);
101
- cut_assert_equal_int(0, parse_args(argc, argv, &option));
102
- cut_assert_true(option.verbose);
103
- cut_assert_true(option.report_io);
104
- }
105
-
106
- void
107
- test_parse_args_switches(void)
108
- {
109
- option_t option;
110
-
111
- /* with cpu (default if no device is specified) */
112
- setup_arguments("collector", NULL);
113
- cut_assert_equal_int(0, parse_args(argc, argv, &option));
114
- cut_assert_true (option.report_cpu);
115
- cut_assert_false(option.report_io);
116
- cut_assert_false(option.report_ctxsw);
117
-
118
- /* without cpu if some devices are specified */
119
- setup_arguments("collector", "-d", "/path/to/dev", NULL);
120
- cut_assert_equal_int(0, parse_args(argc, argv, &option));
121
- cut_assert_false(option.report_cpu);
122
- cut_assert_true (option.report_io);
123
- cut_assert_false(option.report_ctxsw);
124
-
125
- /* with cpu if explicitly specified by -C */
126
- setup_arguments("collector", "-C", "-d", "/path/to/dev", NULL);
127
- cut_assert_equal_int(0, parse_args(argc, argv, &option));
128
- cut_assert_true (option.report_cpu);
129
- cut_assert_true (option.report_io);
130
- cut_assert_false(option.report_ctxsw);
131
-
132
- /* without cpu if context switch option is specified */
133
- setup_arguments("collector", "-S", NULL);
134
- cut_assert_equal_int(0, parse_args(argc, argv, &option));
135
- cut_assert_false(option.report_cpu);
136
- cut_assert_false(option.report_io);
137
- cut_assert_true (option.report_ctxsw);
138
-
139
- /* with cpu if explicitly specified by -C */
140
- setup_arguments("collector", "-C", "-S", NULL);
141
- cut_assert_equal_int(0, parse_args(argc, argv, &option));
142
- cut_assert_true (option.report_cpu);
143
- cut_assert_false(option.report_io);
144
- cut_assert_true (option.report_ctxsw);
145
- }
data/test/test.h DELETED
@@ -1,9 +0,0 @@
1
- #ifndef TEST_H
2
- #define TEST_H
3
-
4
- #include <cutter.h>
5
- #include <gcutter.h>
6
- #include <glib.h>
7
-
8
-
9
- #endif