Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调整linux网络缓冲区大小_Linux_Sockets_Kernel - Fatal编程技术网

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

如何调整linux网络缓冲区大小,linux,sockets,kernel,Linux,Sockets,Kernel,我正在阅读《卡夫卡权威指南》,第35页(网络部分)中写道: 。。。第一个调整是更改默认值和最大值 为每个套接字的发送和接收缓冲区分配的内存。这将显著提高大型传输的性能。每个套接字的发送和接收缓冲区默认大小的相关参数为net.core.wmem_default和 net.core.rmem\u默认值。。。。。。 除了套接字设置外,TCP套接字的发送和接收缓冲区大小必须使用net.ipv4.TCP_wmem和net.ipv4.TCP_rmem参数分别设置 为什么要同时设置net.core.wmem和

我正在阅读《卡夫卡权威指南》,第35页(网络部分)中写道:

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


为什么要同时设置net.core.wmem和net.ipv4.tcp_wmem?

简短回答-r/wmem_默认值用于设置静态套接字缓冲区大小,而tcp_r/wmem用于控制tcp发送/接收窗口大小和缓冲区动态

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

这将初始化用于发送和接收数据包的套接字缓冲区,稍后可能会在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_select_initial_window()和tcp_input.c中的tcp_grow_window()、tcp_fixup_rcvbuf()、tcp_clamp_window()和tcp_rcv_space_adjust()。在所有使用中,该值用于动态控制接收窗口和/或套接字的接收缓冲区,这意味着它将考虑当前流量和系统参数。 对tcp_wmem的类似搜索显示,它仅用于tcp_init_sock()(tcp.c)和tcp_sndbuf_expand()(tcp_input.c)中套接字发送缓冲区的动态更改

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


希望这有帮助。

哇,太棒了!非常感谢!!
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);