[译]Scaling in the Linux Networking Stack: XPS

来源:互联网 发布:汤臣倍健褪黑素片 知乎 编辑:程序博客网 时间:2024/05/16 19:18

本文档描述了一系列在Linux网络栈中的补充技术,以增加并行性、提高多处理器系统的性能。

简介

本文是Scaling in the Linux Network第四部分,介绍数据发送端的技术扩展。原文链接:
https://www.kernel.org/doc/Documentation/networking/scaling.txt

XPS: Transmit Packet Steering

XPS是在多队列设备上发送数据包时智能地选择要使用哪个发送队列的机制。 为了实现这一点,记录了从CPU(核)到硬件队列的映射。 此映射的目标是:将队列专用(绑定)到CPU的一个子集上,这些队列的发送由该集合内的一个CPU进行处理。这个选择有两个好处。 首先,设备队列锁的争用大大减少,因为较少的CPU争用相同的队列(如果每个CPU都有自己的传输队列,则可以完全消除争用)。其次,减少发送完成时的高速缓存未命中率,特别是对于保存sk_buff结构的数据高速缓存行。

通过设置可能使用该队列进行传输的CPU的位图,为每个发送队列配置XPS。 从CPU到发送队列的反向映射由每个网络设备计算并为维护。当在流中发送第一个数据包时,调用函数get_xps_queue()来选择一个队列。此功能将运行的CPU的ID作为密钥进入CPU到队列查找表。如果ID与单个队列匹配,则用于传输。如果多个队列匹配,则通过使用流哈希来计算索引到集合中。

选择队列用来发送特定流,并保存在该流的相应套接字结构(例如TCP连接)中。 该传输队列用于在流上发送的后续数据包,以防止无序(ooo)数据包。保存选定队列还会省去流程中的所有数据包上调用get_xps_queues()的消耗。为了避免ooo数据包,只有流中的一个数据包设置了skb-> ooo_okay,则可以更改流的队列。 该标志表示流中没有未完成的数据包,因此发送队列可以更改,而不会产生无序数据包的风险。 传输层负责适当地设置ooo_okay。 例如,TCP在已经ack了连接的所有数据时可以设置ooo_key。

XPS 配置

只有设置kconfig符号CONFIG_XPS(默认情况下为SMP),XPS才可用。只有明确配置的情况下XPS才会启用。 要启用XPS,可以使用sysfs文件条目配置可能使用传输队列的CPU的位图:

/sys/class/net/<dev>/queues/tx-<n>/xps_cpus

XPS建议配置

对于具有单个传输队列的网络设备,XPS配置没有任何效果,因为在这种情况下没有选择。 在多队列系统中,XPS优选地被配置成使得每个CPU映射到一个队列上。 如果系统中有多少个队列,那么每个队列也可以映射到一个CPU上,从而产生不具有争用的独占配对。 如果队列数少于CPU,那么可以选择共享cache的CPU共享给定队列。

Per TX Queue rate limitation

这些是由HW实现的速率限制机制,当前通过设置Mbps值来支持最大速率属性。

/sys/class/net/<dev>/queues/tx-<n>/tx_maxrate

默认值为零,表示禁用。

更多信息

RPS and RFS were introduced in kernel 2.6.35. XPS was incorporated into
2.6.38. Original patches were submitted by Tom Herbert (therbert@google.com)

Accelerated RFS was introduced in 2.6.35. Original patches were submitted by Ben Hutchings (bwh@kernel.org)

Authors:
Tom Herbert (therbert@google.com)
Willem de Bruijn (willemb@google.com)

0 0
原创粉丝点击