Quais valores o Linux pode usar para o tamanho padrão do buffer de soquete unix?

3

O Linux documenta o tamanho do buffer padrão para tcp, mas não para soquetes AF_UNIX ("local"). O valor pode ser lido (ou escrito) em tempo de execução.

cat /proc/sys/net/core/[rw]mem_default

Esse valor sempre é o mesmo em diferentes kernels do Linux, ou existe um intervalo de valores possíveis?

    
por sourcejedi 15.02.2018 / 14:40

1 resposta

6

O padrão não é configurável, mas é diferente entre o Linux de 32 e 64 bits. O valor parece ser escrito de modo a permitir 256 pacotes de 256 bytes cada, representando a sobrecarga diferente por pacote (structs com ponteiros de 32 bits ou inteiros de 64 bits).

No Linux de 64 bits 4.14.18: 212992 bytes

No Linux de 32 bits 4.4.92: 163840 bytes

Os tamanhos de buffer padrão são os mesmos para os buffers de leitura e gravação. A sobrecarga por pacote é uma combinação de struct sk_buff e struct skb_shared_info , portanto, depende do tamanho exato dessas estruturas (arredondadas ligeiramente para o alinhamento). Por exemplo. no kernel de 64 bits acima, a sobrecarga é de 576 bytes por pacote.

link

/* Take into consideration the size of the struct sk_buff overhead in the
 * determination of these values, since that is non-constant across
 * platforms.  This makes socket queueing behavior and performance
 * not depend upon such differences.
 */
#define _SK_MEM_PACKETS     256
#define _SK_MEM_OVERHEAD    SKB_TRUESIZE(256)
#define SK_WMEM_MAX     (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)
#define SK_RMEM_MAX     (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)

/* Run time adjustable parameters. */
__u32 sysctl_wmem_max __read_mostly = SK_WMEM_MAX;
EXPORT_SYMBOL(sysctl_wmem_max);
__u32 sysctl_rmem_max __read_mostly = SK_RMEM_MAX;
EXPORT_SYMBOL(sysctl_rmem_max);
__u32 sysctl_wmem_default __read_mostly = SK_WMEM_MAX;
__u32 sysctl_rmem_default __read_mostly = SK_RMEM_MAX;

Curiosamente, se você definir um tamanho de buffer de soquete não padrão, o Linux dobra para fornecer as despesas gerais. Isso significa que, se você enviar pacotes menores (por exemplo, menos que os 576 bytes acima), não será possível ajustar quantos bytes de dados do usuário no buffer, como você especificou para seu tamanho.

    
por 15.02.2018 / 14:40