Запросы сосредоточены в определённых процессах
Явление
Иногда, когда мы выполняем команду php start.php status, мы видим, что запросы обрабатываются в определённых процессах, в то время как другие процессы полностью бездействуют.
Механизм захвата
В Workerman несколько процессов получают соединения по умолчанию с принципом захвата, то есть, когда клиент инициирует соединение, все свободные процессы имеют возможность получить это соединение, быстрее получая его первыми. Кто именно быстрее, зависит от планирования, реализованного в ядре операционной системы. Операционная система может отдавать предпочтение последнему использованному процессу для получения прав на использование CPU, поскольку в регистрах CPU может еще находиться контекст предыдущего процесса, что позволяет сократить затраты на переключение контекста. Таким образом, когда бизнес достаточно быстр или во время стресс-тестирования, значительно возрастает вероятность того, что соединения сосредоточены на обработке определёнными процессами, поскольку эта стратегия может избежать частых переключений процессов, и производительность часто оказывается оптимальной, это не является проблемой.
Механизм кругового распределения
Workerman может изменить способ получения соединений на круговое распределение, установив $worker->reusePort = true;. При круговом распределении ядро будет распределять соединения приблизительно равномерно между всеми процессами, так что все процессы будут одновременно обрабатывать запросы.
Заблуждение
Многие разработчики считают, что чем больше процессов участвует в обработке запросов, тем лучше производительность, но это не всегда так. Когда бизнес достаточно простой, чем больше процессов участвует в обработке запросов, тем ближе их количество к количеству ядер CPU, тем выше производительность сервера. Например, на сервере с 4 ядрами, при установке числа процессов на 4, QPS (количество запросов в секунду) во время оборонительных тестов с helloworld обычно будет максимальным. Если число процессов, участвующих в обработке, значительно превышает количество ядер CPU, затраты на переключение контекста между процессами будут больше, что в свою очередь снизит производительность. Обычно, при работе с бизнесом, связанным с базами данных, установка числа процессов в 3-6 раз большее количество ядер CPU может привести к лучшей производительности.