そこで、セキュリティ テストを行う目的で Web サイトをホストしたので、送信される最大 60 ~ 72 Mbps (情報) を生成するスクリプトを perl で作成しました。スクリプトを複数回同時に実行すると、最大 150 Mbps が生成されることに気付きました。
スクリプトを複数回実行しなくても 150 Mbps を達成するにはどうすればよいでしょうか?
ありがとう!
そこで、セキュリティ テストを行う目的で Web サイトをホストしたので、送信される最大 60 ~ 72 Mbps (情報) を生成するスクリプトを perl で作成しました。スクリプトを複数回同時に実行すると、最大 150 Mbps が生成されることに気付きました。
スクリプトを複数回実行しなくても 150 Mbps を達成するにはどうすればよいでしょうか?
ありがとう!
複数の TCP 接続を開きたい。
イベントループを使用して、すべてのパイプをいっぱいに保つためのやり取りを処理するか、スレッド/プロセスを使用する必要があります。誰かが上でコメントしたように、「フォーク」を使用してスクリプトの複数のコピーを作成できます。それぞれが 1 つの TCP 接続を作成し、簡単に接続をフルに保つことができます。それはおそらく簡単な解決策です。
プログラムを単一のプロセスとして維持したい場合は、もう少し手間がかかりますが、それでも可能です。
多くの接続を開いている場合は、これを読むことをお勧めします: http://www.kegel.com/c10k.html
Perl を使用すると多少のオーバーヘッドが発生するため、C や Go などのより高速な言語の使用を検討することもできます。(最初にテストを行います。おそらくオーバーヘッドはごくわずかです。curl
大きなファイルを送信するようなツールを使用してテストし、perl プログラムよりも高い帯域幅を取得できるかどうかを確認します。)
コメントが言ったように、 fork() がそれを行います。
現在のスクリプト:
#!/usr/bin/perl
generate_some_load();
フォークの追加:
#!/usr/bin/perl
fork(); # now there are two processes running
generate_some_load();
または、それらの束を開始したい場合
#!/usr/bin/perl
my $num_to_start = 10;
while($num_to_start-- > 0 && fork() != 0) {
}
generate_some_load();
すべてのウィンドウでより高い Mbps を達成したいことがわかりました。スクリプトを「フォアグラウンド」で実行していて、別のウィンドウを開いて別のウィンドウを開始する必要があるかもしれません。やりたいことの 1 つは、スクリプトをバックグラウンドで開始することです。
それ以外の
% your_script.pl
& を付けて実行すると、さらにウィンドウを起動する必要がなくなります:
% your_script.pl &
% your_script.pl &
% your_script.pl &
...
また、次のように、/dev/null へのリダイレクトを少し行う必要がある場合もあります。
% your_script.pl > /dev/null 2>&1 &