我们有一个使用两种类型的套接字的应用程序:侦听UDP套接字和活动的SCTP套接字。

在某些时候,我们会在具有高IO活动(例如“ dd,tar,...”)的同一台计算机上运行脚本,大多数情况下,这些IO繁重的应用程序运行时,我们似乎会遇到以下问题:


UDP套接字关闭
SCTP套接字仍处于活动状态,我们可以在/ proc / net / sctp / assocs中看到它,但是不再从该套接字收到任何流量(直到我们重新启动应用程序)


为什么这些I / O操作会以这种方式影响基于网络的应用程序?
是否有任何内核配置可以避免这些问题?
我本来希望某些数据包在UDP上丢失,而某些重试在SCTP套接字上,但不是这种现象。

该应用程序在具有64位4四核CPU和RHEL OS的服务器上运行

# uname -a
Linux server1 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:15 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux

最佳答案

当您说UDP套接字关闭时,您的意思是什么?您尝试send失败了吗?

对于SCTP,您可以在这些I / O操作运行时(最好在对等方上运行wirehark)时收集wireshark或pcap跟踪吗?我的猜测是(无需查看代码即可进行的有根据的猜测),当这些I / O操作进入画面时,您的进程将因CPU时间而饥饿。另一端发送SCTP Heartbeat messages,但没有回复。或者,如果数据正在流动,则对端没有收到任何SACKS,因为您端的SCTP堆栈尚未处理它们。

因此,对等方在内部中止关联并停止向您发送数据(因为它认为所有路径都为down ergo而不发送ABORT。在这种情况下,您的SCTP堆栈仍会认为关联处于活动状态)。
尝试确认对等端的Heartbeat timeout, RTO timeout,SACK timeout, maximum Path retransmission & max Association retransmission值是什么。我尚未使用内核SCTP,但是sysctl应该能够为您提供这些值。

无论哪种方式,在观察到此问题时收集pcap跟踪都可以使我们更好地了解问题所在。我希望它能帮助。

关于c - IO繁重操作与网络应用程序监听UDP和SCTP数据之间的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3108751/

10-12 02:48