我每天在负载均衡器上收到一些 rcv 修剪的数据包,我想知道原因是什么:
但是,根据我的 tcp_mem 与 tcp_mem 用法,我不明白为什么某些数据包被修剪:
cat /proc/sys/net/ipv4/tcp_mem
6178080 8237440 12356160
答案1
TCP RcvPruned
MIB 在内核离开该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 使用的总内存量。该可调参数的测量单位为页面,而不是字节。就我个人而言,我只是将所有值设置得很大,这样它们就永远不会受到影响。根据需要购买更多内存。