1. Linux网卡多队列的原理
    Linux kernel在2.6.21之前不支持网卡多队列的特性,也就是一个网卡只能申请一个中断号。
    在2.6.21开始支持网卡多队列,当网卡驱动加载的时候,通过获取网卡型号得到网卡支持的网卡队列数量。结合CPU的核数,计算出所要激活的网卡队列数量sum(sum = min(网卡队列数量,CPU核数))。申请sum个中断号,分配给各个queue。
    为了防止不同的核收到了同一个queue的报文,产生报文乱序问题(中断被绑定到多核上);解决办法是将一个queue的中断绑定到唯一的一个核上去,避免乱序问题。

    查看系统的哪些中断正在使用以及每个中断各被触发了多少次的信息:

    $ cat /proc/interrupts
    


    第一列表示中断号(IRQ号),第二三列分别表示CPU0和CPU1分别被中断了多少次。
    IRQ号决定了需要被CPU处理的优先级,IRQ号越小意味着优先级越高。
    例如,如果CPU同时接收到了来自于键盘和系统时钟的中断,那么CPU会首先服务于系统时钟,因为它的IRQ号是0。

    查看中断号与CPU的绑定关系(xxx指定中断号):

    $ cat /proc/irq/xxx/smp_affinity_list
    


    可以看到,27、28号中断被绑定在0号核上;29、30号中断被绑定在1号核上。
    可以手动修改中断所绑定的核,通过修改smp_affinity文件来实现:
    需要首先停掉irqbalance服务,irqbalance是一个服务进程,用来自动绑定和平衡IRQ的。
    手动修改中断所绑定的核:

    $ echo "1" > /proc/irq/31/smp_affinity
    $ echo "5" > /proc/irq/31/smp_affinity
    

    以上的含义是将31号中断绑定到CPU 0上,以及将31号中断绑定到CPU 0和 CPU 2上。设定的值为16进制。

  2. Linux内核协议栈接收数据流程:
    1). 网卡预先在ram中分配多个ring_buffer队列,每个队列绑定一个CPU
    2). 网卡接收到数据包,保存在NIC的internal buffer中(64k)
    3). 网卡根据数据分流算法(例如RSS),通过DMA将skb保存到一个ring_buffer队列中。(假设此队列绑定IRQ100,IRQ100绑定在core-03上)
    4). 网卡触发100号中断通知core-03 ring_buffer中的数据就绪。
    5). core-03(driver)启动NAPI处理ring_buffer内的skb数据,此过程为软中断
    6). NAPI将处理过的skb交给网络协议栈(ip_recv,tcp_recv处理),且保存在socket_buffer区
    7). 应用程序使用read方法读取socket_buffer区就绪的数据包。

  3. RSS原理以及Linux中涉及到RSS部分的设置
    RSS的原理:网卡在接收到数据报文之后,获取源地址目的地址,源端口目的端口等信息,然后通过配置的哈希函数根据获取到的这些信息计算出哈希值。取哈希值的低几位作为RETA(redirection table)的索引。根据RETA表中的值,将数据放入指定CPU所对应的ring_buffer内。
    下图是默认的各类型的数据包所使用的哈希函数的参数:

    哈希函数一般选取微软托普利兹算法(Microsoft Toeplitz Based Hash)或者对称哈希。哈希函数与网卡驱动相关。

    ethtool可以对网卡多队列的哈希计算输入进行修改,可以修改指定数据包类型的哈希函数的输入参数:
    查看ethtool的使用方法:man ethtool
    修改哈希函数输入参数部分:

    例如修改eth0网卡接收TCP4数据包时参与哈希的输入参数:

    $ ethtool --config-ntuple eth0 rx-flow-hash tcp4 sdfn
    

    sdfn是指设定参加哈希的数据字段,mvtsdfnr所代表的含义如下:

    s代表源地址,d代表目的地址;f/n在TCP数据包中代表源端口和目的端口。

    查看/修改指定网卡的哈希对照表(indirection table)的指令:通过修改哈希对照表来修改不同哈希值与网卡队列/CPU的对应关系,其命令如下:

    $ ethtool -x(查看)/-X(修改) eth0
    
  4. 查看网卡是否支持多队列模式以及网卡多队列的设置
    查看网卡硬件是否支持多队列:

    $ lspci -vvv
    

    查看Ethernet controller部分的信息:

    如果存在MSI-X,Enable+并且count > 1,就代表该网卡支持多队列,count为几就代表网卡支持几个队列。

    查看当前网卡是否已经开启多队列模式:

    $ ethtool -l eth0
    


    RX: receive代表接收数据包,接收队列
    TX:transmit代表发送数据包,发送队列
    Combined:发送和接收公用,组合队列
    这是我的虚拟机的网卡,当前最多支持两个组合队列(pre-set maximums),已经设置了两个组合队列队列(current hardware settings)。

    设置网卡使用多队列:

    $ ethtool -L eth0 combined <N> N为要使能的队列数
    

    小写的l为查看,大写的L为设置
    (设置网卡队列的操作,会导致网卡关闭后再次启动,和这个网卡相关的连接会关闭)

    查看网卡队列长度:

    $ ethtool -g eth0
    


    网卡队列的长度可以设置,若网卡队列的长度过小,有可能导致丢包。
    在出现丢包的情况下,如果查看网卡的ifconfig,出现overruns不为0,代表因为网卡队列满而导致的丢包。可以考虑增加网卡队列的长度。

Linux网卡多队列学习笔记相关推荐

  1. Linux性能优化实战学习笔记:第十讲==中断

    Linux性能优化实战学习笔记:第十讲 一.坏境准备 1.拓扑图 2.安装包 在第9节的基础上 在VM2上安装hping3依奈包 ? 1 2 3 4 5 6 7 wget http://www.tcp ...

  2. 【嵌入式环境下linux内核及驱动学习笔记-(16)linux总线、设备、驱动模型之input框架】

    目录 1.Linux内核输入子系统概念导入 1.1 输入设备工作机制 1.2 运行框架 1.3 分层思想 2.驱动开发步骤 2.1 在init()或probe()函数中 2.2 在exit()或rem ...

  3. 《深入理解LINUX内存管理》学习笔记(一)

    引子 为什么要写这个笔记: 1,这本书的中文版翻译了太垃圾,没法阅读.阅读英文原版,可以很好的理解作者的思路.作此笔记备忘 2,一直以来学习LINUX kernel的知识缺乏系统化,借对这本书的学习, ...

  4. 九十分钟极速入门Linux——Linux Guide for Developments 学习笔记

    转载自: 九十分钟极速入门Linux--Linux Guide for Developments 学习笔记 http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA ...

  5. linux之awk命令学习笔记

    Linux之awk命令学习笔记 前言 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具. 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, ...

  6. Linux性能优化实战学习笔记:第四十六讲=====实战分析

    Linux性能优化实战学习笔记:第四十六讲 一.上节回顾 不知不觉,我们已经学完了整个专栏的四大基础模块,即 CPU.内存.文件系统和磁盘 I/O.以及网络的性能分析和优化.相信你已经掌握了这些基础模 ...

  7. Linux C编程一站式学习笔记2

    Linux C编程一站式学习笔记 chap2 常量.变量和表达式 本书以C99为标准 一.继续hello world 加入更多注释的hello world 可以用ctrl+(shift)+v复制到vi ...

  8. 《鸟哥的Linux私房菜》学习笔记

    <鸟哥的Linux私房菜>学习笔记 这是一份学习<鸟哥的Linux私房菜>的学习笔记,记笔记的原则是,感觉平时可能会用到的 就记录的详细一些,感觉暂时用不上的,只需要知道要解决 ...

  9. 【嵌入式环境下linux内核及驱动学习笔记-(15-1)例程】

    目录 1.在APP直接调用标准文件IO操作I2C(针对学习笔记-15的15.3节) 1.1 mail.c 1.2 mpu6050.h 1.3 mpu6050.c 1.4 Makefile 2.以外称i ...

最新文章

  1. 麦肯锡AI应用报告:深度学习是蓝海还是深坑?
  2. 【C 语言】文件操作 ( 按照单个字符的方式读写文件 | fgetc 函数 | fputc 函数 )
  3. 【组合数学】集合的排列组合问题示例 ( 排列 | 组合 | 圆排列 | 二项式定理 )
  4. 在Linux程序中输出函数调用栈
  5. VTK:模型之Delaunay3D
  6. Python机器学习---2.聚类算法理论部分
  7. 请问投稿中要求上传的author_SCI投稿状态解析
  8. Introduction的Advice的实现
  9. 支付宝没有优势了,五大银行宣布今起手机银行转账汇款免收手续费
  10. Phyllotaxis算法应用
  11. 深度学习硬件基础:CPU与GPU
  12. css如何设置背景颜色透明?css设置背景颜色透明度的两种方法介绍
  13. 深度学习笔记-LeNet和AlexNet
  14. 艰难春招,终于offer
  15. 红米note4出厂系统版本_红米Note4发布!出厂就有MIUI8黑科技
  16. C# 如何提取字符串中的数字
  17. 易语言,你在做什么?
  18. DAV转换AVI指南
  19. Work20230505
  20. java jdk 下载镜像,Docker之JDK镜像

热门文章

  1. 【Java 1】Java的基础语法
  2. r语言员工离职_r语言、 weka代写从决策树模型看员工为什么离职?
  3. 安卓手机如何进行手机导航设置
  4. 删除node_modules文件夹报错:rimraf : 无法加载文件 C:\Users\chen\AppData\Roaming\npm\rimraf.ps1,因为在此系统上禁止运行脚本。
  5. 为 Oracle Fusion Middleware 产品获取 Java SE (JDK/JRE)
  6. ESP8266-Arduino编程实例-ULN2003步进电机驱动
  7. 关于Chrome 69 版本 一些改变以及设置
  8. 用于科学计算的计算机中,标志系统性能的主要参数是,.用于科学计算的计算机中,标志系统性能的主要参数是 。...
  9. Java中Socket实现客户端和服务端通信(多线程实现全双工通信)
  10. [书籍]重温《Framework Design Guidelines》