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

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

我想我可以统计在每个事件循环中触发EWOULDBLOCK之前成功的accept()的数量,但是我使用隐藏这些细节的高级库(Python / Twisted)。 它也使用epoll()而不是老式的select()/ poll()循环。

我试图得到一个高性能的无阻塞networking服务器上的负载的一般意义,我认为这个数字将是一个很好的描述。 加载平均值/ CPU统计数据帮助不大,因为我在并发工作进程中执行了大量的磁盘I / O操作。 Linux上的这些统计数据中的大多数花费了等待磁盘I / O作为加载的一部分(对于我的特定服务器体系结构来说,这不是)。 accept()和response之间的延迟也不是一个好的措施,因为一旦服务器接近它,每个请求通常会得到很快的处理。 我只是试图找出我有多接近达到一个突破点,服务器不能更快地派遣请求比他们进来。

Solutions Collecting From Web of "确定TCP listen()队列中的积压连接的当前数量"

在我见过的BSD套接字API中没有这个功能。 我怀疑这是否真的是一个有用的衡量指标。 首先,您假设客户端没有连接池,并且您还假设延迟完全表现为未决连接。 但是,无论如何,你无法得到这个数字,这一点是没有意义的。

假设没有启用SYN cookies(或者由于音量没有被触发),我想你应该能够通过检查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 

您可以查看输出中未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确定的unacked确实是TCP连接积压,请参阅Ryan Frantz的详细文章“Apache TCP Backlog” 。 请注意,您可能需要一个非常新的ss版本来包含未包含的输出。 至少我的( iproute2-ss131122 )不提供它。