【问题标题】:what does `TCPBacklogDrop` means when using `netstat -s`使用`netstat -s`时`TCPBacklogDrop`是什么意思
【发布时间】:2020-07-02 06:20:02
【问题描述】:

全部

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

netstat -s

我得到一个输出

$ netstat -s

// other fields
// other fields

TCPBacklogDrop: 368504

// other fields
// other fields

我搜索了一段时间以了解该字段是什么意思,主要得到了两个不同的答案:

  1. 这说明你的 tcp-date-receive-buffer 已经满了,还有一些包溢出
  2. 这意味着您的 tcp-accept-buffer 已满,并且有一些断开连接

哪个是正确的?有官方文件支持吗?

【问题讨论】:

    标签: unix networking tcp netstat


    【解决方案1】:

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

    要了解为什么解释 #1 是正确的(尽管不完整),我们需要查阅源代码。首先注意字符串"TCPBacklogDrop"与Linux标识符LINUX_MIB_TCPBACKLOGDROP相关联(例如,参见this)。这是在tcp_add_backlog 中增加here

    粗略地说,有 3 个队列与已建立的 TCP 套接字的接收端相关联。如果在数据包到达时应用程序在读取时被阻塞,则通常会将其发送到预队列以在应用程序进程的用户空间中进行处理。如果不能放到prequeue上,并且socket没有锁,就会放到receive queue。但是如果socket被锁定了,就会被放到backlog队列中进行后续处理。

    如果您按照代码进行操作,您将看到如果接收队列已满(包括积压队列中的队列),则从 tcp_add_backlog 调用的对 sk_add_backlog 的调用将返回 -ENOBUFS,并且数据包将下降,计数器增加。我说这种解释是不完整的,因为当“接收队列”已满时(我们现在理解它不像单个队列那么简单),这并不是唯一可以丢弃数据包的地方。

    我不认为在正常操作条件下这种丢弃会频繁和/或有问题,因为发送方的 TCP 堆栈应该遵守接收方的广告窗口,并且不会发送超过接收队列容量的数据(除了零窗口探测和较旧的内核版本,其计算可能在接收窗口实际上未满时导致丢弃)。如果它以某种方式表明存在问题,我会开始担心恶意客户端(可能是某种形式的 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.(my-company-name).x86_64
    • 好吧,我永远不会找到它的来源,但是香草 4.1 和头部之间的差异在确定是否丢弃的计算上确实存在差异。它增加了一些空间,因为放置在 backlog 上的数据包无法合并。因此,如果从积压中丢弃了大量数据包,升级内核版本可能会有所缓解。
    猜你喜欢
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2019-08-24
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多