[英]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.