8

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

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

我试图大致了解高性能非阻塞网络服务器上的负载,我认为这个数字将是一个很好的表征。平均负载/CPU 统计数据没有多大帮助,因为我在并发工作进程中执行了大量磁盘 I/O。Linux 上的大多数这些统计数据都将等待磁盘 I/O 所花费的时间计算为负载的一部分(对于我的特定服务器架构,它不是)。接受()和响应之间的延迟也不是一个好的衡量标准,因为一旦服务器处理了每个请求,它通常会很快得到处理。我只是想找出我距离服务器无法以比它们进来的速度更快的速度发送请求的断点有多近。

4

3 回答 3

2

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

这是一个小 Python hack,它可以为您获取给定侦听端口的数字:

!/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
于 2012-11-14T01:54:01.477 回答
2

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

于 2012-06-20T19:52:41.977 回答
2

您可以查看unacked的输出中的值ss,例如在检查端口 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 Backlog”。请注意,您可能需要一个相当新的版本ss才能unacked包含输出。至少我的 ( iproute2-ss131122) 没有提供它。

于 2017-02-21T00:36:19.423 回答