요청이 특정 프로세스에 집중됨
현상
가끔 우리는 명령어 php start.php status를 통해 요청이 특정한 몇 개의 프로세스에서 처리되고 있으며, 다른 프로세스는 완전히 유휴 상태인 것을 볼 수 있습니다.
선점 메커니즘
workerman의 여러 프로세스가 연결을 얻는 방식은 기본적으로 선점 방식입니다. 즉, 클라이언트가 연결을 시작할 때 모든 유휴 프로세스가 이 연결을 받을 수 있는 기회를 가지며, 더 빠른 프로세스가 먼저 얻습니다. 누가 더 빠른지는 운영 체제의 커널 스케줄링에 의해 결정됩니다. 운영 체제는 최근 사용된 프로세스가 CPU 사용 권한을 얻는 것을 우선 선택할 수 있습니다. 이는 CPU 레지스터에 이전 프로세스의 컨텍스트 정보가 남아 있을 수 있기 때문에 컨텍스트 전환 비용을 줄일 수 있습니다. 따라서 비즈니스가 충분히 빠른 경우 또는 부하 테스트 중에는 특정 프로세스에서 연결이 집중되어 처리되는 경우가 더 자주 발생할 수 있습니다. 이는 이 전략이 빈번한 프로세스 전환을 피할 수 있어 성능이 최적화되기 때문이며, 심각한 문제가 아닙니다.
라운드 로빈 메커니즘
workerman은 $worker->reusePort = true;를 설정하여 연결을 얻는 방식을 라운드 로빈 방식으로 변경할 수 있습니다. 이 라운드 로빈 방식에서는 커널이 연결을 거의 평균적으로 모든 프로세스에 분배하므로 모든 프로세스가 함께 요청을 처리하게 됩니다.
오해
많은 개발자들은 모든 프로세스가 요청 처리에 참여할수록 성능이 더 좋다고 생각하지만, 실제로는 그렇지 않습니다. 비즈니스가 충분히 간단할 경우, 요청 처리를 담당하는 프로세스 수가 CPU 코어 수에 가까워질수록 서버의 처리량이 더 높아집니다. 예를 들어, 4코어 서버에서 프로세스 수를 4로 설정하면 helloworld 부하 테스트 QPS가 일반적으로 가장 높습니다. 요청 처리를 담당하는 프로세스 수가 CPU 코어 수를 너무 초과하면 프로세스의 컨텍스트 오버헤드가 커져 성능이 오히려 나빠집니다. 일반적으로 데이터베이스와 함께 사용하는 비즈니스의 경우, 프로세스 수를 CPU 코어 수의 3배에서 6배로 설정하는 것이 성능이 더 좋을 수 있습니다.