频道栏目
首页 > 资讯 > 其他 > 正文

节点通信性能调优

18-02-22        来源:[db:作者]  
收藏   我要投稿
节点通信性能调优
1. 节点体系结构
当前主流处理器为多核处理器,一个节点内可存在多块处理器, 它们大多采用 NUMA 体系结构的方式相互连接起来。由于一个节点内存在多个 处理器核,这不可避免地导致某些情况下的多核竞争,这些代价包括多线程同时 竞争相同锁等待、内存远程访问以及 Cache Miss 等开销。
如下图:
在多核处理器飞速发展的同时,多队列网卡技术也获得了广泛应用。其在硬件上实现了多个发送&接收队列结构来高网卡的并行通信能力。考虑到节点内 多个处理器核的竞争、访存局部性等问题,多队列网卡面临着数据投递和中断重定向等问题。如上图所示,网卡在接收数据包时,向哪一个处理器核发起中断, 并将相应的数据投递至哪一个处理器核所对应的内存中,这些问题都将影响着节点的通信性能。
2. 网络通信处理流程
在Linux系统中,网络通信流程分为发送和接收两个相对独立的过程。下文将分别对两个过程进行阐述。
整个流程详细如下:
1) 应用运行在处理器核 Core_i 上,其调用 Socket send/wirte 系统调用发送 数据;
2) 系统调用陷入内核,分配 skb 缓冲区,并调用相应的内核协议栈对数据 和包格式进行加工;
3) 在完成协议处理后,内核调用网卡驱动,选择发送队列 (Tx Queue), 通过硬件网卡将数据发送至网络。当前 Linux 内核存在两种发送队列选 择的方法。一种是根据特定 Hash 方法(如基于数据包五元组的 hash) 选择发送队列,另一种是根据处理器核 Core_i 选择其所对应的发送队列 (如 Linux XPS 机制,其支持处理器核与发送队列的绑定)。这里,我们 记发送队列为 Tx_j,由于所采取的发送队列选择方法的不同,j 不一定等 于i;
4) 在发送队列确定后,内核调用网卡驱动,并填写发送命令,然后网卡硬 件负责将数据发送至网络;
5) 网卡在完成数据包发送后,将产生发送完成中断,中断发向哪一个处理 器核,在哪一个处理器上进行处理也是十分关键。在开启 irq-balance 的 机器上,中断根据 CPU 的负载情况选择相应的处理器;在中断绑定处理 器核的机器上,中断将发往该处理器核。假定中断发往了处理器核 Core_k, 由于中断绑定选择方法的不同,i,j,k 不一定相等;
6) Core_k 接收到发送中断后,调用发送中断处理函数。发送中断处理函数 告知上层协议该数据包发送操作的完成,推动发送队列下一轮的发送, 然后退出。
从发送处理流程上看,针对步骤 3),由于采用 hash 方法,多个处理器核很 可能一起竞争相同的发送队列,从而造成性能的下降。而针对步骤 5),由于完 成中断处理的处理器核与应用所在的处理器核并不一定相同,这很容易引起 Cache 的失效,并会影响其他处理器核上的应用(例如虚拟环境下的 VM)。
整个流程详细如下:
1) 应用运行在处理器核Core_m上,等待接收数据;
2) 网络数据到达网卡后,网卡首先需要确定将数据交由哪一个接收队列(RX
Queue)来处理。当前主要存在两种处理方式。其一是 RSS 机制,网卡 根据数据包头信息通过 hash 的方式来选取 RX 队列,另一种是 ARFS 机 制,网卡根据数据流(应用之间建立的端到端数据通信,与 TCP 链接基 本对应)来选择 RX 队列。假定选择的队列为 RX_n。针对第一种 RSS 方 式,RX_n 很可能将数据包定向发往至其他处理器核 Core_o 上,而第二种 方式可以做到所选的 RX_n 会将数据包定向发往至处理器核 Core_m 上;
3) 在数据包接收完成后,网卡发起网卡中断。如上文所述,中断在 irq_balance 机制下会选择负载比较轻的处理器核。在关闭 irq_balance 的
情况下,RSS 方式会选择接收队列 RX 所对应的处理器核,记为 Core_p; 而在 ARFS 机制下,接收队列会将中断发往处理器核 Core_m(或离 m 比 较仅的处理器核);
4) 处理器核在接收到中断后,调用接收中断处理流程,这里将不探讨NAPI 机制。在 ARFS 机制下,中断下半部分的软中断将在处理器核 Core_m 上 进行。在 RSS 机制下,中断下部分的软中断又可以通过 RFS 机制选择合 适的处理器核进行处理(请参看 RFS 机制,这里不进行探讨),并且在没 有 ARFS 和 RSS 硬件机制的情况下,linux 内核又有软件层次的 RPS 机制 辅助,其类似于硬件的 RSS,本文同样也不做深入探讨;
5) 软中断将具体负责通信数据包的处理,在数据包经过内核协议栈处理后, 内核唤醒等待进程,通知数据的到达。
3. 通信优化方法
3.1 多队列绑定
为了充分利用网卡多队列,并 高多处理器核的 Cache 局部 性,需要对多队列网卡的发送和接收队列进行处理器核的绑定。
(1) 发送队列绑定
为了避免多处理器对发送队列的竞争,我们将 82599EB 网卡每一个发送队列绑定至不同的处理器核上。发送队列绑定特定处理器的方法如下,其采 用 Linux 内核 XPS 机制,更改/sys/class/net/$IFACE/queues/ tx-$Num /xps_cpus。其中 IFACE 为网卡设备名称,NUM 为发送队列号码。例如针对 网卡 eth0 的 3 号发送队列绑定 10 号处理器命令如下:
echo “000400” > /sys/class/net/eth0/queues/tx-3/xps_cpus
(2)接收队列绑定
接收队列与处理器核的绑定由 Linux 内核通过队列中断与 CPU 间的反向映射关系建立,如接收队列的中断对应处理器核11,那么接收队列就绑定在处理器核 11 上。
在接受队列绑定的情况下,还需将接收数据投递至应用所在处理器核,从而高数据的局部性,因此需要建立接收数据流至接收队列的绑定。当前的82599EB支持Flow Director机制,类似于ARFS机制,因此,我们可以通过ATR机制和自定义的 Flow Director 机制进行实现接收数据流与接收对 列的绑定。
3.2 中断绑定
针对多队列网卡和多个处理器核,需要分别建立每个队列中断与处理器核的绑定关系。具体命令如下:
echo “$cpumask” > /proc/irq/$irqnum/smp_affinity 如建立网卡队列10的中断129绑定至至处理器核:其命令如下: echo “000004” > /proc/irq/129/smp_affinity。
3.3 多网卡下的通信
在多网卡情况,为了充分利用带宽,可采用bonding方式使用多块网卡。分析当前双网卡绑定Bonding方式双网卡绑定方式为802.3ad标准,其采用的layer3 +4 hash方法。在某些情况下,其可能出现网卡负载不均衡,如测试集群会出现 网卡1 400MB/s 而网卡2 200MB/s的情况,不能充分利用双网卡带宽。
针对现有的网卡绑定方式Bonding,可以考虑结合Layer3+4 Hash方式,建立端到端的奇偶端口双连接或多链接。在针对突发大数据通信时,可以通过消息分片使用Hash值不同的连接来充分利用带宽。
相关TAG标签
上一篇:Swift设计模式:原型模式
下一篇:Ubuntu16.04终端命令
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站