首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化linux网络缓冲区大小

如何优化linux网络缓冲区大小
EN

Stack Overflow用户
提问于 2017-11-17 11:50:59
回答 1查看 4.8K关注 0票数 4

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

..。第一个调整是更改为每个套接字的发送和接收缓冲区分配的默认和最大内存量。这将大大提高大规模转让的绩效。电子邮件发送和接收缓冲区默认大小的相关参数是net.core.wmem_default和net.core.rmem_default.除了套接字设置外,还必须使用net.ipv4.tcp_wmem和net.ipv4.tcp_rmem参数分别设置TCP的发送和接收缓冲区大小。

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

EN

回答 1

Stack Overflow用户

发布于 2017-11-18 07:32:59

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

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

代码语言:javascript
复制
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中重写:

代码语言:javascript
复制
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_grow_window()中的__tcp_grow_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中的注释。那里有很多有价值的信息。

希望这能有所帮助。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47350028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档