요청은 단일 실행 스레드에서 이루어집니다. 병목 현상은 거의 확실하게 CPU입니다. 실제로 컬 멀티 코드가 실행되는 것을 본 적이 있습니까? ... 그것은 믿을 수 없을 정도로 CPU가 배가 고프다. 요청을 처리하는 데 충분한 제어 권한이 없기 때문입니다. curl_multi를 사용하면 1000 개의 요청을 한 번에 오케스트레이션 할 수 있지만 이것이 좋은 생각은 아닙니다. 실행 흐름을 미세하게 제어 할 수 없기 때문에 curl_multi를 효율적으로 사용할 수있는 기회는 거의 없으며 소켓을 서비스하고 select()를 호출하면 코드를 실행하는 것을 볼 수있는 많은 CPU 사용량이 고려됩니다 명령 행
이러한 작업 중에 CPU 사용량이 높은 이유는 다음과 같습니다. PHP는 몇 초 만에 실행되도록 설계되었으며 최대한 빨리 모든 작업을 수행합니다. 짧은 시간 동안 사용하기 때문에 일반적으로 CPU가 어떻게 사용되는지는 중요하지 않습니다. 이와 같이 작업을 연장하면 문제가 더욱 분명해지며, 모든 연산 코드에서 발생하는 오버 헤드가 프로그래머에게 표시됩니다.
구현을 변경할 수는 없지만 여전히 완전한 대답을 원한다는 것을 알고 있습니다. 이러한 작업은 멀티 쓰레드보다 스레딩에 훨씬 더 적합하며, http://php.net/Thread
으로 시작해야합니다. 유휴 CPU에서 자체 장치에 남겨두면 1000 개의 스레드가 curl_multi만큼의 CPU를 소비하게됩니다. 응답의 모든 바이트를 다운로드하고 요청의 모든 바이트를 업로드 할 책임이있는 코드를 정확하게 제어 할 수 있고 CPU 사용량이 중요한 경우 usleep을 명시 적으로 호출하거나 의미있는 방식으로 연결 사용을 제한하여 "멋진"프로세스를 구현할 수 있습니다 또한 요청을 별도의 스레드로 처리 할 수 있습니다.
나는 1000 개의 스레드가 할 일이라고 제안하지 않으며, 은 아마도이 아닙니다. 할 일은 "좋은"효율적인 방법으로 요청을 만들고 서비스하는 것이 Stackable (문서 참조)이며, 작업자를 실행하기위한 작업자 풀을 설계하는 것입니다 (github/pecl 확장 소스의 예제 참조). 새롭게 설계된 요청들 ...
리눅스 박스에 열린 파일 제한이 엿 보입니다. (사용중인 사용자로'ulimit -a'를 실행하십시오, 그것이 귀하의 수당입니다). 그 외에도 병목 현상이 네트워크가 될 수 있습니다. 내가 CPU가 망할 줄 알았는데 ... – Wrikken
어떻게하면 열린 파일 한도를 제어합니까? (나는 이것에 대해 많이 모른다!) –
[stackoverflow가 제공합니다] (http://stackoverflow.com/questions/34588/how-do-i-change-the-number-of-open-files-limit-in -linux) – Wrikken