找出 tcp rcvpruned 的原因?

找出 tcp rcvpruned 的原因?

我每天在负载均衡器上收到一些 rcv 修剪的数据包,我想知道原因是什么:

在此输入图像描述

但是,根据我的 tcp_mem 与 tcp_mem 用法,我不明白为什么某些数据包被修剪:

cat /proc/sys/net/ipv4/tcp_mem
6178080 8237440 12356160

在此输入图像描述

答案1

TCP RcvPrunedMIB 在内核离开该tcp_prune_queue()功能之前递增,导致数据包丢失。

在此之前,内核将尝试折叠套接字缓冲区中的数据(将数据压缩在一起并丢弃开销)。数据将首先从无序队列中修剪,然后从常规有序队列中修剪。

这意味着您的套接字面临内存压力,可能您的套接字缓冲区不够大。

你上面说:

net.ipv4.tcp_rmem = 183936 245248 367872

最大值远远不够大。将其增加到该值的 10 倍,以便为内核提供根据需要增加套接字内存的空间。也增加net.core.rmem_max,因为它用于 TCP 窗口记帐。

我不确定您是如何计算缓冲区大小的,但如果您要平衡大量小数据包流量(例如 HTTP 请求),那么大部分缓冲区使用量将是开销。

根据您运行的内核,对此有不同的解释。 “旧”方法做出了一些不准确的假设,但事实证明相当宽容,“新”方法准确地计算并要求缓冲区大小比以前大一点。

改变这一点的补丁集主要围绕 IIRC 的计算,skb->truesize并在内核 3.0 和 3.10 之间的某个时间应用。

您还需要检查 的值net.ipv4.tcp_mem并确保您没有限制允许 TCP 使用的总内存量。该可调参数的测量单位为页面,而不是字节。就我个人而言,我只是将所有值设置得很大,这样它们就永远不会受到影响。根据需要购买更多内存。

相关内容