我的实验室中有一个在 Ubuntu 上运行的测量服务器。还有一个 C 程序,它通过 TCP 连接接收数据并尽快发送回复。
配置
- CPU:2 个处理器 x 4 核 - Intel(R) Xeon(R) CPU E5345 @ 2.33GHz
- 内存:12 GB
- 网卡:英特尔公司 80003ES2LAN 千兆以太网控制器 / 82546EB 千兆以太网控制器
- 网络交换机:Cisco Catalyst 2960
- 数据信息:数据块大约每 10 毫秒出现一次。数据块大小约为 1000 字节。
接收数据包时的网络延迟非常关键(几十微秒很重要)。我已将程序优化到最大限度,但我没有调整 Ubuntu 的经验。
在 Ubuntu 中可以配置什么来减少处理/发送数据包的本地延迟?
答案1
诚实地,我不会用 Ubuntu 来做这个...但有些选项可应用于任何 Linux 变体。
您将需要创建网络堆栈缓冲区:
net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
如果应用程序正在写入磁盘,则可能需要更改调度程序/电梯(例如deadline
电梯)。
在服务器级别,您可以修改CPU调节器和功率以及CPU频率管理(P-States、C-States)。
在操作系统级别,您可以更改应用程序的实时优先级(chrt
),进行优化以减少中断,将其固定到 CPU 或 CPU 组(taskset
),并停止任何不必要的服务或守护进程。
您还可以在以下网址看到一些建议:如何解决 2 个 Linux 主机之间的延迟问题
如果不了解所涉及的硬件或网络设备,就很难获得更具体的信息。
答案2
如果您选择高性能路线,通常您会希望运行尽可能少的其他(计划的)进程,因为它们会干扰您的应用程序。
Linux 与经典的 UNIX 操作系统一样,旨在以公平的方式同时运行多个应用程序,并试图防止资源匮乏,而您的目标恰恰相反,除了您的应用程序之外,其他一切都处于资源匮乏状态。操作系统级别的简单步骤正在改变好的应用程序的级别和实时优先级,改变调度程序或者去即时的核心。
TCP/IP 通常经过调整以防止连接中断并有效利用可用带宽。为了从非常快的链接中获得尽可能低的延迟,而不是从某些中间链接更受限制的连接中获得尽可能高的带宽,您需要调整网络堆栈的调整。
sysctl -a
将显示您可以调整的一系列内核设置。设置取决于您是否使用 IPv4 或 IPv6,以及您在应用程序中已经执行的具体操作,但您可能感兴趣的是:
net.ipv4.tcp_window_scaling=1
RFC 1323 - 支持大于 64K 的 IPV4 TCP 窗口大小 - 通常需要在高带宽网络上使用net.ipv4.tcp_reordering=3
IPV4 数据包可以在 TCP 数据包流中重新排序的最大次数,而无需 TCP 假设数据包丢失并进入慢启动。net.ipv4.tcp_low_latency=1
旨在优先考虑低延迟而不是高吞吐量;设置 =1 将禁用 IPV4 tcp 预排队处理net.ipv4.tcp_sack=0
设置为 1 可启用 IPV4 的选择性确认,这需要启用 tcp_timestamps 并增加一些数据包开销,如果您没有遇到数据包丢失,则不需要这些开销net.ipv4.tcp_timestamps=0
仅在需要麻袋的情况下才建议。net.ipv4.tcp_fastopen=1
启用在打开的 SYN 数据包中发送数据。
大多数(如果不是全部的话)都记录在内核源代码。
当然,您可以编写原始 TCP 套接字并在很大程度上绕过内核 TCP/IP 堆栈。
高度调整的系统通常在受信任的网络中运行,并且其本地(iptables)防火墙将被禁用。