我正在尝试运行10.000个流程来创建星号电话帐户。 这是对我们的Asterisk服务器进行压力测试。
我用php调用了一个exec()函数来创建一个Linux命令。
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);
}
&GT;
答案 0 :(得分:0)
Pjsua是一个相对繁重的应用程序,肯定太重了,无法运行10000个实例,不适合这种测试。在为32个呼叫配置它时,即使用完端口也会出现问题(每个呼叫保留两个端口加上SIP端口)。如果你想继续使用pjsua,你至少可以通过为单个pjsua实例配置多个帐户来优化测试。它可能受命令行长度的限制,但每个实例约有30个帐户可能有效。