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://www.hqwc.cn/news/458532.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高速接口PCB布局指南(五)高速差分信号布线(三)

高速接口PCB布局指南&#xff08;五&#xff09;高速差分信号布线&#xff08;三&#xff09; 1.表面贴装器件焊盘不连续性缓解2.信号线弯曲3.高速信号建议的 PCB 叠层设计4.ESD/EMI 注意事项5.ESD/EMI 布局规则 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 …

《Git 简易速速上手小册》第8章:保护你的代码(2024 最新版)

文章目录 8.1 使用 .gitignore 优化你的仓库8.1.1 基础知识讲解8.1.2 重点案例&#xff1a;为 Python 项目配置 .gitignore8.1.3 拓展案例 1&#xff1a;使用全局 .gitignore8.1.4 拓展案例 2&#xff1a;忽略已经被跟踪的文件 8.2 管理敏感数据8.2.1 基础知识讲解8.2.2 重点案…

顺序图(Sequence Diagram)

也叫时序图、序列图 一、定义 顺序图是用来描述对象自身及对象间信息传递顺序的视图。 二、要素 活动者,对象,生命线,控制焦点,消息(同步消息,异步消息,返回消息,自关联消息) 1、 活动者 活动者发出情况或者接收系统的服务。 2、 对象 对象是特定行为与属性的集合。 表…

win10系统连接WiFi,输入正确密码,但还是提示错误

情况 电信宽带 mac和小米手机都可以连上wifi dell上的windows输入正确的密码还是提示错误 解决办法 根据路由器上的终端配置进入网页进行配置&#xff0c;我的是192.168.1.1&#xff0c;账户:useradmin 修改无线网络设置中的加密方式&#xff0c;由Mixed WPA2/WPA-PSK改为W…

深度学习(15)--PyTorch构建卷积神经网络

目录 一.PyTorch构建卷积神经网络(CNN)详细流程 二.graphviz torchviz使PyTorch网络可视化 2.1.可视化经典网络vgg16 2.2.可视化自己定义的网络 一.PyTorch构建卷积神经网络(CNN)详细流程 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;是一种深度学…

go 版本 LeeCode 刷题 在线

https://books.halfrost.com/leetcode/ChapterFour/0001~0099/0001.Two-Sum/ 参考 https://github.com/anzhihe/learning/tree/master/shell/book/abs-3.9.1_cn

LabVIEW动平衡测试与振动分析系统

LabVIEW动平衡测试与振动分析系统 介绍了利用LabVIEW软件和虚拟仪器技术开发一个动平衡测试与振动分析系统。该系统旨在提高旋转机械设备的测试精度和可靠性&#xff0c;通过精确测量和分析设备的振动数据&#xff0c;以识别和校正不平衡问题&#xff0c;从而保证机械设备的高…

[React] ref属性

简介 ref 即 reference &#xff0c;是 React 提供给我们的安全访问 DOM 元素或者某个组件实例的句柄。 组件被调用时会新建一个该组件的实例&#xff0c;而 ref 就会指向这个实例。它可以是一个回调函数&#xff0c;这个回调函数会在组件被挂载后立即执行。 为了防止内存泄漏…

【Java多线程案例】单例模式

1. 单例模式概念 设计模式&#xff1a;谈到单例模式&#xff0c;我们首先需要知道什么是设计模式&#xff0c;设计模式是软件工程中的一大重要概念&#xff0c;是被广泛认可并使用于解决特定实际问题的代码设计经验&#xff0c;校招中常考的设计模式有单例模式、工厂模式 等&a…

python的数据类型

&#x1f388;srting&#xff08;字符串&#xff09;&#xff1a; 操作符&#xff1a; &#xff1a;字符串连接 aabc befg print(ab) #输出 abcdefg * : 重复输出字符串 aabc print(a*3) #输出 abcabcabc [ : ]:截取字符串中的一部分&#xff0c;遵循左闭右开的原则&am…

李宏毅LLM——大模型+大资料的神奇力量

文章目录 大模型的重要性顿悟时刻 大资料的重要性数据预处理不一样的做法&#xff1a;KNN LM 对应视频P12-P14 大模型的重要性 模型参数和数据集越大&#xff0c;文字接龙的错误率越低 顿悟时刻 当模型超过10B-20B时&#xff0c;会突然顿悟 启示&#xff1a;不能只看最终结…

黑马Java——集合进阶(List、Set、泛型、树)

一、集合的体系结构 1、单列集合&#xff08;Collection&#xff09; 二、Collection集合 1、Collection常见方法 1.1代码实现&#xff1a; import java.util.ArrayList; import java.util.Collection;public class A01_CollectionDemo1 {public static void main(String[] a…