12月11号 解决dpdk抓包时出现imiss的问题
来源:互联网 发布:linux怎么设置ip地址 编辑:程序博客网 时间:2024/05/06 23:17
经现场运维反馈,公司的项目程序日志中存在imiss丢包的情况
一般来说imiss增加,是因为dpdk抓包cpu的抓包能力弱,导致丢包
server代码原来的处理流程是:
抓包->解析数据包的五元组->以一定规则进行hash->hash值投递到不同的slot中
正常情况下,使用cpu的一个核心抓包,单网卡抓包10G是没问题的
但是需要解析数据包的过程以及hash计算,导致server的抓包cpu性能下降,从而导致imiss的产生.
解决办法:
1.提升程序的解析数据包和hash算法的性能
2.使用采用dpdk 的rss算法
解决办法是采用dpdk 的rss算法
步骤1:在DPDK中通过设置rte_eth_conf中的mq_mode字段来开启RSS功能, rx_mode.mq_mode = ETH_MQ_RX_RSS。
struct rte_eth_conf port_conf = {
.rxmode = {
.mq_mode = ETH_MQ_RX_RSS,
//.max_rx_pkt_len = ETHER_MAX_LEN,
.max_rx_pkt_len = SERVER_MAX_PKT_LEN,
.split_hdr_size = 0,
.header_split = 0, /*< Header Split disabled /
.hw_ip_checksum = 0, /*< IP checksum offload disnabled /
.hw_vlan_filter = 0, /*< VLAN filtering disabled /
.jumbo_frame = 0, /*< Jumbo Frame Support disabled /
.hw_strip_crc = 0, /*< CRC stripped by hardware /
},
.rx_adv_conf = {
.rss_conf = {
.rss_key = rss_intel_key,//底层默认采用rss_intel_key
//.rss_hf = ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP |ETH_RSS_TUNNEL,
.rss_hf = ETH_RSS_IP,
},
},
.txmode = {
.mq_mode = ETH_MQ_TX_NONE,
},
};
rss_hf为hash function的标识.
值的组合为:ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP |ETH_RSS_TUNNEL,
读者可根据项目需求场景,自己选择一个key.
步骤2:当RSS功能开启后,报文对应的rte_pktmbuf中就会存有RSS计算的hash值,可以通过pktmbuf.hash.rss来访问。 这个值可以直接用在后续报文处理过程中而不需要重新计算hash值,如快速转发,标识报文流等
步骤3:对称hash key寻找
在网络应用中,如果同一个连接的双向报文在开启RSS之后被分发到同一个CPU上处理,这种RSS就称为对称RSS。 如果同一个连接的双向报文被分发到不同的CPU,那么两个CPU之间共享这个连接的信息就会涉及到锁,而锁显然是会影响性能的。
经过测试,dpdk使用的默认hash key不是对称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, };
RETA是运行时可配置的,这样应用程序就可以动态改变CPU对应的接收队列,从而动态调节报文分发。 具体通过PMD模块的驱动进行配置,例如ixgbe_dev_rss_reta_update和ixgbe_dev_rss_reta_query。
现在抓包时的imiss问题是解决了,但是每个槽的数据量依旧分布的不均匀!这个得想个好的算法来解决下.
- 12月11号 解决dpdk抓包时出现imiss的问题
- dpdk的问题
- 9月21号出现的问题
- 解决DPDK安装KNI模块时遇到“Unknown symbol in module”的问题
- 解决DPDK脚本python执行时“OSError: [Errno 2] No such file or directory”的问题
- mysql解决1-12月统计的问题
- 11年11月12日发现和解决的问题。
- DPDK 解决IXGBE VF驱动无法初始化问题
- 如何解决fiddler抓包时出现443的问题
- 【已解决】fiddler抓包时出现443的问题
- DPDK中文-DPDK的ring
- DPDK中文-DPDK的reorder
- OVS-DPDK VM出现 virtio_net virtio4: output.0:id 30 is not a head 问题 dpdk-vhost bug fix
- Apache安装出现的问题的解决
- 解决ANT与JUNIT出现的问题
- 怎样解决鼠标出现停顿的问题?
- 解决myeclipse中出现的一个问题
- 我的电脑 布局出现问题 解决
- vue.js对表格的操作实例
- nginx部署Vue前端项目
- ORA-12547: TNS:lost contact错误解决方法
- 光荣之路:产品测试规范(五)
- 吴恩达深度学习课程deeplearning.ai课程作业:Class 4 Week 3 Autonomous driving application
- 12月11号 解决dpdk抓包时出现imiss的问题
- 通过lauterbach将image等烧录到开发板中
- zookeeper很简单,其实就是个框架
- Linux命令
- Google Android Developer
- MapTask并行度和切片机制
- android实现app国际化
- 读《Java虚拟机精讲》之-------JVM内存分配的总结
- ROS Navigation-----dwa_planner_ros类