我正在Ubuntu16.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个示例就需要精确地执行1秒。奇怪的是,当实际获取数据时,周期要短得多--在一次测试中大约650 is -在故障样本之前成功的连接更多(在这种情况下,故障样本只需要650 is间隔的400 is)。下面是两个实例的连接延迟与时间的关系图。轴以秒为单位)。
连接之间的延迟。用蓝色连接并关闭系统,加载系统为红色.
下面是我们尝试调试的子集,以及在每种情况下问题是否持续存在。为简短表示歉意;如果任何步骤不清楚,我很乐意提供后续信息。
shutdown()之前调用close():问题仍然存在asyncore运行服务器:问题仍然存在net.ipv4.tcp_*内核参数:问题仍然存在从以上所述,我所能看到的唯一一致性就是运行在这台特定机器上的python遇到了这个问题。我还没有机会在另一个Ubuntu16.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调用,以查看套接字和连接的参数是否/如何不同。
发布于 2016-07-04 20:06:14
谢谢你的有益建议。回想起来,tcpdump是我应该检查的第一件事,所以感谢Venkat代替我自己的判断。
这似乎是供应商软件的一个缺陷。Tcpdump显示,当运行python测试时,设备会抢先握手,并发送对上次发出的数据查询的响应。事实上,在丢包1秒后,SYN被重新传输,并且循环继续进行.
这9个数据包似乎是延迟的巧合(这是由发布的图中的漂移所暗示的)--响应立即被触发,并且恰好抢占了第9个数据包;使用netcat的单个请求(例如printf "" | nc 1.2.3.4 5678)将触发数据重传。
我们将努力与供应商合作,以解决这个问题。同时,我们可以尝试使用settimeout并通过重新建立连接来处理超时异常。
再次感谢您!
https://stackoverflow.com/questions/38166512
复制相似问题