2012-12-13 14 views
11

Mam skrypt, który uruchamia 1000 zapytań cURL przy użyciu funkcji curl_multi_ * w PHP.Jaka jest maksymalna liczba połączeń cURL ustawionych przez?

Jakie jest wąskie gardło za nimi limit czasu?

Czy to będzie użycie procesora? Czy jest jakiś bardziej skuteczny sposób, w jaki sposób ta liczba połączeń wychodzących jest obsługiwana przez serwer, aby to zrobić?

Nie mogę zmienić funkcji, a same żądania są prostymi połączeniami do zdalnego interfejsu API. Zastanawiam się po prostu, jaki jest limit - czy muszę zwiększyć pamięć na serwerze, lub połączenia Apache lub CPU? (Lub coś innego, co przegapiłem)

+0

Otwarty limit plików na skrzynkach linuksowych przychodzi mi do głowy (uruchom 'ulimit -a' jako użytkownik, którego używasz, to twoja ulga). Poza tym wąskie gardło może stać się siecią. Wątpię, by procesor dał cholerną ... – Wrikken

+0

Jak kontrolować limit otwartych plików? (Nie wiem zbyt wiele o tym!) –

+1

[stackoverflow zapewnia] (http://stackoverflow.com/questions/34588/how-do-i-change-the-number-of-open-files-limit-in -linux) – Wrikken

Odpowiedz

10

Twoje prośby są składane w jednym wątku wykonania. Wąskim gardłem jest prawie na pewno procesor, czy kiedykolwiek oglądałeś wieloprogramowy kod curl? ... jest niesamowicie głodny cpu; ponieważ nie masz wystarczającej kontroli nad obsługą wniosków. curl_multi pozwala na orkiestrację 1000 żądań na raz, ale nie jest to dobry pomysł. Nie masz prawie żadnych szans na efektywne wykorzystanie curl_multi, ponieważ nie możesz kontrolować przepływu w stopniu wystarczającym, po prostu obsługa gniazd i wybór() na nich będzie odpowiedzialny za wysokie zużycie procesora, które zobaczysz, gdy twój kod będzie działał wiersz poleceń.

Powody, dla których użycie procesora jest wysokie podczas takich zadań, jest następujące; PHP ma działać przez ułamek sekundy, rób wszystko tak szybko, jak to tylko możliwe. Zwykle nie ma znaczenia, w jaki sposób procesor jest wykorzystywany, ponieważ jest tak krótki czas. Kiedy przedłużasz zadanie takie jak to, problem staje się bardziej widoczny, nakłady poniesione przy każdym kodzie stają się widoczne dla programisty.

Jestem świadomy, że powiedział pan, że nie można zmienić implementacji, ale nadal, aby uzyskać pełną odpowiedź. Takie zadanie jest o wiele bardziej nadaje się do gwintowania niż curl multi, i powinien zacząć czytać http://php.net/pthreads, począwszy http://php.net/Thread

lewej do własnych urządzeń w bezczynności procesora nawet 1000 Nici pochłonie tyle CPU jako curl_multi, chodzi o to, że możesz dokładnie kontrolować kod odpowiedzialny za pobieranie każdego bajtu odpowiedzi i przesłać każdy bajt żądania, a jeśli użycie procesora jest problemem, możesz zaimplementować "ładny" proces poprzez jawne wywołanie usleepu lub ograniczenie użycia połączenia w znaczący sposób , dodatkowo Twoje zapytania mogą być obsługiwane w oddzielnych wątkach.

Nie sugeruję, że 1000 wątków jest rzeczą, jest bardziej niż prawdopodobnie nie. Rzeczą do zrobienia byłoby zaprojektowanie stackable (patrz dokumentacja), którego zadaniem jest wykonanie i obsługa żądania w "ładnym", efektywnym sposobie i pule projektu (zobacz przykłady na temat źródeł rozszerzenia github/pecl) pracowników, aby wykonać nowo zaprojektowane żądania ...

+0

To jest problem PHP, a nie zwijania. LibCurl może skalować do 10000 równoległych żądań. To kolejna wielkość sprawia, że ​​problem. – Lothar

Powiązane problemy