繁体   English   中英

如何调整linux网络缓冲区大小

[英]how to tune linux network buffer size

我正在阅读“卡夫卡权威指南”,在第35页(网络部分)中说:

...第一项调整是更改为每个套接字的发送和接收缓冲区分配的默认和最大内存量。 这将大大提高大型传输的性能。 每个套接字的发送和接收缓冲区默认大小的相关参数是net.core.wmem_default和net.core.rmem_default ... 除了套接字设置之外,还必须设置TCP套接字的发送和接收缓冲区大小分别使用net.ipv4.tcp_wmem和net.ipv4.tcp_rmem参数。

为什么我们应该同时设置net.core.wmem和net.ipv4.tcp_wmem?

简短的回答 -r / wmem_default用于设置静态套接字缓冲区大小,而tcp_r / wmem用于控制TCP发送/接收窗口大小和动态缓冲区。

更多详细信息 :通过跟踪r / wmem_default和tcp_r / wmem(内核4.14)的使用,我们可以看到r / wmem_default仅在sock_init_data()中使用:

void sock_init_data(struct socket *sock, struct sock *sk)
{
        sk_init_common(sk);
        ...
        sk->sk_rcvbuf           =       sysctl_rmem_default;
        sk->sk_sndbuf           =       sysctl_wmem_default;

这将初始化套接字的缓冲区以发送和接收数据包,以后可能会在set_sockopt中覆盖它:

int sock_setsockopt(struct socket *sock, int level, int optname,
                    char __user *optval, unsigned int optlen)
{
        struct sock *sk = sock->sk;
        ...
        sk->sk_sndbuf = max_t(int, val * 2, SOCK_MIN_SNDBUF);
        ...
        sk->sk_rcvbuf = max_t(int, val * 2, SOCK_MIN_RCVBUF);

可在以下函数中找到tcp_rmem的用法:tcp_output.c和__tcp_grow_window()中的tcp_select_initial_window(),tcp_input.c中的tcp_fixup_rcvbuf(),tcp_clamp_window()和tcp_rcv_space_adjust()。 在所有用法中,此值都用于动态控制接收窗口和/或套接字的接收缓冲区,这意味着它将考虑当前流量和系统参数。 对tcp_wmem的类似搜索显示,它仅用于tcp_init_sock()(tcp.c)和tcp_sndbuf_expand()(tcp_input.c)中套接字的发送缓冲区中的动态更改。

因此,当您希望内核更好地调整流量时,最重要的值是tcp_r / wmem。 套接字的大小通常由用户覆盖,默认值并不重要。 要进行精确的调整操作,请尝试阅读tcp_input.c中标记为“调整”的注释。 那里有很多有价值的信息。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM