总结

我们将优化以下关键领域:

  • NIC卸载技术
  • TCP_QUICKACK以减少延迟
  • net.core.rmem_max调优
  • SO_BUSY_POLL提高CPU效率
  • 减少延迟峰值的策略

速度的需求:为什么是100Gbps?

在深入细节之前,让我们先解决一个关键问题:为什么是100Gbps?在高频交易的世界中,每微秒都至关重要。我们不仅仅是在谈论炫耀的资本,而是在谈论赚取数百万和损失惨重之间的差别。

但实现和维持100Gbps的吞吐量不仅仅是增加硬件的问题。这需要对系统进行精细调整,以充分利用现有基础设施的性能。这就是内核调优的作用所在。

NIC卸载:让硬件承担繁重的工作

首先:如果你没有利用NIC卸载,你就浪费了性能。现代NIC能够处理许多网络相关任务,否则这些任务会拖慢CPU。以下是检查当前卸载设置的方法:

ethtool -k eth0

查找以下关键卸载:

  • tcp-segmentation-offload (TSO)
  • generic-receive-offload (GRO)
  • receive-side-scaling (RSS)

要启用这些卸载,可以使用:

ethtool -K eth0 tso on gro on

但等等,还有更多!对于100Gbps网络,考虑启用以下高级卸载:

  • ntuple过滤
  • 接收包转向 (RPS)
  • 接收流转向 (RFS)

这些可以显著减少CPU使用并改善包在核心间的分配。

TCP_QUICKACK:在高频交易中,耐心不是美德

在高频交易中,等待ACK就像等待油漆干一样——没人有时间等。TCP_QUICKACK就是为此而生。这个小选项告诉内核立即发送ACK,而不是延迟发送。

要在系统范围内启用TCP_QUICKACK:

echo 1 > /proc/sys/net/ipv4/tcp_quick_ack

对于应用程序中的特定套接字:


int quickack = 1;
setsockopt(socket_fd, IPPROTO_TCP, TCP_QUICKACK, &quickack, sizeof(quickack));

请记住,虽然这可以显著减少延迟,但可能会增加网络流量。与所有优化一样,确保在应用前后进行测量,以确保它对你的特定用例有益。

调优net.core.rmem_max:大小很重要

对于接收缓冲区,通常越大越好——但有个限度。net.core.rmem_max参数设置了最大接收套接字缓冲区大小(以字节为单位)。对于100Gbps网络,你需要将其调高:

sysctl -w net.core.rmem_max=16777216

这将最大接收缓冲区设置为16MB。但不要止步于此!你还需要调整这些相关参数:


sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"

请记住,这些更改是临时的。要使其永久生效,请将其添加到/etc/sysctl.conf中。

SO_BUSY_POLL:当忙等待是件好事

在低延迟网络的世界中,有时最好的等待方式就是不等待。这就是SO_BUSY_POLL的作用。这个套接字选项允许内核忙轮询传入的数据包,而不是依赖中断。

要在应用程序中启用SO_BUSY_POLL:


int busy_poll = 50; // 时间以微秒为单位
setsockopt(socket_fd, SOL_SOCKET, SO_BUSY_POLL, &busy_poll, sizeof(busy_poll));

你也可以在系统范围内启用忙轮询:


echo 50 > /proc/sys/net/core/busy_poll
echo 50 > /proc/sys/net/core/busy_read

使用此设置时要小心,因为它可能会增加CPU使用率。最好在专用的网络核心上使用。

驯服延迟怪兽:减少峰值的策略

即使有了所有这些优化,延迟峰值仍可能出现。以下是一些额外的策略来控制它们:

1. IRQ亲和性

确保网络中断由专用CPU核心处理:


echo 2-3 > /proc/irq/YOUR_ETH_IRQ/smp_affinity_list

2. CPU隔离

为关键的网络任务隔离CPU:


isolcpus=2-3 nohz_full=2-3 rcu_nocbs=2-3

将这些添加到内核启动参数中。

3. NAPI(新API)

确保在网络接口上启用NAPI:


ethtool -k eth0 | grep "napi-tx-"

4. 调整调度器

对于延迟敏感的任务,考虑使用SCHED_FIFO调度器:


struct sched_param param;
param.sched_priority = 99;
pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);

综合考虑:整体方法

请记住,为100Gbps微服务优化不仅仅是调整单个设置。这是对整个系统采取整体方法。以下是一些最终提示,以将所有内容结合在一起:

  • 分析你的应用程序以识别瓶颈
  • 使用perf、火焰图和eBPF等工具进行深入分析
  • 考虑使用DPDK或内核绕过技术以获得极致性能
  • 不要忘记存储I/O——它可能是隐藏的瓶颈
  • 定期对系统进行基准测试和监控,以便及早发现回归

结论:永无止境的速度追求

为100Gbps微服务调优Linux并非易事。这是硬件能力、内核参数和应用级优化的复杂舞蹈。但通过我们所涵盖的技术——从NIC卸载到TCP_QUICKACK,从缓冲区调优到忙轮询——你现在拥有了将高频交易环境提升到新水平的知识。

请记住,降低延迟和提高吞吐量的追求永远不会真正结束。继续实验,继续测量,最重要的是,继续推动可能性的边界。谁知道呢?也许下次我们会讨论为400Gbps进行调优!

“在高频交易的世界中,犹豫者将失去一切。但调优内核者将统治市场。” - 匿名Linux内核专家

现在去征服那些数据包吧!如果你有任何自己的绝佳调优技巧,请在评论中分享。毕竟,在高频交易的残酷世界中,我们都是一起的……直到我们不再是。