2012-12-13 2 views
11

PHP에서 curl_multi_ * 함수를 사용하여 1000 건의 cURL 요청을 실행하는 스크립트가 있습니다.설정 한 최대 cURL 연결 수는 얼마입니까?

타임 아웃의 병목 현상은 무엇입니까?

CPU 사용률이 좋습니까? 서버에서 아웃 바운드 연결 수를 처리하는 방법에있어보다 효율적인 방법이 있습니까?

기능을 변경할 수 없으며 요청 자체가 원격 API에 대한 간단한 호출입니다. 한계가 무엇인지 궁금합니다. 서버 또는 Apache 연결 또는 CPU에서 메모리를 늘려야합니까? (또는 제가 놓친 다른 것)

+0

리눅스 박스에 열린 파일 제한이 엿 보입니다. (사용중인 사용자로'ulimit -a'를 실행하십시오, 그것이 귀하의 수당입니다). 그 외에도 병목 현상이 네트워크가 될 수 있습니다. 내가 CPU가 망할 줄 알았는데 ... – Wrikken

+0

어떻게하면 열린 파일 한도를 제어합니까? (나는 이것에 대해 많이 모른다!) –

+1

[stackoverflow가 제공합니다] (http://stackoverflow.com/questions/34588/how-do-i-change-the-number-of-open-files-limit-in -linux) – Wrikken

답변

10

요청은 단일 실행 스레드에서 이루어집니다. 병목 현상은 거의 확실하게 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 확장 소스의 예제 참조). 새롭게 설계된 요청들 ...

+0

이것은 PHP 문제인 컬링이 아닙니다. LibCurl은 10000 병렬 요청으로 확장 할 수 있습니다. 그것은 문제를 만드는 다음 단계입니다. – Lothar

관련 문제