internethakai 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +3 -0
- data/README +17 -2
- data/lib/internethakai.rb +1 -1
- data/lib/internethakai/client_handler.rb +28 -5
- data/lib/internethakai/concurrency_manager.rb +1 -4
- data/lib/internethakai/hakairev.rb +7 -0
- data/lib/internethakai/main.rb +9 -1
- data/lib/internethakai/scenario.rb +7 -1
- data/lib/internethakai/scenario_handler.rb +4 -0
- metadata +2 -2
data/CHANGES
CHANGED
data/README
CHANGED
@@ -29,6 +29,7 @@ CUIで使える高機能な負荷試験スクリプトです。
|
|
29
29
|
[-l --loop] ループ回数を上書きします。
|
30
30
|
[-g --log-level] ログレベルを上書きします。
|
31
31
|
[-n --nth] n 番目のアクションだけを実行(0から数えます)。
|
32
|
+
[-d --duration] 持続時間を上書きします。
|
32
33
|
[--test] テストモードで実行。テストモードで実行すると、強制的に並列数を1、ループ数1、1プロセス、ログレベル3で実行します。リクエストが正常に送られているか確認するために使用できます。
|
33
34
|
|
34
35
|
|
@@ -37,6 +38,7 @@ YAMLの連想配列で設定項目を指定します。指定すべきキー名
|
|
37
38
|
まずは hakaigen コマンドによる自動生成を試してみてください。
|
38
39
|
|
39
40
|
[loop] 各シナリオのループ回数を指定します。
|
41
|
+
[total_duration] 持続時間を指定します。total_durationを設定した場合、ループ回数は無視し、一定時間シナリオの実行をつづけます。単位は秒です。
|
40
42
|
[max_request] HTTPクライアントの数を指定します。max_requestが10であればHTTPクライアントを10作成し、10のクライアントが同時にリクエストします。なおここで設定した値は全プロセスの合計値です。おすすめの値は "100" です(1プロセスあたり100コネクションくらいになるように調整しましょう)。
|
41
43
|
[max_scenario] シナリオの数を指定します。デフォルトではmax_requestと同じ値になります。特に指定の必要はありませんが、アクセスするユーザーの数を増やしたい場合に多めに設定します。たとえば、max_requestが10、max_scenarioが20であれば、20*ループ数分のシナリオを10個のHTTPクラアントが順次実行していきます。<b>concurrencyというキー名から変更しました。</b>
|
42
44
|
[log_level]
|
@@ -118,7 +120,7 @@ YAMLの連想配列で設定項目を指定します。指定すべきキー名
|
|
118
120
|
==== ファイルからランダムに取得
|
119
121
|
user_id などをファイルからランダムに取得して使用できます。
|
120
122
|
ファイルには改行区切りで、値のリストを書いておきます。シナリオごとに異なる値がセットされます。
|
121
|
-
ファイルの名前、および変数の名前は var_file、var_name
|
123
|
+
ファイルの名前、および変数の名前は var_file、var_name というキー名でセットします。
|
122
124
|
var_file、var_name はactions の外に書きます。
|
123
125
|
|
124
126
|
例.
|
@@ -126,7 +128,20 @@ YAMLの連想配列で設定項目を指定します。指定すべきキー名
|
|
126
128
|
var_name: user_id
|
127
129
|
actions:
|
128
130
|
# user_id がファイルからランダムに選択される
|
129
|
-
- path: /somepath?
|
131
|
+
- path: /somepath?id=%(user_id)%
|
132
|
+
|
133
|
+
複数のファイルを使用したい場合は以下のように書いてください。
|
134
|
+
|
135
|
+
例.
|
136
|
+
vars:
|
137
|
+
- var_file: ./ids0
|
138
|
+
var_name: user_id
|
139
|
+
- var_file: ./ids1
|
140
|
+
var_name: item_id
|
141
|
+
actions:
|
142
|
+
# user_id と item_id がファイルからランダムに選択される
|
143
|
+
- path: /somepath?id=%(user_id)%
|
144
|
+
- path: /somepath?id=%(item_id)%
|
130
145
|
|
131
146
|
|
132
147
|
==== レスポンスで変数を設定
|
data/lib/internethakai.rb
CHANGED
@@ -2,7 +2,9 @@ module InternetHakai
|
|
2
2
|
# = httpクライアントをいじるクラス
|
3
3
|
class ClientHandler
|
4
4
|
UNIQUE_BY_THREAD = true
|
5
|
+
@@var_stores = {}
|
5
6
|
def self::on_config_load config
|
7
|
+
@@var_stores = {}
|
6
8
|
config['actions'] = config['actions'].map do |actconfig|
|
7
9
|
actconfig['usr_var'] = false
|
8
10
|
if(/%\(.*\)%/ =~ actconfig['path'])
|
@@ -13,19 +15,38 @@ module InternetHakai
|
|
13
15
|
end
|
14
16
|
actconfig
|
15
17
|
end
|
18
|
+
# ファイルでセットする変数
|
16
19
|
if(config.has_key?('var_file') && config.has_key?('var_name'))
|
17
20
|
s = File::open(config['var_file']){|io|io.read}
|
21
|
+
var_ids = []
|
18
22
|
if s
|
19
23
|
lines = s.split("\n")
|
20
|
-
|
24
|
+
var_ids = lines.sort_by{rand}
|
21
25
|
end
|
22
|
-
|
26
|
+
unless var_ids.empty?
|
27
|
+
var_name = config['var_name']
|
28
|
+
@@var_stores[var_name] = var_ids
|
29
|
+
end
|
30
|
+
end
|
31
|
+
# 複数ファイルの場合
|
32
|
+
if(config.has_key?('vars') && config['vars'].is_a?(Array))
|
33
|
+
config['vars'].each do |c|
|
34
|
+
next unless c.has_key?('var_file') && c.has_key?('var_name')
|
35
|
+
s = File::open(c['var_file']){|io|io.read}
|
36
|
+
next if s.nil? || s==''
|
37
|
+
ids = s.split("\n").sort_by{rand}
|
38
|
+
@@var_stores[c['var_name']] = ids unless ids.empty?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
unless @@var_stores.empty?
|
23
42
|
def set_var_id
|
24
|
-
|
25
|
-
|
26
|
-
|
43
|
+
@@var_stores.each do |var_name, ids|
|
44
|
+
id = ids[@performance_id % ids.size]
|
45
|
+
set_var(var_name, id)
|
46
|
+
end
|
27
47
|
end
|
28
48
|
else
|
49
|
+
#変数がないときは何もしない
|
29
50
|
def set_var_id
|
30
51
|
end
|
31
52
|
end
|
@@ -78,6 +99,8 @@ module InternetHakai
|
|
78
99
|
def handle_client client
|
79
100
|
@client = client
|
80
101
|
end
|
102
|
+
def set_var_id
|
103
|
+
end
|
81
104
|
end
|
82
105
|
|
83
106
|
# = ケータイサイト用
|
@@ -66,6 +66,13 @@ module InternetHakai
|
|
66
66
|
#end
|
67
67
|
sc.init
|
68
68
|
end
|
69
|
+
if @config.has_key?('total_duration')
|
70
|
+
@config['infinity'] = true
|
71
|
+
timer = Rev::TimerWatcher::new(@config['total_duration'], false)
|
72
|
+
timer.on_timer(&method(:rev_on_complete))
|
73
|
+
timer.attach(Rev::Loop::default)
|
74
|
+
timer.enable unless timer.enabled?
|
75
|
+
end
|
69
76
|
|
70
77
|
@threads[:main] = Thread::current
|
71
78
|
@starttime = Time::now
|
data/lib/internethakai/main.rb
CHANGED
@@ -9,6 +9,7 @@ module InternetHakai
|
|
9
9
|
setting['max_request'] = args[:max_request] if args.has_key? :max_request
|
10
10
|
setting['max_scenario'] = args[:concurrency] if args.has_key? :concurrency
|
11
11
|
setting['log_level'] = args[:log_level] if args.has_key? :log_level
|
12
|
+
setting['duration'] = args[:duration] if args.has_key? :duration
|
12
13
|
else
|
13
14
|
setting = nil
|
14
15
|
end
|
@@ -51,7 +52,11 @@ module InternetHakai
|
|
51
52
|
@logger.run(start + "\n", 2)
|
52
53
|
@logger.run("Rev Mode\n", 2) if @config['rev']
|
53
54
|
@logger.run("Target domain = #{@config['domain']}\n", 2)
|
54
|
-
@
|
55
|
+
if @config.has_key?('total_duration')
|
56
|
+
@logger.run("Duration: #{@config['total_duration']}\n", 2)
|
57
|
+
else
|
58
|
+
@logger.run("Loop: #{@config['loop']}\n", 2)
|
59
|
+
end
|
55
60
|
@logger.run("Request Concurrency: #{@config['max_request_show']}\n", 2)
|
56
61
|
@logger.run("Scenario Concurrency: #{@config['max_scenario_show']}\n", 2)
|
57
62
|
end
|
@@ -83,6 +88,9 @@ module InternetHakai
|
|
83
88
|
opts.on('-n NUM', '--nth', 'run only nth action') do |l|
|
84
89
|
args[:action_nth] = l.to_i
|
85
90
|
end
|
91
|
+
opts.on('-d NUM', '--duration', 'duration-time') do |l|
|
92
|
+
args[:duration] = l.to_i
|
93
|
+
end
|
86
94
|
opts.on_tail("-h", "--help", "show this message") do
|
87
95
|
puts opts
|
88
96
|
exit
|
@@ -38,7 +38,13 @@ module InternetHakai
|
|
38
38
|
if @action_counter == 0
|
39
39
|
@loop -= 1
|
40
40
|
#これで最後
|
41
|
-
|
41
|
+
if @loop == 0
|
42
|
+
if @config['infinity']
|
43
|
+
@loop += 100 # 無限ループ!
|
44
|
+
else
|
45
|
+
return
|
46
|
+
end
|
47
|
+
end
|
42
48
|
@action_counter = @actions_size
|
43
49
|
@performance_id = (@scenario_id.to_s + sprintf(@tmpl, @loop)).to_i
|
44
50
|
end
|