使用RSS提升DPDK应用的性能

本文描述了RSS以及在DPDK中如何配置RSS达到性能提升和统一分发。

DPDK 1.8.0

什么是RSS

RSS(Receive Side Scaling)是一种能够在多处理器系统下使接收报文在多个CPU之间高效分发的网卡驱动技术。

  • 网卡对接收到的报文进行解析,获取IP地址、协议和端口五元组信息
  • 网卡通过配置的HASH函数根据五元组信息计算出HASH值,也可以根据二、三或四元组进行计算。
  • 取HASH值的低几位(这个具体网卡可能不同)作为RETA(redirection table)的索引
  • 根据RETA中存储的值分发到对应的CPU

下图描述了完整的处理流程:

基于RSS技术程序可以通过硬件在多个CPU之间来分发数据流,并且可以通过对RETA的修改来实现动态的负载均衡。

在DPDK中配置RSS

DPDK支持设置静态hash值和配置RETA。
不过DPDK中RSS是基于端口的,并根据端口的接收队列进行报文分发的。
例如我们在一个端口上配置了3个接收队列(0,1,2)并开启了RSS,那么
中就是这样的:

{0,1,2,0,1,2,0………}

运行在不同CPU的应用程序就从不同的接收队列接收报文,这样就达到了报文分发的效果。

在DPDK中通过设置rte_eth_conf中的mq_mode字段来开启RSS功能,
rx_mode.mq_mode = ETH_MQ_RX_RSS

当RSS功能开启后,报文对应的rte_pktmbuf中就会存有RSS计算的hash值,可以通过pktmbuf.hash.rss来访问。
这个值可以直接用在后续报文处理过程中而不需要重新计算hash值,如快速转发,标识报文流等。

RETA是运行时可配置的,这样应用程序就可以动态改变CPU对应的接收队列,从而动态调节报文分发。
具体通过PMD模块的驱动进行配置,例如ixgbe_dev_rss_reta_updateixgbe_dev_rss_reta_query

对称RSS

在网络应用中,如果同一个连接的双向报文在开启RSS之后被分发到同一个CPU上处理,这种RSS就称为对称RSS。
对于需要为连接保存一些信息的网络应用来说,对称RSS对性能提升有很大帮助。
如果同一个连接的双向报文被分发到不同的CPU,那么两个CPU之间共享这个连接的信息就会涉及到锁,而锁显然是会影响性能的。

RSS一般使用Toeplitz哈希算法,该算法有两个输入:一个默认的hash key和从报文中提取的五元组信息。
DPDK使用的默认hash key是微软推荐的,具体定义见lib/librte_pmd_e1000/igb_rxtx.c:1539,
同一个连接的不同方向使用这个默认值计算出来的hash值是不一样的。

具体讲就是{src: 1.1.1.1, dst: 2.2.2.2, srcport: 123, dstport: 456}和{src: 2.2.2.2, dst: 1.1.1.1, srcport: 456, dstport: 123}
计算出来的hash值是不一样的,hash值不一样就会导致两个方向的报文被分发到不同的接收队列,由不同的CPU进行处理。

如果想达到对称RSS的效果,那么需要使用其他hash key替换掉DPDK目前使用的。
在论文《Scalable TCP Session Monitoring with Symmetric Receive-side Scaling》中提到了一个hash key可以做到对称RSS

这里给出hash key的值,具体原理可以参考论文。

static uint8_t rss_intel_key[40] = { 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, };

时间: 2024-12-14 02:08:11

使用RSS提升DPDK应用的性能的相关文章

How to improve Java's I/O performance( 提升 java i/o 性能)

原文:http://www.javaworld.com/article/2077523/build-ci-sdlc/java-tip-26--how-to-improve-java-s-i-o-performance.html JDK 1.0.2 的 java.io 包暴露了非常多I/O性能问题.这里将介绍一个优化方案,附加一个关闭同步的方法. Java的I/O性能以前是非常多Java应用的瓶颈.主要原因就是JDK1.0.2的java.io包的不良设计和实现.关键问题是缓冲.绝大多数java.i

如何提升程序员的“性能”

程序员经常痴迷于优化程序的性能,我们始终会围绕一些让人绞尽脑汁的优化建议,比如:如何简化代码.如何提升软件运行速度.如何提高软件稳定性等等.本文来讨论一下程序员优化自身“性能”的一些建议. 1.提高文档编写能力 缺乏文档,对软件开发是致命的,一方面是软件无追溯能力,无法找到软件开发的起源,思想:另一方面,则是为后续软件查错,软件升级带来麻烦.作为早期的程序员,技术文档占用的工作时间应该为 30%,而高级程序员.系统架构师等则需更多的时间.一般的软件文档要求,本篇不多说,可以回顾入职前手头上的软件

十大技巧快速提升Android应用开发性能

一个应用程序要想开发成功,质量至关重要.用户要求它们决定安装到自己设备上的Android应用程序反应迅即.性能合理.如果应用程序未能提供好用的功能和稳定的用户体验,那么很快就会被卸载掉.本文我们将介绍十大技巧快速提升Android应用开发性能. 1:首先要有良好的编程习惯 要成为一名优秀的资源管理员;既要运用常识,还要使用公认的算法和标准的设计模式.在资源使用方面,如果你打开了资源,要记得关闭资源.要尽量晚地获取,尽量早地释放.这些由来已久的编程准则同样适用于你的Android应用程序,如果它们

如何提升 RailS 应用的性能?

Is rails slow? 「铁路很慢」,你也许听过这个笑话,那么我们的 Rails 框架呢? 如果说 Rails 慢,那么如何提升 Rails APP 的性能就成了开发者们最关注的问题. 也许你听说过很多提升 RoR APP 性能的方法,它们有难有易,我们需要在选择其中最能帮助开发者脱离性能困境的. 这里列举了几种不同的提升 Rails 应用性能的方法. 1. 数据库索引 你的 APP 被 DB 性能限制,优秀的数据库索引可以在大型数据库表中带给你100倍的性能提升.然而并非所有 Rails

How to improve Java's I/O performance( 提升 java i/o 性能)

原文:http://www.javaworld.com/article/2077523/build-ci-sdlc/java-tip-26--how-to-improve-java-s-i-o-performance.html JDK 1.0.2 的 java.io 包暴露了很多I/O性能问题,这里将介绍一个优化方案,附加一个关闭同步的方法. Java的I/O性能曾经是很多Java应用的瓶颈,主要原因就是JDK1.0.2的java.io包的不良设计和实现.关键问题是缓冲,绝大多数java.io中

网站服务器部署及优化---3---使用eAccelerator提升网站服务器的性能(rhel6.5)

RedHat Enterprise 6.5环境下使用eAccelerator优化网站性能 第一步:在做优化之前,首先对网站服务器的硬件做一下检测 1,内存信息:2G内存,swap容量为4G [[email protected] ~]# free -m total       used       free     shared    buffers     cached Mem:          1870       1228        642          0         47

移动端网站提升页面加载性能的优化技巧

移动端网站提升页面加载性能的优化技巧 收藏到:1时间:2015-06-17   文章来源:马海祥博客   访问次数:2501 网页性能的优化一直是网站成功的关键,越来越多的研究证明,不管是小型电商,还是大型连锁企业,即使是页面加载时间方面的细微改善,都可以带来更多的业务,更多的广告收入,更多的用户粘性和更多的客户满意度. 在过去几年,Web开发者都是基于改善硬件或者提高带宽速度来优化用户体验,但是最近几年,爆炸式的移动Web浏览器的使用打破了这个途径,低带宽,高延迟,小内存,低处理器性能的移动设

当你制作网页时知道怎么去提升页面的交互性能吗?

网站的发展除了要提升目标关键词的搜索引擎排名,引来流量以外,还要增加网站的流量转化率.只有在网站的老用户不停增加的情况下,才能让网站的流量稳定下来,如果新用户跳出率等数据高,也会导致搜索引擎对你的网站评价降低,导致流量越来越少.凡科网站建设认为良好的流量增长必须配合站内的交互性提升,将新用户发展为老用户,才能让网站健康的发展,下面介绍几个制作网页时,能够提升页面交互性能的小技巧. 明显的按钮设计 不少站长在制作网页的时候为了保持网站的统一,将链接.按钮等跳转位置做得并不明显,用户其实并不喜欢这种

如何提升mysql replication的性能&&多线程传输二进制日志

如何提升replication的性能: 延迟 : 对于mysql replication来说,在没有发生故障的情况下,出现master与slave数据不同步,延迟分为以下两种情况: 经常性延迟   : 异步同步的数据差距比较大 ,周期性的,循环. 暂时性延迟   : 突发情况,导致延迟 其主要原因就是: 网络带宽 I/O 如何减少replication延迟?? 1,最好使用内网或者专线链路传输binlog数据 (千兆网卡.还不够的话,bounding 技术,扩展带宽) 在my.cnf中强制使用内