2013-05-09 9 views
10

Próbuję więc zoptymalizować aplikację mojego węzła, a moja aplikacja wysyła żądania HTTP i HTTPS.Ustawienia Nodejs Max Socket Pooling

Z tego artykułu z LinkedIn dokonywania węzeł szybko to proponuje wyłączenie buforowania gniazd, aby usunąć limit 5 gniazd:

// Disable socket pooling 
var http = require('http'); 
var options = {.....}; 
options.agent = false; 
var req = http.request(options) 

Teraz z Mikeal (deweloper życzenie) na GitHub, on proponuje:

require('http').globalAgent.maxSockets = Infinity 

Aby być uczciwym, nie sugeruje nieskończoności, ale można tam umieścić jakąkolwiek rozsądną wartość.

Teraz moja aplikacja używa HTTP i HTTPS, więc użyłem tego kodu:

var http = require('http'); 
http.globalAgent.maxSockets = 30; 
var https = require('https'); 
https.globalAgent.maxSockets = 30; 

Kiedy to zrobić, otrzymuję ten błąd:

TypeError: Cannot set property 'maxSockets' of undefined

końcu, patrząc na HTTP dokument nie pokazuje "globalAgent", ale zamiast tego pokazuje tylko agent.maxSockets.

Tak, zastanawiam się najpierw, jaka jest najlepsza składnia, aby przesłonić ten parametr?

Po drugie, jaka jest wartość optymalna? Czy jest on oparty na ilości pamięci mojego serwera? Jego przepustowość?

+2

Po aktualizacji do Node.js w0.10.24, nie widzę już błędu: TypeError: Nie można ustawić właściwości "maxSockets" o niezdefiniowanym –

+1

Zauważ, że Węzeł 0.12 zmienił domyślną wartość 'maxSockets' na' Nieskończoność': http://stackoverflow.com/a/12061013/504930 – devius

Odpowiedz

14

W odniesieniu do TypeError otrzymujesz, nie dostaję żadnych błędów podczas ustawiania http.globalAgent.maxSockets lub https.globalAgent.maxSockets. W Twojej aplikacji dzieje się coś jeszcze.

Odnośnie pierwszej części pytania, zdaj sobie sprawę, że nie ograniczasz się tylko do korzystania z agenta globalnego. Można tworzyć własne Agent instancji i używać, aby wnioski:

var http = require('http'); 
var myAgent = new http.Agent(); 

http.request({ ... , agent: myAgent }, ...); 

wniosków złożonych za pomocą środków własnych nie oddziałują z czynnikiem globalnego w ogóle. Globalny agent jest tylko domyślnym, który zostanie użyty, jeśli nie określisz jednoznacznie lub nie zrezygnujesz z używania agentów razem (przekazując false jako wartość agent w opcjach żądania).

Więc kiedy doktorzy mówią: agent.maxSockets, naprawdę odnoszą się do ogólnej klasy Agent; każde wystąpienie ma tę właściwość, łącznie z globalnym (domyślnym) agentem –, który musi być musi uzyskać dostęp przez .

Druga część pytania (optymalna maxSockets) jest trudna do udzielenia odpowiedzi. Pamiętaj, że wiele serwerów ograniczy liczbę jednoczesnych połączeń z danego adresu IP i chcesz się upewnić, że nie przytłoczysz serwera z dużą liczbą współbieżnych żądań. (Z wystarczającą liczbą żądań wystrzelonych jednocześnie, serwer jest w zasadzie dostarczany).

+0

Tak więc, podwajałem się pod kontrolą. Działa dobrze na moim lokalnym komputerze (węzeł v0.10.3 i v0.8.7), ale zawiesza się na moim komputerze Joyent SmartOS (również działającym w węźle v0.8.7) z komunikatem "TypeError: Can not set property" maxSockets 'of undefined "Dlaczego byłby inny? –

+0

Może to być architektoniczne ograniczenie Joyent PaaS. Zaadresuj ich wsparcie. – matanster

+0

Czy sprawdziłeś czy maxSockets działa na https? –