我有一个设置,其中一个“主”Linux 系统与 3 个同样在专用以太网接口上运行 Linux 的“从”系统(仅主系统和 3 个从系统)进行通信。从系统每 5 毫秒左右通过 UDP 向主系统发送数据。此外,主系统有应用程序通过 FTP、SCP 等协议从所有 3 个从系统连续提取文件。
主服务器需要尽快收集 UDP 数据包,最好在 3-4 毫秒内。当我在主服务器上只运行 UDP 接收应用程序的情况下运行设置时,我发现这个条件很容易满足。但是,当 FTP/SCP/等应用程序也保持运行状态时,接收时间会出现峰值。传输的文件大小相当小,但大约每秒都会从每个从服务器检索一个新文件。
在没有激活文件传输应用程序的情况下运行设置时,结果很好,这表明 Linux 网络“排队/调度”似乎对 UDP 和其他协议都给予了类似的优先级。也许如果正在进行 FTP,它甚至会阻止 UDP?
有没有办法告诉 Linux(以编程/命令的方式)给予 UDP 通信最高优先级,并在 UDP 消息准备好接收时“暂停”其他事情,如文件传输?
编辑 1:我添加了这些来根据协议类型控制流量(UDP 是协议 17)
tc qdisc add dev eth0 root handle 10: prio
tc filter add dev eth0 parent 10: protocol ip prio 1 u32 match ip protocol 17 0xff flowid 10:1
tc filter add dev eth0 parent 10: prio 3 protocol all u32 match u32 0 0 flowid 10:3
第三个是我认为的“全部匹配过滤器”。然而,这并没有什么不同。我仍然得到相同的峰值。
答案1
首先:Linux 不是实时操作系统。没有办法告诉内核某些应用程序必须在给定的时间范围内(例如 3-4 毫秒)对某些事件做出反应,也无法保证这一点。因此,每当系统加载时,您都必须假设会有延迟。
也就是说,您可以调整一些有利于 UDP 数据包接收应用程序的事情:
Linux 具有网络流量控制(例如交通管制指南,示例脚本带宽有限的 DSL),您可以使用它来设置具有不同优先级的不同队列,例如为您的 UDP 数据包和大数据包。
Linux 有cgroups(控制组),您可以使用它为您的 UDP 接收进程和
ftpd
/sshd
等进程分配不同的 I/O 优先级和限制,因为我猜测其他进程的磁盘 I/O 也会阻碍您的 UDP 数据包接收应用程序(请进行实验以确定是否属实)。
再说一遍:没有办法保证任何事情。