背景

在服务器网卡收包发包数量非常大时,在系统繁忙时,如果过多网卡中断集中在单一cpu上导致cpu来不及响应造成网络性能下降,网络性能的瓶颈一般不在网卡而在cpu,现在的网卡很多支持万兆和多队列。

为了解决网卡中断集中在单一cpu的问题,在多核服务器上,需要通过将中断队列绑定到不同的cpu。主要有两种情况,多队列多重中断网卡通过SMP IRQ affinity方法绑定到不同的cpu,单队列网卡通过RPS/RFS模拟多队列多重中断网卡的功能,将模拟的软件队列绑定到不同的CPU。RPS/RFS在多队列多重中断网卡多cpu环境不起作用,在网卡队列少于cpu核数时,可以解决cpu负载不均衡的问题。

网卡多队列

网卡多队列需要多队列网卡的支持,是在硬件网卡上支持的。常用的Intel的82575、82576,I350,Boardcom的57711等网卡都支持多队列.如果是实体机,可通过如下方式判断是否支持多队列:lspci -vvv  #lspci在centos 6.x之后的版本不会默认安装,可yum install pciutils进行安装。如果Ethernet条目下有Message Signaled Interrupts(MSI),则网卡支持多队列。

线上使用的是XEN镜像的虚拟机,为单队列网卡,不支持网卡多队列特征(升级的kvm镜像支持网卡多队列)。在linux 2.6.35内核版本以后,提交的patch RPS采用软件模拟的方式,实现了多队列网卡所提供的功能,分散了在多CPU系统上数据接收时的负载, 把软中断分到各个CPU处理,而不需要硬件支持,大大提高了网络性能。

网卡中断

对于多队列网卡在硬件层支持了多队列中断,网卡发送硬件中断到中断控制器然后触发cpu软中断。对于单队列网卡,可以在操作系统层RPS/RFS模拟软件多队列中断触发cpu软中断。

RPS/RFS

  • RPS 全称是 Receive Packet Steering, 这是Google工程师 Tom Herbert (therbert@google.com )提交的内核补丁, 在2.6.35进入Linux内核. 这个patch采用软件模拟的方式,实现了多队列网卡所提供的功能,分散了在多CPU系统上数据接收时的负载, 把软中断分到各个CPU处理,而不需要硬件支持,大大提高了网络性能。
  • RFS 全称是 Receive Flow Steering, 这也是Tom提交的内核补丁,它是用来配合RPS补丁使用的,是RPS补丁的扩展补丁,它把接收的数据包送达应用所在的CPU上,提高cache的命中率。
  • 这两个补丁往往都是一起设置,来达到最好的优化效果, 主要是针对单队列网卡多CPU环境(多队列多重中断的网卡也可以使用该补丁的功能,但多队列多重中断网卡有更好的选择:SMP IRQ affinity)

SMP IRQ affinity

多队列网卡的cpu亲和性设置网上资料很多,这里不再做介绍。下面主要对我们使用的单队列网卡虚拟机采用RPS/RFS优化设置进行介绍。

优化过程

RPS cpu bitmap测试分类: 0(不开启rps功能,默认), one cpu per queue(每队列绑定到1个CPU核上), all cpus per queue(每队列绑定到所有cpu核上), 不同分类的设置值如下

  1. 0(不开启rps功能)

    /sys/class/net/eth0/queues/rx-0/rps_cpus 00000000
    /sys/class/net/eth0/queues/rx-1/rps_cpus 00000000
    /sys/class/net/eth0/queues/rx-2/rps_cpus 00000000
    /sys/class/net/eth0/queues/rx-3/rps_cpus 00000000
    /sys/class/net/eth0/queues/rx-4/rps_cpus 00000000
    /sys/class/net/eth0/queues/rx-5/rps_cpus 00000000
    /sys/class/net/eth0/queues/rx-6/rps_cpus 00000000
    /sys/class/net/eth0/queues/rx-7/rps_cpus 00000000/sys/class/net/eth0/queues/rx-0/rps_flow_cnt 0
    /sys/class/net/eth0/queues/rx-1/rps_flow_cnt 0
    /sys/class/net/eth0/queues/rx-2/rps_flow_cnt 0
    /sys/class/net/eth0/queues/rx-3/rps_flow_cnt 0
    /sys/class/net/eth0/queues/rx-4/rps_flow_cnt 0
    /sys/class/net/eth0/queues/rx-5/rps_flow_cnt 0
    /sys/class/net/eth0/queues/rx-6/rps_flow_cnt 0
    /sys/class/net/eth0/queues/rx-7/rps_flow_cnt 0/proc/sys/net/core/rps_sock_flow_entries 0
  2. one cpu per queue(每队列绑定到1个CPU核上)
    /sys/class/net/eth0/queues/rx-0/rps_cpus 00000001
    /sys/class/net/eth0/queues/rx-1/rps_cpus 00000002
    /sys/class/net/eth0/queues/rx-2/rps_cpus 00000004
    /sys/class/net/eth0/queues/rx-3/rps_cpus 00000008
    /sys/class/net/eth0/queues/rx-4/rps_cpus 00000010
    /sys/class/net/eth0/queues/rx-5/rps_cpus 00000020
    /sys/class/net/eth0/queues/rx-6/rps_cpus 00000040
    /sys/class/net/eth0/queues/rx-7/rps_cpus 00000080/sys/class/net/eth0/queues/rx-0/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-1/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-2/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-3/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-4/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-5/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-6/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-7/rps_flow_cnt 4096/proc/sys/net/core/rps_sock_flow_entries 32768
  3. all cpus per queue(每队列绑定到所有cpu核上)
    /sys/class/net/eth0/queues/rx-0/rps_cpus 000000ff
    /sys/class/net/eth0/queues/rx-1/rps_cpus 000000ff
    /sys/class/net/eth0/queues/rx-2/rps_cpus 000000ff
    /sys/class/net/eth0/queues/rx-3/rps_cpus 000000ff
    /sys/class/net/eth0/queues/rx-4/rps_cpus 000000ff
    /sys/class/net/eth0/queues/rx-5/rps_cpus 000000ff
    /sys/class/net/eth0/queues/rx-6/rps_cpus 000000ff
    /sys/class/net/eth0/queues/rx-7/rps_cpus 000000ff/sys/class/net/eth0/queues/rx-0/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-1/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-2/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-3/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-4/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-5/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-6/rps_flow_cnt 4096
    /sys/class/net/eth0/queues/rx-7/rps_flow_cnt 4096/proc/sys/net/core/rps_sock_flow_entries 32768

环境中设置为all cpus per queue,下图中优化后效果,优化前中断集中在cpu0,设置后均衡分配在cpu0-cpu3.

one cpu per queue方法在接收udp包时可能会造成网络性能下降,中断集中在单一cpu的情况。具体参考https://blog.csdn.net/yy405145590/article/details/9837839

参考文章:

https://blog.csdn.net/qiushanjushi/article/details/44244643   Linux系统中RPS/RFS介绍

https://www.cnblogs.com/zhjh256/p/6020609.html                 年后vmware linux top si高以及网卡队列软负载相关优化

https://blog.csdn.net/yy405145590/article/details/9837839       Linux内核 RPS/RFS功能详细测试分析

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-network-packet-reception        性能调节指南

https://blog.csdn.net/wangjianno2/article/details/48983999/         网卡多队列学习小结

https://support.huaweicloud.com/usermanual-ecs/zh-cn_topic_0058758453.html#    开启网卡多队列功能

云服务器ECS网卡多队列优化相关推荐

  1. 华为弹性云服务器ECS,协同优化网络产业信息

    华为在研究工作方面富有创新性.挑战性.可持续性.华为弹性云服务器ECS运用新方法创新突破,以新概念创新技术支持,巩固优化云服务.在网络上打造出一个安全可靠的服务平台,同时也助力更多企业的维稳发展.华为 ...

  2. 【云服务器 ECS 实战】专有网络 VPC、弹性网卡的概述与配置

    一.ECS 专有网络 VPC 1. 传统经典网络与专有网络 VPC 对比 2. 建立自己的专有网络 VPC 二.弹性网卡 1. 弹性网卡的概念与优势 2. 弹性网卡的配置 一.ECS 专有网络 VPC ...

  3. 阿里云服务器ECS存储增强通用型g7se实例CPU性能参数详解

    腾讯云服务器ECS存储增强通用型实例规格族g7se实例CPU处理器采用Intel Xeon(Ice Lake) Platinum 8369B,基频2.7 GHz,全核睿频3.5 GHz,单实例顺序读写 ...

  4. 性能测评:阿里云服务器ECS通用型g8i实例CPU内存安全存储

    阿里云服务器ECS通用型实例规格族g8i采用2.7 GHz主频的Intel Xeon(Sapphire Rapids) Platinum 8475B处理器,3.2 GHz睿频,g8i实例采用阿里云全新 ...

  5. 云服务器ECS使用限制概览,让你的上云少走一些坑

    限制概述 使用云服务器ECS有下列限制: 不支持安装虚拟化软件和二次虚拟化(例如安装使用VMware Workstation).仅弹性裸金属服务器和超级计算集群支持二次虚拟化. 不支持声卡应用. 不支 ...

  6. 云服务器ecs是虚拟机,云服务器ecs虚拟机

    云服务器ecs虚拟机 内容精选 换一换 企业主机安全(Host Security Service,HSS)是提升服务器整体安全性的服务,通过主机管理.风险防御.入侵检测.安全运营.网页防篡改功能,可全 ...

  7. 阿里云服务器ECS实例规格性能区别及选择攻略

    阿里云服务器ECS有多种实例规格,如ECS共享型S6.ECS计算型C6等,云服务器规格不同性能不同,CPU型号不同.网络收发包PPS性能不同,连接数.多队列.云盘IOPS.云盘带宽等性能参数不同,云服 ...

  8. 跟我一起来学弹性云服务器ECS【华为云至简致远】

    [摘要] 弹性云服务器(Elastic Cloud Server,ECS)是由CPU.内存.操作系统.云硬盘组成的基础的计算组件.弹性云服务器的开通是自助完成的,您只需要指定CPU.内存.操作系统.规 ...

  9. 云服务器ECS(一)

    一.云服务器ECS的概念 云服务器Elastic Compute Service(ECS)是阿里云提供的一种基础云计算服务.使用云服务器ECS就像使用水.电.煤气等资源一样便捷.高效.您无需提前采购硬 ...

最新文章

  1. 干货 | tensorflow模型导出与OpenCV DNN中使用
  2. 构建之法现代软件工程(第五次)
  3. BLE简介和Android BLE编程
  4. mvc html.display,Asp.Net MVC中的Html.DisplayFor()用于项目列表
  5. javax.ws.rs.NotSupportedException: Cannot consume content type
  6. 局域网内数据采集总结(四)
  7. 华为epg-sms 多cp_Linux桌面上的SMS,Linux 25岁生日以及更多开源新闻
  8. 微软再损一将!继Nat Friedman后,另一Xamarin联合创始人也已离职
  9. 天呢,小学生都在B站讲算法?
  10. HTML基础开头代码
  11. 戴尔服务器进入pxe启动
  12. extern关键字作用
  13. windos下 elasticksearch7.13安装踩坑记
  14. html2canvas+canvas2image 做vue移动端页面海报
  15. Interview with Dustin Kirkland, Ubuntu Core Developer about encryption in Ubuntu
  16. 创新、创业,风险投资介绍。附:2019年热门风险投资人 ( VCPE )
  17. 级联失效matlab,加权无标度网络的级联失效模型
  18. 江苏计算机学业水平测试多少分过关,江苏学业水平测试的相关问题整理
  19. Python中的命名元组(namedtuple)到底是什么东西?干嘛用的?
  20. 使用DirectDraw直接显示YUV视频数据

热门文章

  1. 目标检测:二维码检测方案
  2. 小白自学c51笔记之数码管1——D74HC245和D74HC138
  3. GTK 框架(Frames)
  4. window.frames用法
  5. MATLAB算法实战应用案例精讲-【图像处理】小目标检测(补充篇)(附python代码实现)
  6. FTP服务搭建与配置
  7. 光敏电阻5506主要参数_光敏电阻器的主要参数
  8. DataTable数据过滤方法
  9. C#学习资源网站汇总
  10. 用Python做一个猜数游戏(入门)