Wykorzystanie TCP_DEFER_ACCEPT w świecie rzeczywistym?


15

Przeczytałem online instrukcję Apache httpd i natknąłem się na dyrektywę, aby to umożliwić. Znaleziono opis na stronie podręcznika dla tcp:

   TCP_DEFER_ACCEPT (since Linux 2.4)
          Allow a listener to be awakened only when data arrives on the
          socket.  Takes an integer value (seconds), this can bound the
          maximum number of attempts TCP will make to complete the
          connection.  This option should not be used in code intended
          to be portable.

Potem znalazłem ten artykuł, ale nadal nie jestem pewien, do jakiego rodzaju obciążeń byłoby to przydatne. Zakładam, że jeśli httpdma taką opcję, musi mieć pewne znaczenie dla serwerów sieciowych. Zakładam również, że jest to opcja, a nie tylko sposób httpdpołączeń sieciowych, że istnieją przypadki użycia, w których chcesz, i inne, w których nie.

Nawet po przeczytaniu artykułu nie jestem pewien, jaka byłaby korzyść z oczekiwania na zakończenie uzgadniania trójstronnego. Wydaje się korzystne, aby upewnić się, że nie trzeba będzie zamieniać odpowiedniej httpdinstancji, robiąc to, podczas gdy uścisk dłoni wciąż trwa, zamiast potencjalnie powodować to opóźnienie po utworzeniu połączenia.

W przypadku tego artykułu wydaje mi się również, że bez względu na TCP_DEFER_ACCEPTstatus gniazda nadal będziesz potrzebować czterech pakietów (uzgadnianie, a następnie dane w każdym przypadku). Nie wiem, jak sprowadzają odliczanie do trzech, ani jak zapewnia to znaczące ulepszenie.

Więc moje pytanie jest w zasadzie: czy to tylko stara przestarzała opcja, czy istnieje rzeczywisty przypadek użycia tej opcji?


Nie jestem do końca pewien, co masz na myśli, mówiąc „zmniejsz licznik do trzech”, co sprawia, że ​​podejrzewam, że źle zrozumiałeś trójdrożny uścisk dłoni. Jest to transakcja „otwartego połączenia” TCP i składa się z 3 przesłanych pakietów. Do czasu ukończenia tych 3 nie ma danych i nie jest prawidłowe połączenie. Ponieważ takie dane nigdy nie wpływają na obciążenie związane z uzgadnianiem. Wzrost wydajności, który zostałby uzyskany z TCP_DEFER_ACCEPT, byłby luką między zakończeniem uzgadniania 3-drogowego uzgadniania TCP a pierwszym pakietem danych (zakładam, że głównie tutaj, aby skomentować uzgadnianie 3 vs 4)
iain

Nie chodzi też o unikanie „zamiany”, nie o marnowanie zasobów. Jeśli zamiana miała stać się czynnikiem aktywującym proces roboczy HTTP, to zmuszasz swojego pracownika do przedwczesnej wymiany w punkcie akceptacji, zanim dane będą gotowe ... a jeśli ma miejsce zamiana, oznacza to, że wymuszasz coś innego ram ... coś, co może coś robiło i zostało z powrotem zamienione pomiędzy częścią akceptacji / danych ... bez względu na zasoby - procesor, diskIO, strony wbudowane, jeśli nie ma danych, nie ma sensu powodować pracy.
iain

Jeśli proces roboczy jest już w pamięci, czy to nie jest tak małe opóźnienie w porównaniu z ewentualnym przejściem na dysk? „Do trzech” to odniesienie do artykułu, który mówi, że w jakiś sposób sprawiłoby to, że pierwszy pakiet danych od klienta znalazłby się w trzecim pakiecie.
Bratchley,

Teoretyczna zamiana i tak się stanie, i tak nie zmieni się w przypadku tej opcji TCP. Nie rozumiem, w jaki sposób wyeliminowanie luki w tworzeniu połączenia TCP i umieszczenie go przy przesyłaniu danych jest korzystne. Przynajmniej gdy robisz to podczas tworzenia połączenia TCP, istnieje możliwość równoległego działania dwóch (skrócenie czasu).
Bratchley,

Powinienem właśnie napisać odpowiedź ... Jeśli chodzi o to, że jest to opcja, cóż, nie jest to, jak działają „normalne” standardy unixowe… W szczególności w przypadku HTTP kluczową kwestią jest to, że klient (przeglądarka internetowa) inicjuje rozmowę z GET line ... Tak więc serwer nie dba o rzeczywiste połączenie, tylko o pierwsze dane. W przeciwieństwie do SMTP, który wymaga od klienta oczekiwania, aż serwer wyśle ​​komunikat „220 powitalny baner”. To znaczy, że serwer musi wiedzieć o połączeniu, a nie danych.
iain

Odpowiedzi:


14

(aby streścić moje komentarze na temat PO)

Trójstronny uścisk dłoni, do którego się odnoszą, jest częścią nawiązywania połączenia TCP, przedmiotowa opcja nie odnosi się konkretnie do tego. Należy również pamiętać, że wymiana danych nie jest częścią trójstronnego uzgadniania, to po prostu tworzy połączenie TCP w stanie otwartym / ustanowionym.

Jeśli chodzi o istnienie tej opcji, nie jest to tradycyjne zachowanie gniazda, zwykle wątek obsługi gniazda jest budzony, gdy połączenie zostanie zaakceptowane (co jest nadal po zakończeniu uzgadniania trójstronnego), a dla niektórych protokołów rozpoczyna się tutaj aktywność ( np. serwer SMTP wysyła 220 powitania), ale dla HTTP pierwszą wiadomością w rozmowie jest przeglądarka internetowa wysyłająca swoją linię GET / POST / etc, i dopóki to się nie stanie, serwer HTTP nie jest zainteresowany połączeniem (poza czasem to), a więc budzenie procesu HTTP po zakończeniu akceptacji gniazda jest marnotrawstwem, ponieważ proces natychmiast zasypia w oczekiwaniu na niezbędne dane.

Chociaż z pewnością istnieje argument, że przebudzenie bezczynnych procesów może uczynić je „gotowymi” do dalszego przetwarzania (szczególnie pamiętam budzenie terminali logowania na bardzo starych komputerach i ich ładowanie z wymiany), ale można również argumentować, że każda maszyna, która ma wymieniono proces, który już stwarza wymagania dotyczące swoich zasobów, a stawianie dalszych niepotrzebnych wymagań może ogólnie obniżyć wydajność systemu - nawet jeśli widoczna wydajność twojego wątku poprawi się (co również nie musi, bardzo zajęty komputer miałby wąskie gardła na IO dysku, co by spowolnij inne rzeczy, jeśli włączysz się, a jeśli jest tak zajęty, natychmiastowy sen może zamienić go z powrotem z powrotem). To wydaje się być hazardem, a ostatecznie „chciwy” hazard niekoniecznie się opłaca na ruchliwej maszynie,

Moja ogólna rada dotycząca tego poziomu dostrajania wydajności polega na tym, aby nie podejmować programowych decyzji co do tego, co jest najlepsze, ale pozwolić administratorowi systemu i systemowi operacyjnemu współpracować w celu rozwiązania problemów związanych z zarządzaniem zasobami - to jest ich praca i jest ich wiele lepiej dostosowane do zrozumienia obciążeń całego systemu i nie tylko. Podaj opcje i opcje konfiguracji.

Aby dokładnie odpowiedzieć na pytanie, opcja ta jest korzystna we wszystkich konfiguracjach, nie do poziomu, który prawdopodobnie byś zauważył, z wyjątkiem dużego obciążenia ruchem HTTP, ale teoretycznie jest to „właściwy” sposób na zrobienie tego. Jest to opcja, ponieważ nie wszystkie wersje uniksowe (nawet wszystkie Linux) mają taką możliwość, a zatem dla przenośności można ją skonfigurować tak, aby nie była dołączona.


Dzięki za świetne podsumowanie. Podczas gdy obciążenie serwera i zamiana / przebudzenie bezczynności jest jedną z potencjalnych zalet (tę, która jest dopracowana, jak wspomniano), istnieją wyraźne korzyści, jeśli spojrzysz na serwer HTTP obsługujący klientów o wysokim i niskim opóźnieniu. Na przykład podczas uruchamiania serwera WWW Apache dostępna jest stała liczba procesów / wątków serwera, co oznacza, że ​​w danym momencie można obsłużyć stałą liczbę klientów. Zatem nie „zużywanie” procesu serwera, gdy pakiet „danych” od klienta nie dotarł, może oznaczać, że proces serwera może w międzyczasie obsługiwać innego klienta.
Ram

-1

Nie jestem pewien, jaka byłaby korzyść z oczekiwania na zakończenie uzgadniania trójstronnego.

Uzgadnianie trójdrożne jest powszechnym protokołem w telefonii głosowej:

  1. Serwer : „Dzień dobry, Epiphyte Corp.”
  2. Dzwoniący : „Cześć, to jest Randy”.
  3. Serwer : „Tak, w czym mogę pomóc?”
  4. Dzwoniący : część połączenia zaczyna prosić o dowcip

Są one ważne w TCP dla zapewnienia ustanowienia kanału. Jeśli klient rozpoczął wysyłanie wezwania przed wysłuchaniem (3), istnieje prawdopodobieństwo, że serwer nie słucha lub nie jest gotowy. Przesłuchanie (3) nie gwarantuje, że serwer nie doznał natychmiastowego samozapłonu po transmisji, ale zwiększa pewność, że serwer jest gotowy do odbioru.

Jak wspomniano w Wikipedii na temat uzgadniania :

  1. Alice [Serwer] odpowiada komunikatem z potwierdzeniem o numerze y + 1, który Bob [Klient] otrzymuje i na który nie musi odpowiadać .

Jeśli więc zechcesz zrezygnować z dodatkowej pewności, że serwer jest gotowy, serwer może pominąć krok (3), a klient po prostu przyjmie, że serwer jest gotowy. To zmienia powyższą wymianę protokołów w:

  1. Serwer : „Dzień dobry, Epiphyte Corp.”
  2. Dzwoniący : „Cześć, to jest Randy”.
  3. Dzwoniący : „Czy znasz jakieś dowcipy na temat Imelda Marcos?”

To coś więcej niż pewność, którą wysyłasz przed ukończeniem 3way i binowaniem danych. Sposób, w jaki połączenia TCP są konfigurowane w nowoczesnych stosach systemów operacyjnych, tak naprawdę nie ma danych połączenia zapisywanych w tabelach, dopóki trzecia część połączenia nie zostanie spełniona, wymaganie trzeciego komunikatu przed zużyciem jakichkolwiek zasobów odbywa się za pomocą „Syn Cookies” i zapobiega „Syn Attacks” (które są sfałszowanym pakietem uzgadniania-source-ip 1. jego pakiet 3, który podważa ten sfałszowany źródłowy adres IP). Dlatego przed tym punktem nie ma żadnego połączenia ani wpisu.
iain

Przesłuchanie (3) nie gwarantuje, że serwer nie doznał natychmiastowego samozapłonu po transmisji, ale zwiększa pewność, że serwer jest gotowy do odbioru.
msw

Zwiększać? Od zera? Cóż, tak, myślę, że dosłownie to prawda, ale większość ludzi sugerowałaby, że przed pakietem 3 pojawiła się / trochę / szansa na zwiększenie. I nie ma. To po prostu wyrażenie „zwiększyć pewność siebie”, którego nie lubię i nie sądzę, że uwzględnienie w 0,001% „głównych poważnych problemów w świecie rzeczywistym” pomaga wyjaśnić problem. Jasne, wojna nuklearna może się zdarzyć, zanim serwer otrzyma pakiet, może się zdarzyć wiele rzeczy.
iain

Właśnie przejrzałem ostatni akapit, w którym sugerujesz, że krok 3 jest opcjonalny. Nie jest, absolutnie nie jest. Przeczytaj akapit, krok 3 to „alicja odpowiada potwierdzeniem”. to nie jest opcjonalne. Bob odpowiada na to (teoretyczny czwarty krok).
iain
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.