numa网卡绑定

#概念

  • 参考:https://www.jianshu.com/p/0f3b39a125eb(opens new window)

  • chip:芯片,一个cpu芯片上可以包含多个cpu core,比如四核,表示一个chip里4个core。

  • socket:芯片插槽,颗,跟上面的chip一样。两颗四核,就表示总共8个core

  • core:包含在一个cpu芯片里的多个核心

  • LCPU:逻辑cpu,一个core里可以做多个逻辑cpu,每个LCPU只有寄存器,没有计算单元,类似于分时复用,就是人们常说的线程。4核8线程,就是4个core,一个core里两个线程。

下图为一个四核八线程的chip:

#numastat查看当前numa状态:

$ numastatnode0           node1
numa_hit              1296554257       918018444
numa_miss                8541758        40297198
numa_foreign            40288595         8550361
interleave_hit             45651           45918
local_node            1231897031       835344122
other_node              64657226        82674322
12345678# 说明:
numa_hit—命中的,也就是为这个节点成功分配本地内存访问的内存大小
numa_miss—把内存访问分配到另一个node节点的内存大小,这个值和另一个node的numa_foreign相对应。
numa_foreign–另一个Node访问我的内存大小,与对方node的numa_miss相对应
local_node----这个节点的进程成功在这个节点上分配内存访问的大小
other_node----这个节点的进程 在其它节点上分配的内存访问大小
很明显,miss值和foreign值越高,就要考虑绑定的问题。# 查看某个进程的numa内存分配情况
$ numastat -p 39862
Per-node process memory usage (in MBs) for PID 1860 (yd_ex1)Node 0          Node 1           Total--------------- --------------- ---------------
Huge                         0.00            0.00            0.00
Heap                         0.02            0.00            0.02
Stack                        0.02            0.00            0.02
Private                      1.55            0.10            1.65
----------------  --------------- --------------- ---------------
Total                        1.59            0.10            1.69
# 查看numa节点的cpu分配
# $ numactl --hardware 
$ numactl -Havailable: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17
node 0 size: 32756 MB
node 0 free: 19642 MB
node 1 cpus: 6 7 8 9 10 11 18 19 20 21 22 23
node 1 size: 32768 MB
node 1 free: 18652 MB
node distances:
node   0   10:  10  211:  21  10

#numa默认的内存分配策略:

1.缺省(default):总是在本地节点分配(分配在当前进程运行的节点上); 2.绑定(bind):强制分配到指定节点上; 3.交叉(interleave):在所有节点或者指定的节点上交织分配; 4.优先(preferred):在指定节点上分配,失败则在其他节点上分配。

$ numactl --show
policy: default
preferred node: current
physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 
cpubind: 0 1 
nodebind: 0 1 
membind: 0 1 

#mysql等指定interleave

对于mysql等占用内存比较多的应用,在numa local 内存不足时,上述策略会优先淘汰/Swap本Chip上的内存,使得大量有用内存被换出。当被换出页被访问时就会出现数据库响应时间飙高甚至阻塞。参考https://www.cnblogs.com/cenalulu/p/4358802.html(opens new window)

解决方法,修改为interleave:

# 轮询分配内存
numactl --interleave=all ./program args

#执行程序时指定numa配置:

# 运行 program 程序,参数是 argument,绑定到cpu11, 内存分配时分配node 1 的内存
numactl --physcpubind=11 --membind=1 ./program args# 优先考虑从 node 1 上分配内存
numactl --preferred=1

#冷函数问题的 membind 和 numa_balancing

不常访问的函数偶尔访问时(几秒一次),可能会出现延迟较高的情况,比如原来是1us,冷的情况下是3us,perf中观察到有较多的minor-fault(page-fault)

使用numactl --membind 将程序的cpu和mem绑定到同一节点上后,会大大减少perf中观察到的minor-fault(page-fault)的次数,同样会在延迟,只比原来的1us增加几百ns

关闭numa_balancing可起到和membind类似的效果,具体情况需实际测试。

# 关闭numa_balancing
echo 0 > /proc/sys/kernel/numa_balancing# 查看numa_balancing
sysctl -a | grep numa

网卡中断与CPU绑定

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

​ <1>中断IRQ,网卡在收到了网络信号之后,主动发送中断到CPU,而CPU将会立即停下手边的活以便对这个中断信号进行分析;

​ <2>DMA(Direct Memory Access), 也就是允许硬件在无CPU干预的情况下将数据缓存在指定的内存空间内,在CPU合适的时候才处理;

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

2.检查环境
​ 首先,让网络跑满。如:对于MySQL/MongoDB服务,可以通过客户端发起密集的读操作 或执行一个大文件传送任务。查明是不是某个CPU在一直忙着处理IRQ?从 mpstat -P ALL 1 输出里面的 %irq一列即说明了哪个CPU忙于处理中断的时间占比;

18:20:33 CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
18:20:33 all  0.23  0.00 0.08  0.11   6.41  0.02  0.00  93.16 2149.29
18:20:33 0    0.25  0.00 0.12  0.07   0.01  0.05  0.00  99.49 127.08
18:20:33 1    0.14  0.00 0.03  0.04   0.00  0.00  0.00  99.78 0.00
18:20:33 2    0.23  0.00 0.02  0.03   0.00  0.00  0.00  99.72 0.02
18:20:33 3    0.28  0.00 0.15  0.28   25.63 0.03  0.00  73.64 2022.19

​ 上面的例子中,第四个CPU有25.63%时间在忙于处理中断,后面 intr/s 也说明了CPU每秒处理的中断数。从上面的数据可以看出,其它几个CPU都不怎么处理中断。

​ 然后,我们要查另外一个问题:忙于处理中断的CPU都在处理哪些中断?

cat /proc/interrupts CPU0       CPU1       CPU2       CPU3       0:        245          0          0    7134094    IO-APIC-edge  timer8:          0          0         49          0    IO-APIC-edge  rtc9:          0          0          0          0   IO-APIC-level  acpi66:         67          0          0          0   IO-APIC-level  ehci_hcd:usb274:     902214          0          0          0         PCI-MSI  eth0
169:          0          0         79          0   IO-APIC-level  ehci_hcd:usb1
177:          0          0          0    7170885   IO-APIC-level  ata_piix, b4xxp
185:          0          0          0      59375   IO-APIC-level  ata_piix
NMI:          0          0          0          0 
LOC:    7104234    7104239    7104243    7104218 
ERR:          0
MIS:          0

​ 这里记录的是自启动以来,每个CPU处理各类中断的数量。第一列是中断号,最后一列是对应的设备名。从上面可以看到: eth0所出发的中断全部都是 CPU0在处理,而CPU0所处理的中断请求中,主要是eth0和LOC中断。有时我们会看到几个CPU对同一个中断类型所处理的的请求数相差无几(比如上面的LOC),这并不一定是说多个CPU会轮流处理同一个中断,而是因为这里记录的是“自启动以来”的统计,中间可能因为irq balancer重新分配过处理中断的CPU。

3.问题解决
​ 若通过上面的诊断方法查明当前系统是受这个原因影响,那我们就开始寻求解决办法;
​ 现在的多数Linux系统中都有IRQ Balance这个服务(服务程序一般是 /usr/sbin/irqbalance),它可以自动调节分配各个中断与CPU的绑定关系,以避免所有中断的处理都集中在少数几个CPU上。在某些情况下,这个IRQ Balance反而会导致问题,会出现 irqbalance 这个进程反而自身占用了较高的CPU(当然也就影响了业务系统的性能)。
​ 首先当然要查明,该网卡的中断当前是否已经限定到某些CPU了?具体是哪些CPU?
根据上面 /proc/interrupts 的内容我们可以看到 eth0 的中断号是74,然后我们来看看该中断号的CPU绑定情况或者说叫亲和性 affinity。

$ sudo cat /proc/irq/74/smp_affinity
ffffff

​ 这个输出是一个16进制的数值,0xffffff = ‘0b111111111111111111111111’,这就意味着这里有24个CPU,所有位都为1表示所有CPU都可以被该中断干扰。

​ 修改配置的方法(设置为2表示将该中断绑定到CPU1上,0x2 = 0b10,而第一个CPU为CPU0)

echo  2 > /proc/irq/74/smp_affinity

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2774588.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring Boot】第二篇 自动装配原来就这么简单

导航 一. 什么是自动装配?二. 如何实现自动装配?1. 配置清单在哪里?2. 自动装配实现核心点1: 从META‐INF/spring.factories路径读取配置类清单核心点2: 过滤第一次过滤: 根据EnableAutoConfiguration注解中exclude和excludeName属性第二次过滤: 通过AutoConfigurationImpor…

Java实现网上药店系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药品档案模块2.4 药品订单模块2.5 药品收藏模块2.6 药品资讯模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 药品表3.2.3 药品订单表3.2.4 药品收藏表3.2.5 药品留言表…

【集合系列】LinkedHashMap 集合

LinkedHashMap集合 1. 概述2. 方法3. 遍历方式4. 代码示例5. 注意事项 其他集合类 祖父类 Map 父类 HashMap 集合类的遍历方式 具体信息请查看 API 帮助文档 1. 概述 LinkedHashMap 是 Java 中的一种特殊类型的 HashMap&#xff0c;它继承自 HashMap 类&#xff0c;并实现了…

免费:阿里云学生服务器领取申请(2024新版教程)

2024年阿里云学生服务器免费领取&#xff0c;先完成学生认证即可免费领取一台云服务器ECS&#xff0c;配置为2核2G、1M带宽、40G系统盘&#xff0c;在云服务器ECS实例过期之前&#xff0c;完成实验与认证任务&#xff0c;还可以免费续费6个月&#xff0c;阿里云百科aliyunbaike…

2023爱分析·大模型厂商全景报告|爱分析报告

01 研究范围定义 研究范围 大模型是指通过在海量数据上依托强大算力资源进行训练后能完成大量不同下游任务的模型。2023年以来&#xff0c;ChatGPT引爆全球大模型市场。国内众多大模型先后公测&#xff0c;众多互联网领军者投身大模型事业&#xff0c;使得大模型市场进入“百团…

Redis篇之过期淘汰策略

一、数据的过期策略 1.什么是过期策略 Redis对数据设置数据的有效时间&#xff0c;数据过期以后&#xff0c;就需要将数据从内存中删除掉。可以按照不同的规则进行删除&#xff0c;这种删除规则就被称之为数据的删除策略&#xff08;数据过期策略&#xff09;。 2.过期策略-惰…

【C语言自定义类型详解进阶】结构体(补充结构体的对齐和位段,一口气看完系列,央妈都点赞的博文)

目录 1.结构体 1.1 结构的基础知识 1.2 结构的声明 1.2.1特殊的声明&#xff08;匿名结构体类型&#xff09; 1.3结构体变量的定义 1.4关于匿名结构体类型的补充 1.5结构体的自引用 1.6结构体变量的初始化 2.结构体内存对齐&#xff08;重点&#xff09; 2.1偏移量补…

Redis篇之缓存雪崩

一、什么的缓存雪崩 缓存雪崩&#xff1a;在同一时间段大量的缓存key同时失效或者redis服务宕机&#xff0c;导致大量请求到达数据库给数据库带来巨大压力&#xff0c;可能导致数据库崩了。 二、应该怎么解决 1.给不同的Key的TTL添加随机值 2.利用Redis集群提高服务的可用性 3…

【人工智能】人工智能 – 引领未来科技的潮流

写在前面 引言红利挑战结论 引言 人工智能是指使计算机系统表现出类似于人类智能的能力。其目标是实现机器具备感知、理解、学习、推理和决策等智能行为。人工智能的发展可以追溯到上世纪50年代&#xff0c;随着计算机技术和算法的不断进步&#xff0c;人工智能得以实现。 今天…

QML中常见热区及层级结构

目录 引言层级结构默认层级结构z值作用范围遮罩实现-1的作用 热区嵌套与普通元素与其他热区与Flickable 事件透传总结 引言 热区有很多种&#xff0c;诸如MouseArea、DropArea、PinchArea等等&#xff0c;基本都是拦截对应的事件&#xff0c;允许开发者在事件函数对事件进行响…

米贸搜|Facebook在购物季使用的Meta广告投放流程

一、账户简化 当广告系列开始投放后&#xff0c;每个广告组都会经历一个初始的“机器学习阶段”。简化账户架构可以帮助AI系统更快获得广告主所需的成效。例如&#xff1a; 每周转化次数超过50次的广告组&#xff0c;其单次购物费用要低28%&#xff1b;成功结束机器学习阶段的…

图像处理入门:OpenCV的基础用法解析

图像处理入门&#xff1a;OpenCV的基础用法解析 引言OpenCV的初步了解深入理解OpenCV&#xff1a;计算机视觉的开源解决方案什么是OpenCV&#xff1f;OpenCV的主要功能1. 图像处理2. 图像分析3. 结构分析和形状描述4. 动态分析5. 三维重建6. 机器学习7. 目标检测 OpenCV的应用场…

嵌入式中轻松识别STM32单片机是否跑飞方法

单片机项目偶尔经常出现异常&#xff0c;不知道是程序跑飞了&#xff0c;还是进入某个死循环了&#xff1f; 因为发生概率比较低&#xff0c;也没有规律&#xff0c;所以没办法在线调试查找问题。 结合这个问题&#xff0c;给大家分享一下用ST-LINK Utility识别单片机程序是否…

Linux版Black Basta勒索病毒针对VMware ESXi服务器

前言 Black Basta勒索病毒是一款2022年新型的勒索病毒&#xff0c;最早于2022年4月被首次曝光&#xff0c;主要针对Windows系统进行攻击&#xff0c;虽然这款新型的勒索病毒黑客组织仅仅才出来短短两个多月的时间&#xff0c;就已经在其暗网平台上已经公布了几十个受害者之多&…

编译原理实验1——词法分析(python实现)

文章目录 实验目的实现定义单词对应的种别码定义输出形式&#xff1a;三元式python代码实现运行结果检错处理 总结 实验目的 输入一个C语言代码串&#xff0c;输出单词流&#xff0c;识别对象包含关键字、标识符、整型浮点型字符串型常数、科学计数法、操作符和标点、注释等等。…

[计算机提升] 还原系统:系统映像

6.4 还原系统&#xff1a;系统映像 1、打开系统设置&#xff0c;进入到恢复页面&#xff0c;然后点击高级启动中的立即重新启动进入到高级启动页面。 2、点击疑难解答 3、点击高级选项 4、点选查看更多恢复选项到下一步系统映像修复&#xff1a; 5、点选系统映像恢复 …

Poller描述符监控类实现(模块四)

目录 类功能 类设计 类实现 编译 类功能 类设计 //Poller描述符监控类 #define MAX_EPOLLEVENTS class Poller{private:int _epfd;struct epoll_event _evs[MAX_EPOLLEVENTS];std::unordered_map<int, Channel *> _channels;private:// 对epoll的直接操作void Updat…

探索C语言中的联合体与枚举:数据多面手的完美组合!

​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C语言学习 贝蒂的主页&#xff1a;Betty‘s blog 1. 联合体的定义 联合体又叫共用体&#xff0c;它是一种特殊的数据类型&…

Qt信号和槽机制(什么是信号和槽,connect函数的形式,按钮的常用信号,QWidget的常用槽,自定义槽函数案例 点击按钮,输出文本)

一.什么是信号和槽 信号槽式Qt中的一个很重要的机制。信号槽实际上是观察者模式,当发生了感兴趣的事件&#xff0c;某一个操作就会被自动触发。当某个事件发生之后&#xff0c;比如按钮检测到自己被点击了一下&#xff0c;它就会发出一个信号。这种发出类似广播。如果有对象对…

Mysql为什么使用B+Tree作为索引结构

B树和B树 一般来说&#xff0c;数据库的存储引擎都是采用B树或者B树来实现索引的存储。首先来看B树&#xff0c;如图所示&#xff1a; B树是一种多路平衡树&#xff0c;用这种存储结构来存储大量数据&#xff0c;它的整个高度会相比二叉树来说&#xff0c;会矮很多。 而对于数…