Автор оригинала: 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/”