Unix 当使用`netstat-s时,`TCPBacklogDrop`是什么意思`

Unix 当使用`netstat-s时,`TCPBacklogDrop`是什么意思`,unix,networking,tcp,netstat,Unix,Networking,Tcp,Netstat,全部 最近,我正在使用命令在unix系统上调试一个问题 netstat-s 我得到了一个输出 $ netstat -s // other fields // other fields TCPBacklogDrop: 368504 // other fields // other fields 我搜索了一段时间来理解这个字段的含义,主要得到了两个不同的答案: 这意味着您的tcp日期接收缓冲区已满,并且有一些包溢出 这意味着您的tcp接受缓冲区已满,并且存在一些断开连接 哪个是正确的?任何

全部

最近,我正在使用命令在unix系统上调试一个问题

netstat-s

我得到了一个输出

$ netstat -s

// other fields
// other fields

TCPBacklogDrop: 368504

// other fields
// other fields

我搜索了一段时间来理解这个字段的含义,主要得到了两个不同的答案:

  • 这意味着您的tcp日期接收缓冲区已满,并且有一些包溢出
  • 这意味着您的tcp接受缓冲区已满,并且存在一些断开连接
  • 哪个是正确的?任何支持它的官方文档?

    解释#2指等待接受的套接字队列,可能是因为其大小由名为
    backlog
    listen
    的参数值设置(或多或少)。然而,这种解释是不正确的

    为了理解为什么解释#1是正确的(尽管不完整),我们需要咨询来源。首先请注意,字符串
    “TCPBacklogDrop”
    与Linux标识符
    Linux\u MIB\u TCPBacklogDrop
    (例如,请参阅)。这在
    tcp\u add\u backlog
    中递增

    粗略地说,有3个队列与已建立TCP套接字的接收端关联。当数据包到达时,如果应用程序在读取时被阻止,则通常会将其发送到预队列,以便在应用程序进程的用户空间中进行处理。如果无法将其放入预队列,并且套接字未锁定,则会将其放入接收队列。但是,如果套接字被锁定,它将被放置在待办事项队列中进行后续处理

    如果您按照代码进行操作,您将看到从
    tcp\u add\u backlog
    调用
    sk\u add\u backlog
    将返回
    -ENOBUFS
    ,前提是接收队列已满(包括backlog队列中的队列),数据包将被丢弃,计数器将递增。我说这种解释是不完整的,因为当“接收队列”已满时(我们现在理解为没有单个队列那么简单),这不是唯一可以丢弃数据包的地方


    我不认为在正常操作条件下,这种丢弃会频繁和/或出现问题,因为发送方的TCP堆栈应该遵守接收方的公告窗口,并且不会发送超过接收队列容量的数据(除了zero window Probe和较旧的内核版本,它们的计算可能会在接收窗口实际未满时导致丢弃)。如果这表明存在问题,我会开始担心恶意客户端(可能是某种形式的DDOS)或者某些故障导致套接字锁被保留较长时间。

    非常感谢。客户端使用短tcp链接的音调,并抱怨请求延迟过多。我增加了一些选项值(/proc/sys/net/core/somaxconn、/proc/sys/net/ipv4/tcp_max_syn_backlog、/proc/sys/net/core/netdev_max_backlog、/proc/sys/net/ipv4/tcp_*mem)你使用的内核版本是什么?谷歌搜索显示,旧版本可能会丢弃路由到待办事项队列的数据包,即使客户端发送的数据量小于公布的接收窗口。4.1.0-33.el6。(我的公司名称).x86_64好吧,我可能永远也找不到这方面的源代码,但vanilla 4.1和head之间的差异在确定是否删除的计算中确实存在差异。它增加了一些净空,因为放置在待办事项上的数据包无法合并。因此,如果有大量数据包从待办事项中删除,请升级调整内核版本可能会带来一些缓解。