10.000プロセスを実行して、アスタリスクの電話アカウントを作成しようとしています。 これは、アスタリスクサーバーのストレステストを行うためです。
Linuxコマンドを作成するために、phpでexec()関数を呼び出しました。
nohup /usr/src/pjproject-2.3/pjsip-apps/bin/pjsua-x86_64-unknown-linux-gnu --id=sip:%s@13.113.163.3 --registrar=sip:127.0.0.1:25060 --realm=* --username=%s --password=123456 --local-port=%s --null-audio --no-vad --max-calls=32 --no-tcp >>/dev/null 2>>/dev/null & $(echo -ne \'\r\')"
すべてが完璧に機能し、スクリプトは私が期待しているとおりに動作します。 しかし、次の問題もあります。 10.000アカウントを作成した後、プロセスが突然すべて停止します。
どうしてこれなの?
nohup関数がプロセスを存続させるためではありませんか? nohup関数を呼び出した後、disown関数も呼び出しています。
お手伝いありがとう
[編集] また、機能画面でこのプロジェクトを試してみました。画面の機能は魅力のように機能しますが、問題はCPUの使用方法です。 10.000の画面を作成し、Linuxサーバーに夢中にさせるため、nohupを選択するのはこのためです。
完全なphpコード:
<?php
# count
$count_screens = 0;
# port count start
$port_count = 30000;
# register accounts number
$ext_number = 1000;
# amount of times you want this loop to go
$min_accounts = 0;
$max_accounts = 1000;
Class shell {
const CREATE_SESSION = 'screen -dmS stress[%s]';
const RUN_PJSUA = 'screen -S stress[%s] -p 0 -rX stuff "nohup /usr/src/pjproject-2.3/pjsip-apps/bin/pjsua-x86_64-unknown-linux-gnu --id=sip:%s@13.113.163.3 --registrar=sip:127.0.0.1:25060 --realm=* --username=%s --password=123456 --local-port=%s --null-audio --no-vad --max-calls=32 --no-tcp >>/dev/null 2>>/dev/null &"';
const DISOWN_PJSUA = 'screen -S stress[%s] -p 0 -rX stuff "disown -l $(echo -ne \'\r\')"';
public function openShell($count_screens) {
# creating a new screen to make the second call
$command = sprintf(static:: CREATE_SESSION, $count_screens);
$string = exec($command);
return var_dump($string);
}
public function runPJSUA($count_screens, $ext_number, $ext_number, $port_count) {
# register a new pjsua client
$command = sprintf(static:: RUN_PJSUA, $count_screens, $ext_number, $ext_number, $port_count);
$string = exec($command);
usleep(20000);
return var_dump($string);
}
public function disownPJSUA($count_screens) {
# register a new pjsua client
$command = sprintf(static:: DISOWN_PJSUA, $count_screens);
$string = exec($command);
return var_dump($string);
}
}
while ($min_accounts < $max_accounts) {
$shell = new shell();
if ($count_screens == '0') {
$count_screens++;
echo $shell->openShell($count_screens);
} else {
$count_screens = 1;
}
$port_count++;
$ext_number++;
$min_accounts++;
echo $shell->runPJSUA($count_screens, $ext_number, $ext_number, $port_count);
echo $shell->disownPJSUA($count_screens);
}
?>
回答 1 件
Pjsuaは比較的重いアプリケーションであり、10000インスタンスを実行するには絶対に重いため、この種のテスト用ではありません。ポートを使い果たすことさえ32コールのためにそれを設定しているので問題です(SIPのためのポートおよびコールごとに2ポートが予約されています)。 pjsuaを使い続けたい場合は、単一のpjsuaインスタンスに対して複数のアカウントを構成することにより、少なくともテストを最適化できます。コマンドラインの長さによって制限される場合がありますが、インスタンスごとに最大30個のアカウントが機能する場合があります。