Централизация запросов в определенных процессах

Явление

Иногда при использовании команды php start.php status мы видим, что запросы централизуются для обработки в определенных процессах, в то время как остальные процессы полностью бездействуют.

Механизм конкурентности

По умолчанию, в workerman для получения соединений используется механизм конкурентности, что означает, что когда клиент инициирует соединение, все свободные процессы имеют возможность получить это соединение, получит то, кто быстрее. Кто конкретно будет быстрее, решает операционная система ядро. Операционная система может отдать приоритет процессу, который недавно использовал центральный процессор, поскольку в регистрах ЦП может все еще содержаться информация о контексте предыдущего процесса, что позволяет сократить расходы на переключение контекста. Поэтому, при достаточно высокой скорости выполнения запросов или при проведении нагрузочного тестирования, склонность к централизации соединений в определенных процессах будет выше, поскольку такая стратегия позволяет избежать частых переключений процессов, и в результате, обеспечивает лучшую производительность.

Механизм повторного использования порта

Workerman может изменить способ получения соединений на механизм циклического опроса путем установки $worker->reusePort = true;. При использовании механизма циклического опроса ядро будет распределять соединения между всеми процессами примерно в равной мере, это позволит всем процессам одновременно обрабатывать запросы.

Заблуждения

Многие разработчики считают, что чем больше процессов участвует в обработке запросов, тем лучше производительность. На самом деле это не всегда так. Если бизнес-логика достаточно проста, то чем ближе количество процессов, участвующих в обработке запросов, к количеству ядер центрального процессора (CPU), тем выше будет производительность сервера. Например, на 4-ядерном сервере установка количества процессов равным 4 обычно дает наивысшие показатели QPS при тестировании скорости helloworld. Если количество процессов, участвующих в обработке запросов, слишком высоко и превышает количество ядер CPU, производительность ухудшается из-за больших накладных расходов на контекст процесса. В присутствии операций с базой данных количество процессов, участвующих в обработке запросов, в 3-6 раз больше количества ядер CPU может обеспечить лучшую производительность.