bugfix> php > 投稿

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個のアカウントが機能する場合があります。

あなたの答え