Pokud chcete vidět velikost vyrovnávací paměti v terminálu, můžete se podívat na:
/proc/sys/net/ipv4/tcp_rmem
(pro čtení)/proc/sys/net/ipv4/tcp_wmem
(pro zápis)
Obsahují tři čísla, což jsou hodnoty minimální, výchozí a maximální velikosti paměti (v bytech).
Zatímco, jak bylo zdůrazněno, je možné vidět aktuální výchozí velikosti vyrovnávací paměti soketu v /proc
, je také možné je zkontrolovat pomocí sysctl
(Poznámka:I když název zahrnuje ipv4, tyto velikosti platí také pro sokety ipv6 – kód ipv6 tcp_v6_init_sock() pouze volá funkci ipv4 tcp_init_sock()):
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
Výchozí soketové vyrovnávací paměti jsou však nastaveny pouze při inicializaci socku, ale jádro je dynamicky rozděluje (pokud není nastaveno pomocí setsockopt() s SO_SNDBUF). Skutečnou velikost vyrovnávacích pamětí pro aktuálně otevřené sokety lze zkontrolovat pomocí ss
příkaz (součást iproute
/iproute2
balíček), který může také poskytnout spoustu dalších informací o zásuvkách, jako je parametr řízení přetížení atd. Např. Chcete-li zobrazit seznam aktuálně otevřených TCP (t
volitelné) zásuvky a související paměť (m
) informace:
ss -tm
Zde je několik příkladů výstupu:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.56.102:ssh 192.168.56.1:56328
skmem:(r0,rb369280,t0,tb87040,f0,w0,o0,bl0,d0)
Zde je stručné vysvětlení skmem (socket memory) – pro více informací se budete muset podívat do zdrojů jádra (tj. sock.h):
r:sk_rmem_alloc rb:sk_rcvbuf # current receive buffer size t:sk_wmem_alloc tb:sk_sndbuf # current transmit buffer size f:sk_forward_alloc w:sk_wmem_queued # persistent transmit queue size o:sk_omem_alloc bl:sk_backlog d:sk_drops
Pro získání velikosti vyrovnávací paměti v programu c/c++ je následující postup
int n;
unsigned int m = sizeof(n);
int fdsocket;
fdsocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); // example
getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);
// now the variable n will have the socket size