2011-12-01 12 views
5

Proszę, hakerzy jądra Linux, jaki jest rozsądny rozmiar bufora dla write(2) syscall do gniazd lub plików, pod względem wydajności? Jasne jest, że jest kilka stronicowych, ale które? Czy to ma znaczenie? Co to jest "zbyt mały" i "zbyt duży"?Zarówno zalecany rozmiar bufora dla gniazda i pliku:

+0

Nic mniej niż 128 kilobajtów, ponieważ to, co wpisuje się w kolejce wysyłania domyślnie (chyba, że ​​chcesz grać z setsockopt) . – Damon

+1

@Damon: Nie jestem pewien, czy "coś" jest właściwą odpowiedzią. Bufory powinny być przynajmniej wyrównane. – Cartesius00

+0

Domyślnie działa większość ludzi przez większość czasu (rozsądnie jest założyć, że ludzie piszący stos sieciowy nie są kompletnymi idiotami). O ile nie trzeba regularnie wysyłać ogromnych ilości danych (naprawdę ogromnych) i mieć pewne surowe ograniczenia dotyczące opóźnień, zwykle nie ma powodu do niepokoju. Wszystko, co jest "rozsądnym" rozmiarem, jest po prostu kopiowane do bufora wysyłania i wysyłane, niezależnie od tego, ile to kosztuje. Jeśli nie wszystkie pasują, "write" napisze mniej niż to, o co prosisz (zwracając kwotę). W każdym razie po prostu działa. – Damon

Odpowiedz

7

zależy jak duże opóźnienie w każdym jest, powiedzmy, że masz połączenie 100Mbps oraz opóźnienie 50 ms, a następnie można obliczyć

100MBps * 0.050 sec/8 = 0.625MB = 625KB 

ale domyślny rozmiar okna w systemie Linux 2.6 jest ok 110kB, co ograniczy swoją przechadzkę się wokół 2.2MBps (110kB/0,050) tak więc, aby ustalić, które możesz setsockopt

int ret, sock, buf_size; 
sock = socket(AF_INET, SOCK_STREAM, 0); 
buf_size = 625*1024; 
ret = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&buf_size, sizeof(buf_size)); 
ret = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&buf_size, sizeof(buf_size)); 
Powiązane problemy