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