Mam klienta node.js (10.177.62.7) żądającego pewnych danych z usługi reszty http z serwera (10.177.0.1). Klient po prostu używa metody http.request() node.js (agent = fałsz). Klient jest w systemie Ubuntu 11.10.Klient wysyła z opóźnieniem FIN ACK (~ 500ms) na serwer
Dlaczego klient wysyła FIN ACK po 475ms? Dlaczego tak wolno? Powinien natychmiast wysłać FIN ACK. Mam wiele takich sytuacji. Około 1% całego ruchu pochodzi z opóźnionego potwierdzenia FIN.
Cpu bezczynności na kliencie wynosi około 99%, więc nic nie opróżnia procesora.
Jak to debugować? Co to mogło być? Czy jest jakaś opcja sysctl, którą muszę dostroić?
Na zrzucie ekranu Druga kolumna to czas, jaki upłynął między pakietami.
Usunąłem moją odpowiedź na temat zachowania HTTP, ponieważ zostało definitywnie wykluczone. Nie mogę jednak wymyślić żadnych innych odpowiedzi. FIN powinno wyjść, gdy tylko gniazdo zostanie zamknięte. –
@AlanCurry Ale * FIN/ACK * może wyjść tylko wtedy, gdy klient odczyta przychodzące FIN i zdecyduje się zamknąć gniazdo, co może zająć dowolną ilość czasu. Jest to zachowanie pliku node.js, a nie stosu TCP/IP. – EJP
Oczywiście, ale jeśli jest w trakcie połączenia z biblioteką klienta http, nie działa on w trybie podtrzymywania, a obciążenie procesora wynosi 1%, co zajmuje tak długo, aby zamknąć gniazdo po przeczytaniu EOF? –