繁体   English   中英

确定 TCP listen() 队列中的当前积压连接数

[英]Determine the current number of backlogged connections in TCP listen() queue

有没有办法找出当前在 Linux 上的 TCP 套接字上等待 accept() 的连接尝试次数?

我想我可以计算在每个事件循环上点击 EWOULDBLOCK 之前成功的 accepts() 的数量,但我使用的是隐藏这些细节的高级库(Python/Twisted)。 此外,它使用 epoll() 而不是老式的 select()/poll() 循环。

我试图对高性能非阻塞网络服务器上的负载有一个大致的了解,我认为这个数字将是一个很好的表征。 平均负载/CPU 统计数据没有多大帮助,因为我在并发工作进程中进行了大量磁盘 I/O。 Linux 上的大多数这些统计数据都将等待磁盘 I/O 所花费的时间作为负载的一部分(对于我的特定服务器架构而言并非如此)。 accept() 和 response 之间的延迟也不是一个好的衡量标准,因为一旦服务器开始处理每个请求,通常会很快处理它。 我只是想知道我离达到一个断点有多近,在这个断点上,服务器不能比他们进来的更快地分派请求。

我见过的 BSD 套接字 API 中没有此功能。 我怀疑这是否真的是一种有用的负载量度。 一方面,您假设客户端没有连接池,并且您还假设延迟完全表现为挂起的连接。 但是因为无论如何你都无法得到这个数字,所以这一点没有实际意义。

假设未启用 SYN cookie(或由于音量未触发),我认为您应该能够通过检查 netstat 的输出并查看有多少针对您的端口的连接处于 SYN_RECV 状态来获得一个近似数字.

这里有一个 Python 小技巧,可以为您提供给定侦听端口的数字:

!/usr/bin/python

import sys

STATE_SYN_RECV = '03'

def count_state(find_port, find_state):
    count = 0
    with open('/proc/net/tcp', 'r') as f:
        first = True
        for line in f:
            if first:
                first = False
                continue
            entries = line.split()
            local_addr, local_port = entries[1].split(':')
            local_port = int(local_port, 16)
            if local_port != find_port:
                continue
            state = entries[3]
            if state == find_state:
                count += 1
    return count


if __name__ == '__main__':
    if len(sys.argv) != 2:
        print "Usage: count_syn_recv.py <port>"
        sys.exit(1)

    port = int(sys.argv[1])

    count = count_state(port, STATE_SYN_RECV)
    print "syn_recv_count=%d" % count

您可以查看ss输出中未unacked值,例如在检查端口 80 时:

ss -lti '( sport = :http )'

输出可能如下所示:

State  Recv-Q  Send-Q  Local Address:Port  Peer Address:Port   
LISTEN    123      0              :::http               :::*
    rto:0.99 mss:536 cwnd:10 unacked:123

有关未unacked确实是 TCP 连接积压的详细证明(包括内核源和所有内容),请参阅Ryan Frantz撰写的详细文章“Apache TCP 积压” 请注意,您可能需要一个相当新版本的ss才能包含未unacked输出。 至少我的( iproute2-ss131122 )没有提供它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM