Рубрики
Uncategorized

Проверка производительности сервера swoole websocket под давлением

Автор оригинала: David Wong.

Резюме

Это десятая статья о внедрении swoole: проверка производительности сервера swoole websocket.

  • Глава 9: реализация пула соединений swoole redis
  • Глава 8: реализация MySQL swoole
  • Глава 7: внедрение RPC swoole
  • Часть 6: swoole интегрирован в небольшую структуру
  • Часть 5: применение многопротокола swoole и многопортового
  • Часть 4. Применение http-протокола swool
  • Часть 3. применение веб-сайта swoole
  • Часть 2: применение задачи свула
  • Часть 1: применение таймера свула

Получил вопрос читателя: “Используя функцию группового чата, разработанную swoole, я хочу знать параллелизм, то есть я хочу протестировать QPS под давлением, но я не нашел способа…”

Для свула? HTTP? Проверка давления на сервере, мы можем использовать команду Apache AB.

Для проверки давления swoole ﹣ websocket ﹣ сервера невозможно использовать команду AB. Я не нашел подходящего метода в Интернете. Посмотрите на официальный код. тест/асинхронный. php Асинхронный модуль, используемый в Метод swoole\http\client , но в swoope версии 4.3 асинхронный модуль удален, а модуль Сопрограммы Сотрудничества удален.

Я использую его локально Сопрограмма Когда тест был почти завершен, мы не были уверены, был ли он правильным или нет. Поэтому мы отправили вопрос в сегмент неисправности. Неожиданно мистер Хан ответил: “Если это так, если это так, учитель тоже ответил. Большое вам спасибо за ответы двух учителей. Затем мы разобрали статью и поделились ею с большой семьей.

испытательная машина

Виртуальная машина Parallels desktop, установленная на MAC

Система: Ubuntu 16.04.3 LTS

Память:

  • Количество: 1
  • Номер ядра: 2

ЦП:

  • Количество: 1
  • Размер: 2 г

Код сервера

serv = new Swoole\WebSocket\Server("0.0.0.0", 9501);
        $this->serv->set([
            'task_worker_num'       => 10,
            'enable_coroutine'      => true,
            'task_enable_coroutine' => true
        ]);
        $this->serv->on('open', function ($serv, $request) {});
        $this->serv->on('message', function ($serv, $frame) {
            $serv->task($frame->data);
        });
        $this->serv->on('task', function ($serv, $task) {
            foreach ($serv->connections as $fd) {
                $connectionInfo = $serv->connection_info($fd);
                if (isset($connectionInfo['websocket_status']) && intval($connectionInfo['websocket_status']) == 3) {
                    $serv->push($fd, $task->data);
                }
            }
        });
        $this->serv->on('finish', function ($serv, $task_id, $data) {});
        $this->serv->on('close', function ($serv, $fd) {});
        $this->serv->start();
    }
}

$server = new Server();

Нажмите сценарий

class Test
{
    Protected $concurrency; // concurrency
    Protected $request; // number of requests
    protected $requested = 0;
    protected $start_time;

    function __construct()
    {
        $this->concurrency = 100;
        $this->request     = 10000;
    }

    protected function webSocket()
    {
        go(function () {
            for ($c = 1; $c <= $this->concurrency; $c++ ) {
                $cli = new \Swoole\Coroutine\Http\Client('127.0.0.1', 9501);
                $cli->set(['websocket_mask' => false]);
                $ret = $cli->upgrade('/');
                if ($ret) {
                    $i = $this->request / $this->concurrency;
                    while ($i >= 1) {
                        $this->push($cli);
                        $cli->recv();
                        $i--;
                    }
                }
            }
            $this->finish();
        });
    }

    protected function push($cli)
    {
        $ret = $cli->push('Hello World');
        if ($ret === true) {
            $this->requested ++ ;
        }
    }

    protected function finish()
    {
        $cost_time = round(microtime(true) - $this->start_time, 4);
        echo "Concurrency:".$this->concurrency.PHP_EOL;
        echo "Request num:".$this->request.PHP_EOL;
        echo "Success num:".$this->requested.PHP_EOL;
        echo "Total time:".$cost_time.PHP_EOL;
        echo "Request per second:" . intval($this->request / $cost_time).PHP_EOL;
    }

    public function run()
    {
        $this->start_time = microtime(true);
        $this->webSocket();
    }
}

$test = new Test();
$test->run();

Результаты измерения давления

The first time:
Concurrency:100
Request num:10000
Success num:10000
Total time:0.846
Request per second:11820

The second time:
Concurrency:100
Request num:10000
Success num:10000
Total time:0.9097
Request per second:10992

The third time:
Concurrency:100
Request num:10000
Success num:10000
Total time:0.903
Request per second:11074

Приведенные выше результаты приведены для справки.

Резюме

Благодаря этому результату теста он показывает, что эффективность выполнения swoole-это планка!

Конечно, есть также некоторые параметры, которые можно настроить, такие как рабочий номер, Максимальный запрос, задача ﹣ рабочий номер и т.д.

В реальных бизнес-сценариях должна быть логическая обработка, а также будут использоваться MySQL и redis.

Так возникает проблема. Первые две статьи были опубликованы совместно. Для студентов, интересующихся пулом соединений swoole redisconnectionpool и пулом соединений MySQL swoole, вы можете использовать два вышеуказанных пула соединений, а затем провести проверку давления.

Подсознательно было написано 10 статей о внедрении swoole. Большое вам спасибо за вашу поддержку. Я искренне надеюсь, что это поможет студентам, которые изучают введение в swoole.

Рекомендуемое чтение

  • Объяснение системы Единый вход единого входа
  • Системное объяснение – Защита веб-безопасности PHP
  • Системное объяснение – технология кэширования PHP
  • Системное объяснение – проверка подписи интерфейса PHP
  • Системное объяснение – высокоточная работа PHP с плавающей запятой

Добро пожаловать в эту статью, пожалуйста, укажите автора и источник, спасибо!

Оригинал: “https://developpaper.com/pressure-test-swoole-web-socket-server-performance/”