linux查看无线网卡属性(linux下网卡网络功能offload介绍)
当前公司内部分老旧的机型仍然使用了不支持多队列的Intel e1000e网卡. 云计算/虚拟化技术正如火如荼的实践着,虚拟机的网络跟物理机的网络架构差异很大。不管哪种虚拟化技术(XEN, KVM, Container)均采用了bridge外加虚拟网络设备的架构,虚拟网络数据传输路径长,虚拟网卡是单队列的网卡设备。就算是使用SRIOV的网络架构,业务子机里也仍然只使用一个队列来收发包。如何充分利用CPU的资源?高负载的业务接入, 逻辑如何在不修改程序的情况,平衡过渡到虚拟化环境呢?对于部分老旧的机型仍然使用了不支持多队列的Intel e1000e网卡,有办法优化吗?方法很多,本文仅介绍了与Linux网络协议栈互补的一系列技术。这些技术包括:
Intel千兆网卡硬件接收队列的选择示意图
RSS中的过滤器是一个基于L3和L4层头部的hash函数,例如,基于IP地址和TCP端口的4元组的hash函数。最常见的RSS硬件实现中,使用了128个间接表,其中每个表存储一个队列号(注,网卡的队列数比较少,比如igb是8个,bnx2是5个)。针对某个包而言,使用这个包计算出的hash值(hash是Toeplitz算法)的低7位先确定间接表,再从间接表中的值获取相应的队列号。简单的说,Intel的千兆网卡硬件支持128个数据流的分类,这些数据流可以交给8个队列来接收。
一些高级的网卡允许使用可编程的过滤器来控制包属于哪个队列。例如,绑定TCP端口80的webserver,数据包能被指向某个队列。“n-tuple”过滤器可以通过ethtool的 --config-ntuple来配置。(注: 2.6.36开始引入!)
==== RSS Configuration
多队列网卡的驱动提供了一个内核模块参数,用来指定硬件队列个数。例如,bnx2x驱动使用的参数是num_queues. 如果设备支持足够多的队列,一个典型的RSS配置中,最好的是一个CPU一个接收队列。或者至少每个内存域一个接收队列,一个内存域包含一系列的CPU,并共享一个特殊的内存级别(L1,L2,NUMA节点等等)。
RSS设备的间接表,在驱动初始化的时候被映射。默认的映射是队列均匀的发布在间接表中。但是,在运行的时候,使用ethtool命令 (--show-rxfh-indir and --set-rxfh-indir),
间接表可以被查看,也可以被修改。修改间接表,可以给不同的队列不同比例的权重。
== RSS IRQ Configuration
每个接收队列有一个单独的IRQ,即中断号。NIC通过IRQ来通知CPU什么时候新的数据包到达了指定的队列。PCIe设备使用MSI-X来路由每个中断到CPU。有效的队列到IRQ的映射是由/proc/interrupts来制定的。默认,一个中断能被任何一个CPU处理。因为一个重要的包处理部分发生在接收中断处理函数函数中,在CPU中平分接收中断是有优点的。如果要手动的调节每个中断的亲和性,可以参考Documentation/IRQ-affinity。一些系统会运行irqbalance服务,这个服务会动态的优化IRQ的亲和性,因此会覆盖任何手动设置。
== Suggested Configuration
当关注低延时或者接收中断处理成为瓶颈时,应该启用RSS。分担负载在不同的CPU之间,
减少了队列长度。对于低延时的网络,最佳的设置是创建和CPU个数一样多的队列。最高效的配置是拥有最少的队列,并且没有队列溢出。这是因为,默认下中断聚合启用的情况下,中断的总数目会随着每个增加的队列而增加。
每个cpu的负载可以使用mpstat工具来观测到。但是,注意,启用超线程的处理器,每一个超线程代笔了单独一个cpu。对于中断处理,在最初的测试中显示超线程并没有产生优势。所以,根据CPU的核个数,而不是逻辑cpu个数,来限制队列数目。
(完)
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com