процесс nohup продолжайте закрывать - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь запустить 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.

Спасибо за помощь

[править] Я также пробовал этот проект с экраном функций, функции экрана работают как шарм, но проблема заключается в использовании процессора.Чтобы создать 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 Ответ

0 голосов
/ 25 мая 2018

Pjsua - относительно тяжелое приложение, определенно слишком тяжелое для запуска 10000 экземпляров, не предназначенное для такого рода тестирования.Поскольку вы настраиваете его для 32 вызовов, даже нехватка портов будет проблемой (для каждого вызова зарезервировано два порта плюс порт для SIP).Если вы хотите остаться с pjsua, вы можете хотя бы оптимизировать тестирование, настроив несколько учетных записей для одного экземпляра pjsua.Может быть ограничено длиной командной строки, но ~ 30 учетных записей на экземпляр может работать.

...