4

リクエストの現実的な頻度分布を使用して、サーバーの機能テストを自動化しようとしています。(一種の負荷テスト、一種のシミュレーション)

私が観察した分布と「ある程度」一致するため、ワイブル分布を選択しました(急速にランプアップし、すぐに低下しますが、すぐには低下しません)。

この分布を使用して、特定の開始日と終了日の間に毎日送信する必要があるリクエストの数を生成します

私はPythonでアルゴリズムをハックしましたが、それは動作しますが、ぎこちなく感じます:

how_many_days = (end_date - start_date).days
freqs = defaultdict(int)
for x in xrange(how_many_responses):
    freqs[int(how_many_days * weibullvariate(0.5, 2))] += 1
timeline = []
day = start_date
for i,freq in sorted(freqs.iteritems()):
    timeline.append((day, freq))
    day += timedelta(days=1)
return timeline

これを行うためのより良い方法は何ですか?

4

6 に答える 6

1

最後の4行を少し長くしますが、おそらく読みやすくします。

samples = [0 for i in xrange(how_many_days + 1)]
for s in xrange(how_many_responses):
    samples[min(int(how_many_days * weibullvariate(0.5, 2)), how_many_days)] += 1
histogram = zip(timeline, samples)
print '\n'.join((d.strftime('%Y-%m-%d ') + "*" * c) for d,c in histogram)

これにより、常に日付範囲内のサンプルが削除されますが、[0、1]の範囲を超えるすべてのサンプルから、タイムラインの最後に対応するバンプが取得されます。

于 2008-09-11T10:47:06.233 に答える
1

The Grinder 3を使ってサーバーの負荷テストを試してみませんか。これらすべてが事前に構築されており、スクリプト言語として Python をサポートしています。

于 2008-09-10T11:20:27.830 に答える
1

これは迅速で、おそらくそれほど正確ではありませんが、PDF を自分で計算すると、少なくとも複数の小さい/大きい PDF を 1 つのタイムラインに簡単に配置できます。dev粗さを制御するガウス ノイズの標準偏差です。これは、必要なものを生成する「正しい」方法ではありませんが、簡単です。

import math
from datetime import datetime, timedelta, date
from random import gauss

how_many_responses = 1000
start_date = date(2008, 5, 1)
end_date = date(2008, 6, 1)
num_days = (end_date - start_date).days + 1
timeline = [start_date + timedelta(i) for i in xrange(num_days)]

def weibull(x, k, l):
    return (k / l) * (x / l)**(k-1) * math.e**(-(x/l)**k)

dev = 0.1
samples = [i * 1.25/(num_days-1) for i in range(num_days)]
probs = [weibull(i, 2, 0.5) for i in samples]
noise = [gauss(0, dev) for i in samples]
simdata = [max(0., e + n) for (e, n) in zip(probs, noise)]
events = [int(p * (how_many_responses / sum(probs))) for p in simdata]

histogram = zip(timeline, events)

print '\n'.join((d.strftime('%Y-%m-%d ') + "*" * c) for d,c in histogram)
于 2008-09-11T13:40:31.730 に答える
0

リクエスト数を固定値として指定する代わりに、代わりに倍率を使用してみませんか? 現時点では、リクエストを限られた数量として扱い、それらのリクエストが該当する日をランダム化しています。1 日あたりのリクエスト数を独立したものとして扱う方が合理的です。

from datetime import *
from random import *

timeline = []
scaling = 10
start_date = date(2008, 5, 1)
end_date = date(2008, 6, 1)

num_days = (end_date - start_date).days + 1
days = [start_date + timedelta(i) for i in range(num_days)]
requests = [int(scaling * weibullvariate(0.5, 2)) for i in range(num_days)]
timeline = zip(days, requests)
timeline
于 2008-09-11T08:30:23.410 に答える
0

もう 1 つの解決策は、Rpyを使用することです。これは、R のすべての機能 (ディストリビューション用の多くのツールを含む) を Python に簡単に組み込むことができます。

于 2008-09-18T01:16:20.977 に答える
0

上記のコードを短く書き直しました (しかし、難読化しすぎているのではないでしょうか?)

timeline = (start_date + timedelta(days=days) for days in count(0))
how_many_days = (end_date - start_date).days
pick_a_day = lambda _:int(how_many_days * weibullvariate(0.5, 2))
days = sorted(imap(pick_a_day, xrange(how_many_responses)))
histogram = zip(timeline, (len(list(responses)) for day, responses in groupby(days)))
print '\n'.join((d.strftime('%Y-%m-%d ') + "*" * c) for d,c in histogram)
于 2008-09-11T09:11:50.907 に答える