2013-07-24 14 views
7

Czy można to zrobić za pomocą wiersza poleceń? man tcp mówi mi, że muszę ustawić tcp_nodelay = 1, ale nie jestem w stanie stworzyć pliku tcp_nodelay w/proc/sys/net/ipv4. Daj mi znać, jeśli istnieje sposób na wyłączenie Nagle w Linuksie.Jak można wyłączyć algorytm Walkera w Linuksie?

+0

Czy chcesz, aby system obejmował cały system? –

+0

Tak, najlepiej chciałbym, żeby system był szeroki. –

Odpowiedz

23

Ta flaga (TCP_NODELAY) jest opcją, która może być włączona dla każdego gniazda i jest stosowana podczas tworzenia gniazda TCP. Odbywa się to w określonym celu: Algorytm Walkera jest ogólnie przydatny i pomaga radzić sobie z przeciążeniem sieci. Wątpię, czy chcesz wyłączyć system w całym systemie, ponieważ twój system prawdopodobnie ucierpi z powodu tej dezaktywacji.

Aby wyłączyć go dla danego gniazda, można zastosować opcję TCP_NODELAY jak wyjaśniono here i here w C:

int flag = 1; 
int result = setsockopt(sock,   /* socket affected */ 
         IPPROTO_TCP,  /* set option at TCP level */ 
         TCP_NODELAY,  /* name of option */ 
         (char *) &flag, /* the cast is historical cruft */ 
         sizeof(int)); /* length of option value */ 
if (result < 0) 
    ... handle the error ... 

może trzeba dostosować do języka programowania, ale w zasadzie to ustawia flagę TCP_NODELAY opcja do gniazda sock, skutecznie wyłączająca algorytm Walkera. Jest to poprawne w każdym systemie operacyjnym z gniazdami obsługującymi standard TCP.

Jeśli nadal chcesz wyłączyć algorytm Walkera w całym systemie, dostępne są dwie opcje. Po pierwsze, możesz przekompilować jądro za pomocą odpowiedniej flagi (zobacz w tym celu podręcznik dystrybucji). Drugą opcją jest utworzenie oprogramowania ustawiającego flagę TCP_NODELAY na każdym istniejącym połączeniu, podobnym do this code. Ta ostatnia opcja powinna być wykonywana za każdym razem, gdy w systemie tworzone jest nowe połączenie TCP.

Coś nieco czystsze byłoby, aby uaktywnić tryb niskiego latencji TCP:

echo 1 > /proc/sys/net/ipv4/tcp_low_latency 

to daje wskazówkę do stosu TCP, co do których decyzje, aby w celu zmniejszenia opóźnień (co domyślam się, co próbujesz osiągnąć przez wyłączenie algorytmu Walkera). Domyślnie jest ustawiony na optymalizację przepustowości ("0" zostanie odczytane z /proc/sys/net/ipv4/tcp_low_latency).

+0

Twoja odpowiedź jest poprawna, ale dlaczego rzucasz '& flag' na' char * '? 'setsockopt' oczekuje wskaźnika wartości' const void * ', więc rzutowanie na typ nie jest wymagane (każdy typ może domyślnie rzutować na' void * '): http://pubs.opengroup.org/onlinepubs/9699919799/functions/ setsockopt.html Właściwie nawet naruszasz standard C, ponieważ rzutowanie wskaźnika typu A na wskaźnik typu B, w którym żaden z typów nie jest "void *", jest faktycznie niezdefiniowanym zachowaniem według ISO-C. Masz wskaźnik do int, ale twierdzisz, że jest to wskaźnik do 'char *' (będzie działać na prawie wszystkich systemach, ale jest technicznie nieokreślony) – Mecki

+0

Ten kod nie jest mój, ale jest kopią i wklej drugi link, jak już wspomniałem. Możesz skontaktować się z www.unixguide.net na temat tego problemu. Pamiętam, że widziałem kilka różnych sygnatur dla 'setsockopt()', z których niektóre (podobnie jak pierwszy podany link) używają 'char *' dla parametru 'flag'. Nie mam nic przeciwko zmianie odpowiedzi, o ile istnieją odniesienia do wiarygodnego prototypu 'setsockopt()' i przykład kodu do wykonania pożądanej operacji. – Soravux