2016-07-03 48 views
2

我在Ubuntu 16.04机器上运行数据采集系统。它部署在远程站点,所以我改变物理配置的能力是有限的。我们确实有一个现场的人员能够通过配置执行简单的测试。Python套接字连接在Ubuntu上每9个连接有一秒延迟16.04

我们正在运行一个python脚本来做数据采集。但是,我们注意到,在高数据速率下,我们在数据缓冲区中出现了奇怪的备份。几个小时的调试后,我们能够缩小问题下到下面的测试案例:

for i in xrange(500): 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.connect(('1.2.3.4', 5678)) 
    sock.close() 

当上面的代码执行大多数样品执行几乎在瞬间,但每一个样品9日恰好需要一秒钟执行。奇怪的是,实际采集数据时,时间要短得多 - 在一次测试中大约需要650ms左右,并且在毛刺采样之前有更多连接成功(在这种情况下,毛刺采样只需要650ms间隔的〜400ms)。下面是两个实例的连接延迟与时间的关系图。轴是以秒为单位)。

Latency between connections. connect-and-close in blue, system under load in red.

这是我们尝试调试的一个子集,以及是否问题依然存在或者没有在每种情况下。简洁的道歉;如果有任何不清楚的地方,我很乐意提供后续信息。

  • 数据采集与netcat的:工作2台的Ubuntu 14.04机器之间
  • 运行Python脚本(针对NC监听器,不能与数据源来测试):工作
  • 连接到运行一个netcat的监听器的另一台计算机,代替数据源,从采集计算机:问题仍然存在
  • 呼叫shutdown()close()之前:问题仍然存在
  • 使用asyncore运行服务器尝试:问题仍然存在
  • 试图在线程打开插座:问题仍然存在
  • 已切换各种net.ipv4.tcp_*内核参数:问题仍然存在

从上面的,我已经能够辨别的唯一一致的是,这个特定的机器上运行的蟒蛇遇到这个问题。我还没有机会在另一个Ubuntu 16.04(或任何其他4.x内核)上测试此功能,所以我不知道它是否与网络堆栈中的更改有关。我会继续运行各种测试来尝试诊断这个问题,但任何想法都会受到赞赏!

更新:

ulimit -a结果(没有跳出我的异常)。

core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 40 
file size    (blocks, -f) unlimited 
pending signals     (-i) 32053 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 32053 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

我将尽快运行TIME_WAIT测试并发布结果。我希望运行的另一个测试是使用strace运行netcat和python调用,以查看套接字和连接的参数是否不同。

+0

请检查'ulimit'。假设远程服务器具有处理所有传入连接的能力,我怀疑必须有一些限制因素可用于连接数量。另外,使用netcat来监视TIME_WAIT套接字,可能是因为连接没有正确关闭。如果是这种情况,请尝试:'sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)'。请让我知道进度:) – purrogrammer

+0

什么是侦听队列值?在服务器端?当它填满时,由客户端发送的syn将被丢弃,并发生tcp重新传输。这个默认值是3秒(可能是你的系统调整为1秒),为了确认,你应该捕获tcpdump并验证 – VenkatC

回答

1

谢谢你的建议。回想起来,tcpdump是我应该检查的第一件事,所以谢谢Venkat代替我自己的判断。

这似乎是供应商软件的一个错误。 Tcpdump显示,在运行python测试时,设备将抢占握手并发送重发响应给最后发出的数据查询。事实上,在数据包丢失后,SYN被重新传输1秒钟,并且循环继续。

9个数据包似乎是等待时间的重合(这是由发布图中的漂移提示的) - 响应立即触发,恰好发生了抢占第9个数据包的事件;使用netcat的单个请求(例如printf "" | nc 1.2.3.4 5678)将触发数据重新传输。

我们将尝试与供应商合作解决此问题。同时,我们可以尝试使用settimeout并通过重新建立连接来处理超时异常。

再次感谢您!