특정 프로세스에 요청이 집중됨

현상

가끔 우리는 php start.php status 명령을 통해 특정 몇 개의 프로세스에서 요청이 처리되고, 다른 프로세스가 완전히 비어 있는 것을 볼 수 있습니다.

선점 메커니즘

workerman의 여러 프로세스가 연결을 가져오는 방식은 기본적으로 선점 방식입니다. 즉, 클라이언트가 연결을 초기화할 때 모든 유휴 프로세스가 이 연결을 가져오기 위한 기회를 갖게 됩니다. 빠른 것이 먼저 성공하는 것입니다. 누가 빨리하는 지는 운영 체제 커널 스케줄링에 따라 결정됩니다. 운영 체제는 CPU 사용 권한을 얻기 위해 가장 최근에 사용된 프로세스를 선호할 수 있으며, CPU 레지스터에 이전 프로세스의 컨텍스트 정보가 여전히 남아 있어서 이를 통해 컨텍스트 전환 비용을 줄일 수 있습니다. 따라서 비즈니스가 충분히 빠른 경우나 부하 테스트 중에는 특정 프로세스가 연결을 처리하는 것이 더 쉽습니다. 이 방식은 프로세스 전환을 자주 발생시키지 않아 성능이 최적화되는 경우도 종종 있기 때문에 문제가 아닐 수 있습니다.

순환 메커니즘

workerman은 $worker->reusePort = true;를 설정하여 연결 가져오는 방식을 순환 방식으로 변경할 수 있습니다. 순환 방식을 사용하면 커널이 연결을 거의 모든 프로세스에 거의 균등하게 할당하므로 모든 프로세스가 함께 요청을 처리하게 됩니다.

오해

많은 개발자가 모든 프로세스가 요청 처리에 참여한다면 성능이 더 좋을 것으로 생각합니다. 실제로는 그렇지 않을 수 있습니다. 비즈니스가 충분히 간단한 경우, 요청 처리에 참여하는 프로세스 수가 CPU 코어 수에 가까울수록 서버 처리량이 더 높을 수 있습니다. 예를 들어 4코어 서버에서 프로세스 수를 4로 설정하면 helloworld 부하 테스트의 QPS가 일반적으로 가장 높을 것입니다. 요청 처리에 참여하는 프로세스 수가 CPU 코어 수를 너무 많이 초과하면 프로세스 컨텍스트의 부담이 커지므로 성능이 오히려 나빠질 수 있습니다. 일반적으로 데이터베이스를 사용하는 비즈니스인 경우, 프로세스 수를 CPU 코어 수의 3배에서 6배로 설정하는 것이 더 나은 성능을 낼 수 있습니다.