Я пытаюсь запустить 10.000 процессов для создания учетных записей телефонов звездочек.
Это для стресс-тестирования нашего сервера Asterisk.
Я вызвал с помощью php функцию exec () для создания команды Linux.
nohup /usr/src/pjproject-2.3/pjsip-apps/bin/pjsua-x86_64-unknown-linux-gnu --id=sip:%[email protected] --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.
Спасибо вам за помощь
[редактировать] Я также попробовал этот проект с экраном функций, функции экрана работают как шарм, но проблема заключается в использовании процессора. Чтобы создать 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:%[email protected] --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);
}
?>
Pjsua — относительно тяжелое приложение, определенно слишком тяжелое для запуска 10000 экземпляров, не предназначенное для такого рода тестирования. Поскольку вы настраиваете его для 32 вызовов, даже нехватка портов будет проблемой (для каждого вызова зарезервировано два порта плюс порт для SIP). Если вы хотите остаться с pjsua, вы можете хотя бы оптимизировать тестирование, настроив несколько учетных записей для одного экземпляра pjsua. Это может быть ограничено длиной командной строки, но ~ 30 учетных записей на экземпляр может работать.
Других решений пока нет …