一.网络流量上不去
二.中断绑定
2.1 关闭中断平衡守护进程
2.2 脱离中断平衡守护进程
2.3 手动设置中断的CPU亲和性
三. 总结


一.网络流量上不去

在Linux的网络调优方面,如果你发现网络流量上不去,那么有一个方面需要去查一下:

网卡处理网络请求的中断是否被绑定到单个CPU(或者说跟处理其它中断的是同一个CPU)

二.中断绑定

对于实时环境,我们需要消除或者最小化事件响应的延迟。要想做到这一点,需要将不同的中断响应(IRQs)和用户进程绑定到不同的CPU核心上,使他们彼此隔离。
网卡与操作系统的交互一般有两种方式:

  • IRQ(Interrupt Request 中断请求):网卡在收到了网络信号之后,主动发送中断到CPU。而CPU将会立即停下手边的活以便对这个中断信号进行分析;
  • DMA(Direct Memory Access 直接存储器访问):允许硬件在无 CPU 干预的情况下将数据缓存在指定的内存空间内,在CPU合适的时候才处理;

现在的对称多核处理器(SMP)上,一块网卡的IRQ还是只有一个CPU来响应,其它CPU无法参与,如果这个CPU还要忙其它的中断(其它网卡或者其它使用中断的外设(比如磁盘)),那么就会形成瓶颈。

      默认情况下,Linux的中断响应会被平均分配到所有CPU核心上,这样势必会发生写新的数据和指令缓存,而且还会与CPU核心上原来存在的进程产生冲突。

这就会延迟中断响应,影响程序的处理时间。

解决方案:
      为了解决这个问题,可以将中断(或进程)绑定到指定的CPU核心上,这样该中断(或进程)所需要的代码和数据结构就有更高的可能性位于本地CPU的数据和指令缓存内,而不必进行新的写缓存,从而提高中断响应(或进程)的处理速度。
       此外,将某一个进程及其相关的中断绑定在同一个CPU核心上,使它们共享缓存线路,可以提高程序性能。还有,将彼此不相关的中断与进程绑定到不同的CPU核心上,可以避免冲突,也可以提高程序性能。

以上提到的方法对于延迟敏感的中断(或进程)是很有用的,同时这些方法对于处理速度受限于内存和总线带宽的情况也是很重要的。

接下来介绍如何实现中断绑定。

2.1 关闭中断平衡守护进程

中断平衡守护进程(irqbalance daemon)会周期性地将中断平均地公平地分配给各个CPU核心,它默认是开启的。为了实现中断绑定,首先需要将这个守护进程关闭。

利用systemctl status irqbalance查看守护进程的运行状态


  1. [root@node9 ~]# systemctl status irqbalance
  2. irqbalance.service - irqbalance daemon
  3. Loaded: loaded (/usr/lib/systemd/system/irqbalance.service; disabled; vendor preset: enabled)
  4. Active: inactive (dead)

利用  systemctl stop irqbalance 可以关闭该进程。这样中断响应默认都会由 CPU0 核心处理。

利用  systemctl disable irqbalance 可以取消进程,使其开机不会重启。

其实,关闭该进程实在太强硬了,毕竟中断平衡功能还是有用的。那么有没有其它方法,在不关闭守护进程的情况下,还能让某些 CPU 核心脱离守护进程的管理,看下一个方法。

2.2 脱离中断平衡守护进程

我们可以通过修改  /etc/sysconfig/irqbalance  配置文件,将指定的CPU核心从中断平衡守护进程的列表中脱离出来,即守护进程不会再将中断分配给这些CPU核心。

打开  /etc/sysconfig/irqbalance文件,找到“#IRQBALANCE_BANNED_CPUS=”位置,将注释取消,然后在等号后面填写CPU十六进制掩码,比如

IRQBALANCE_BANNED_CPUS=0000ff00

可以将8~15这8个CPU核心从守护进程中脱离出来。

这里的掩码最多可以有64位,如果系统具有的核心数超过32个,则可以在等号后面添加两个32位掩码,并用逗号隔开,例如

IRQBALANCE_BANNED_CPUS=00000001,0000ff00

就是将8~15和33这9个核心隔离了。

关于掩码:一个32位的位掩码(bitmask)形如00000000000000000000000000000011,表示为十进制掩码(decimal)为3,表示为十六进制掩码(hexadecimal)为0x00000003。

2.3 手动设置中断的CPU亲和性

设置中断的CPU亲和性(affinity),就是让该中断只在指定CPU核心上进行响应,即中断绑定。

首先我们通过/proc/interrupts文件查看一下各种中断的响应情况


  1. [root@node9 ~]# cat /proc/interrupts
  2. CPU0 CPU1 CPU2 CPU3
  3. 0: 63 0 0 0 IR-IO-APIC-edge timer
  4. 8: 1 0 0 0 IR-IO-APIC-edge rtc0
  5. 9: 0 0 0 0 IR-IO-APIC-fasteoi acpi
  6. ******

第一列显示的中断ID号,CPUn列显示的是该中断在第n个CPU核心上的响应次数,倒数第二列是中断类型,最后一列是描述。

1)利用echo命令将cpu掩码写入/proc/irq /中断ID/smp_affinity文件中,即可实现修改某一中断的CPU亲和性。例如

echo 0x0004 > /proc/irq /170/smp_affinity

就可以将170中断的响应绑定到CPU3核心上。当该中断下一次发生时,再查看/proc/interrupts里面的响应数量,会发现CPU3核心的响应次数增加了,而其它核心的响应次数没有改变。

2)还有一种方法,通过 tuna 也可以实现中断绑定功能。详见 Linux工具使用——使用tuna进行性能调优

三. 总结

最后总结一下,为了满足实时处理的要求,我们需要将中断绑定到指定的 CPU 核心上,实现中断绑定主要有两方面操作:
1)关闭中断平衡守护进程或者隔离CPU核心;
2)手动设置中断的CPU亲和性。
      另外值得一提的是,这里只是介绍了中断绑定的方法,至于该绑定哪些中断以及绑定到哪几个核心上,需要针对应用程序的具体情况进行分析。
      在实际应用中,想要实现性能最优,需要进行各种尝试,然后才能得到最好的配置方式。

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux31245 人正在系统学习中

【转帖】Linux 调优篇 :虚拟化调优(irqbalance 网卡中断绑定)* 贰的更多相关文章

  1. [Linux 性能调优] 网卡中断与CPU的绑定问题

    在Linux的网络调优方面,如果你发现网络流量上不去,那么有一个方面需要去查一下:网卡处理网络请求的中断是否被绑定到单个CPU(或者说跟处理其它中断的是同一个CPU). 先说一下背景 网卡与操作系统的 ...

  2. Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小

    Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一般在内网环境中,我们几乎是用不到IPV6,因此我们没有必要把多不 ...

  3. Linux虚拟内存(swap)调优篇-“swappiness”,“vm.dirty_background_ratio”和“vm.dirty_ratio”

      Linux虚拟内存(swap)调优篇-“swappiness”,“vm.dirty_background_ratio”和“vm.dirty_ratio” 作者:尹正杰 版权声明:原创作品,谢绝转载 ...

  4. 大数据集群Linux CentOS 7.6 系统调优篇

    大数据集群Linux CentOS 7.6 系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.设置主机hosts文件 1>.修改主机名 [root@node100 ...

  5. MySQL 数据库规范--调优篇(终结篇)

    前言 这篇是MySQL 数据库规范的最后一篇--调优篇,旨在提供我们发现系统性能变弱.MySQL系统参数调优,SQL脚本出现问题的精准定位与调优方法. 目录 1.MySQL 调优金字塔理论 2.MyS ...

  6. 《Kafka权威指南》读书笔记-操作系统调优篇

    <Kafka权威指南>读书笔记-操作系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大部分Linux发行版默认的内核调优参数配置已经能够满足大多数应用程序的运 ...

  7. Linux系统优化之网络IO调优

    修改 vi /etc/sysctl.conf后执行命令 sysctl -p立即生效 首先,系统的不同也会导致 /etc/下的 文件的不同,原本powerpc 环境下 在 /etc/init.d/下有个 ...

  8. <JVM下篇:性能监控与调优篇>03-JVM监控及诊断工具-GUI篇

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  9. <JVM下篇:性能监控与调优篇>01-概述篇-02-JVM监控及诊断工具-命令行篇

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  10. linux分析、诊断及调优的必备“杀器”之一

    下面分别列出linux分析.诊断及调优时用到的工具,并分别进行说明,以方便自己和其他同学参考学习,禁止转载. 1.top top - 02:06:59 up 4 days, 17:14, 2 user ...

随机推荐

  1. 微信小程序中的数组有许多常用的方法和用法

    声明和初始化一个数组: var array = []; // 声明一个空数组 var array = [1, 2, 3]; // 声明并初始化一个有元素的数组 获取数组长度: var length = ...

  2. C++篇:第十三章_异常_知识点大全

    C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 十三.异常 ① 函数指针与该指针所指的函数必须具有一致的noexcept异常说明 ...

  3. 当创建statefulset资源后,k8s组件如何协作

    本文分享自华为云社区<当创建StatefulSet后,k8s会发生什么?>,作者:可以交个朋友 . 一.StatefulSet介绍 StatefulSet 是用来管理有状态应用的工作负载对 ...

  4. Golang代码测试:一点到面用测试驱动开发

    摘要:TDD(Test Driven Development),测试驱动开发.期望局部最优到全局最优,这个是一种非常不错的好习惯. 了解Golang的测试之前,我们先了解一下go语言自带的测试工具. ...

  5. JPEG/Exif/TIFF格式解读(4):win10照片旋转win7不识别

    xif元数据根据不同的内容分布在五个不同的IFD中. IFD0中的数据是由TIFF定义的基本图像数据,其中有些与照片无关,所以Exif只实现其中一小部分.这部份数据在Photoshop中称为TIFF元 ...

  6. 开心档之MySQL 导入数据

    MySQL 导入数据 本章节我们为大家介绍几种简单的 MySQL 导入数据命令. 1.mysql 命令导入 使用 mysql 命令导入语法格式为: mysql -u用户名 -p密码 < 要导入的 ...

  7. 简洁好用的python-pip包更新工具

    今天推荐一个github的开源工具 pkgu,支持以表格形式展示当前python环境下的有新版本的package的版本信息,并支持全部或部分更新这些已经过期或者有新版的库. 该工具目前还提供了 cac ...

  8. 一个神奇的Python库:Evidently,机器学习必备

    Evidently 是一个面向数据科学家和机器学习工程师的开源 Python 库.它有助于评估.测试和监控从验证到生产的数据和 ML 模型.它适用于表格.文本数据和嵌入. 简介 Evidently 是 ...

  9. 01-什么是 Java:Java 初学者指南

    什么是Java? Java 是一种用于互联网分布式环境的面向对象编程语言.它是一种高级语言,也易于阅读和理解.有了它,开发人员可以"编写一次,随处运行"(WORA),这意味着编译后 ...

  10. Grafana-安装饼状图

    官网:https://grafana.com/grafana/plugins/grafana-piechart-panel/?tab=installation 使用grafana-cli直接安装 [r ...