numa节点间CPU利用率不均衡 - wakeup affinity

2023-11-13

最近遇到服务器numa节点间cpu利用率不均衡,清除sched_domain的flags中的AFFINE_WAKEUPS标志位是一个优化方法。但是如果直接将AFFINE_WAKEUPS关闭,将无法充分利用L2、L3 cache缓存命中带来的性能提升以及内存访问性能。

这还是要根据当前系统运行情况而定,例如在第二篇文章提到,如果在numa系统上,一个numa node利用率非常高,比如高于90%,而另一个node利用率可能只有60%~70%,这时可以尝试disable wakeup affinity,因为此时系统cpu利用率已经很高了(90%以上),相较于打开AFFINE_WAKEUPS所带来的缓存命中与内存访问的性能提升,高cpu利用率所导致的调度延迟所带来的影响更大。所以关闭AFFINE_WAKEUPS,使所有numa node的cpu利用率均衡起来,调度延迟会降低,尽管会带来缓存命中与内存访问的性能下降,但是两害取其轻才是重点。

下面是三篇相关AFFINE_WAKEUPS技术讨论的文章:

1, Wakeup Affinity | 我的黑色星期五(3)

Linux的进程调度有一个不太为人熟知的特性,叫做wakeup affinity,它的初衷是这样的:如果两个进程频繁互动,那么它们很有可能共享同样的数据,把它们放到亲缘性更近的scheduling domain有助于提高缓存和内存的访问性能,所以当一个进程唤醒另一个的时候,被唤醒的进程可能会被放到相同的CPU core或者相同的NUMA节点上。这个特性缺省是打开的,它有时候很有用,但有时候却对性能有伤害作用。设想这样一个应用场景:一个主进程给成百上千个辅进程派发任务,这成百上千个辅进程被唤醒后被安排到与主进程相同的CPU core或者NUMA节点上,就会导致负载严重失衡,CPU忙的忙死、闲的闲死,造成性能下降。

Wakeup affinity特性在中断唤醒进程时也起作用,在我们这个案例中,服务器有8个NUMA节点,只有一块网卡承担着所有的流量,网卡与1号NUMA节点最近,所有的网络中断都分配给1号NUMA节点的CPU去处理,当中断处理完成时,由于wakeup affinity特性的作用,所唤醒的用户进程也被安排给1号NUMA节点,导致1号NUMA节点的的负载非常高,结果就如前一篇《run queue latency》所阐述的,用户进程运行在1号NUMA节点上产生了很大的延迟,客户感觉到响应变慢。

Wakeup affinity特性对超配的KVM虚拟机也有负面的性能影响,参见https://lkml.org/lkml/2010/4/11/108

Wakeup affinity特性是可以手工关闭的,方法是清除/proc中sched_domain的flags中的AFFINE_WAKEUPS标志位,由于sched_domain有很多,所以最好写个脚本来做,比如:

# disable AFFINE_WAKEUPS

for file in `find /proc/sys/kernel/sched_domain/* -name flags` ; do echo $((`cat $file` & 0xffffffdf)) >$file ; done

#enable AFFINE_WAKEUPS

for file in `find /proc/sys/kernel/sched_domain/* -name flags` ; do echo $((`cat $file` | 0x20)) >$file ; done

在我们这个案例中,关闭wakeup affinity之后的效果比较明显,测试结果是8个NUMA节点的负载变得更加均衡了,应用的响应时间从最初的800-1000毫秒下降到700多毫秒。

2, https://nanxiao.me/linux-kernel-note-60-scheduling-domain/

NUMA系统上,由于不同CPU直接访问本地内存和远端内存的时间相差很大,所以更好地调度算法就显得很重要。Linux kernel引入了scheduling domain的概念。可以参看下面例子:

[root@localhost ~]# cd /proc/sys/kernel/sched_domain/
[root@localhost sched_domain]# ls
cpu0  cpu1  cpu2  cpu3  cpu4  cpu5  cpu6  cpu7
[root@localhost sched_domain]# ls -alt *
cpu0:
total 0
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 domain0
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 domain1
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 .
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 ..

cpu1:
total 0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain1
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 .
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 ..

cpu2:
total 0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain1
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 .
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 ..

... ...

cpu7:
total 0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain0
dr-xr-xr-x. 1 root root 0 Feb 26 20:06 domain1
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 .
dr-xr-xr-x. 1 root root 0 Feb 26 19:37 ..

/proc/sys/kernel/sched_domain/目录下每个CPU都有一个自己的目录,并且每个CPU目录下都有和自己相关的domain信息。

multi-level系统中,也拥有multi-levelscheduling domain(内核中结构体是struct sched_domain)。每个scheduling domain包含一组共享属性和调度策略的CPU;每个scheduling domain包含至少一个或多个CPU group(内核中结构体是struct sched_group),每个CPU group会被scheduling domain看做一个独立的单元。

scheduling domain的核心代码位于kernel\sched\core.c中,关于/proc/sys/kernel/sched_domain/cpu$/domain$中各个文件的含义,都可以在这里找到。

NUMA系统上,如果一个node利用率非常高,比如高于90%,而另一个node利用率可能只有60%~70%,这时可以尝试disable wakeup affinity

参考资料:
Scheduling domains
sched-domains.txt
Does domain0 in /proc/sys/kernel/sched_domain/cpu$ refer top-level domain in the system?
How to understan /proc/sys/kernel/sched_domain/cpu$/domain$/flags?

3,Redis 高负载下的中断优化

https://blog.csdn.net/meituantech/article/details/80062289

NUMA 架构下的中断优化
这时我们再回归到中断的问题上,当两个NUMA节点处理中断时,CPU实例化的softnet_data以及驱动分配的sk_buffer都可能是跨node的,数据接收后对上层应用Redis来说,跨node访问的几率也大大提高,并且无法充分利用L2、L3 cache,增加了延时。

同时,由于Linux wake affinity 特性,如果两个进程频繁互动,调度系统会觉得它们很有可能共享同样的数据,把它们放到同一CPU核心或NUMA Node有助于提高缓存和内存的访问性能,所以当一个进程唤醒另一个的时候,被唤醒的进程可能会被放到相同的CPU core或者相同的NUMA节点上。此特性对中断唤醒进程时也起作用,在上一节所述的现象中,所有的网络中断都分配给CPU 0去处理,当中断处理完成时,由于wakeup affinity特性的作用,所唤醒的用户进程也被安排给CPU 0或其所在的numa节点上其他core。而当两个NUMA node处理中断时,这种调度特性有可能导致Redis进程在CPU core之间频繁迁移,造成性能损失。

综合上述,将中断都分配在同一NUMA Node中,中断处理函数和应用程序充分利用同NUMA下的L2、L3缓存、以及同node下的内存,结合调度系统的wake affinity特性,能够更进一步降低延迟。

SMP 架构
随着单核CPU的频率在制造工艺上的瓶颈,CPU制造商的发展方向也由纵向变为横向:从CPU频率转为每瓦性能。CPU也就从单核频率时代过渡到多核性能协调。

SMP(对称多处理结构):即CPU共享所有资源,例如总线、内存、IO等。

SMP 结构:一个物理CPU可以有多个物理Core,每个Core又可以有多个硬件线程。即:每个HT有一个独立的L1 cache,同一个Core下的HT共享L2 cache,同一个物理CPU下的多个core共享L3 cache。

下图(摘自内核月谈)中,一个x86 CPU有4个物理Core,每个Core有两个HT(Hyper Thread)。图:https://mp.weixin.qq.com/s/y1NSE5xdh8Nt5hlmK0E8Og

NUMA 架构
在前面的FSB(前端系统总线)结构中,当CPU不断增长的情况下,共享的系统总线就会因为资源竞争(多核争抢总线资源以访问北桥上的内存)而出现扩展和性能问题。

在这样的背景下,基于SMP架构上的优化,设计出了NUMA(Non-Uniform Memory Access)—— 非均匀内存访问。

内存控制器芯片被集成到处理器内部,多个处理器通过QPI链路相连,DRAM也就有了远近之分。(如下图所示:摘自CPU Cache)

CPU 多层Cache的性能差异是很巨大的,比如:L1的访问时长1ns,L2的时长3ns...跨node的访问会有几十甚至上百倍的性能损耗。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

numa节点间CPU利用率不均衡 - wakeup affinity 的相关文章

  • java Timer(定时调用、实现固定时间执行)

    最近需要用到定时调用的功能 可以通过java的Timer类来进行定时调用 下面是有关Timer的一些相关知识 其实就Timer来讲就是一个调度器 而TimerTask呢只是一个实现了run方法的一个类 而具体的TimerTask需要由你自己
  • ejb 3.1 中的计时器服务 - 调度调用超时问题

    我使用 Singleton Schedule 和 Timeout 注释创建了简单的示例 以尝试它们是否能解决我的问题 场景是这样的 EJB 每 5 秒调用一次 检查 函数 如果满足某些条件 它将创建单个操作计时器 该计时器将以异步方式调用一
  • 评估复杂的时间模式

    我想定义和评估一些非常复杂的时间模式的出现 这些模式无法通过 CRON 表达式轻松处理 有没有图书馆可以帮助我做到这一点 例如 我希望它每 25 秒发生一次 我只想发生在每月的第一天和最后一天 但每月的第一天应该让我在上午 9 00 到 1
  • Go调度器什么时候会创建新的M和P?

    刚刚学习了golang GMP模型 现在我了解了goroutines 操作系统线程和golang上下文 处理器如何相互协作 但我还是不明白什么时候会产生M和P 例如 我有一个测试代码来在数据库上运行一些操作 并且有两个测试用例 两批 gor
  • AttributeError:无法使用多处理队列来pickle本地对象'computation..function1

    我有使用调度程序和多处理模块的以下代码 def computation def function1 q while True daydate datetime now number random randrange 1 215 print
  • 如何安排python脚本在给定时间退出

    我需要安排一个 python 脚本 它可以在给定时间退出并自行终止 对于调度 我使用 pythonschedule下面是代码 import schedule from threading import Thread import time
  • 在元组列表中获得最大并发的有效方法是什么?

    我一直在努力以有效的方式解决这个问题 问题是 问题陈述 给定以下形式的元组列表 start1 end1 start2 end2 start3 end3 startn endn 其中 start 和 end 是正整数 每个元组代表一个时间窗口
  • 在android中创建一个定时服务

    我需要用java在android中创建一个日程服务 我尝试了一些代码 但在构建应用程序后它始终无法运行 我的逻辑很简单 我想创建一个服务来检查蓝牙文件夹路径中是否存在文件 如果该文件存在 那么该服务将运行另一个应用程序 我需要每 2 分钟运
  • 如何从 Postgres 的预订中查找第一个免费开始时间

    人们的工作时间为上午 10 00 至晚上 21 00 周日和公共假期除外 每隔 15 分钟为他们预留一个工作岗位 工作时间为15分钟至4小时 整个工作必须适合一天 如何查找从当前日期和时间开始在 Postgres 9 3 中未在给定持续时间
  • 使用 Schedule 库安排异步函数。 (使用discord.py重写)

    我的上一篇文章被错误地标记为重复 我不想做 asyncio sleep 因为它在几周内太不准确了 我需要时间表库 我发现了一个类似的线程 如何使用计划库运行异步函数 https stackoverflow com questions 515
  • 查找所有参与者都可以参加的会议时段的算法

    在采访博客中遇到这个问题 给出表格中的空闲时间安排 a b i e from a to b of n人们 打印所有时间间隔 其中所有n参与者有空 它就像一个日历应用程序 建议可能的会议时间 Example Person1 4 16 18 2
  • 如何在 django 中安排将来某个时间发送电子邮件?

    我想安排在执行特定操作时向用户发送电子邮件 但是 如果用户采取其他操作 我想取消该电子邮件并且不发送它 我该如何在 django 或 python 中做到这一点 豆茎 如果可以安装的话豆茎 http kr github com beanst
  • Websphere Liberty Profile 中的 Java EE-Timer / @Schedule

    我想使用计时器服务 特别是 Schedule注解 http docs oracle com javaee 6 api javax ejb Schedule html 在 WebSphere Liberty Profile 中 那可能吗 有一
  • EJB @Schedule 等待方法完成

    我想编写一个每分钟执行一次的后台作业 EJB 3 1 为此 我使用以下注释 Schedule minute 1 hour 工作正常 但是 有时该作业可能需要一分钟以上的时间 在这种情况下 计时器仍然会被触发 从而导致线程问题 如果当前执行未
  • 预订表中仅允许工作时间

    PostgreSql 9 2 保留表定义为 CREATE EXTENSION btree gist CREATE TABLE schedule id serial primary key during tsrange not null EX
  • 有什么方法可以显示线程切换吗?

    请问有没有什么办法或者工具可以展示线程切换的过程 即可以知道在任何特定的时间 CPU被哪个线程占用 以及上下文切换的时间成本 谢谢 SystemTap 对于这种事情很有用 有一个罐装的例子sched switch stp http sour
  • 如何使用计划库运行异步函数?

    我正在使用discord py rewrite 编写一个discord 机器人 并且我想每天在特定时间运行一个函数 我对异步函数完全没有经验 而且我无法弄清楚如何在不使用 await 的情况下运行异步函数 这只是我的一段代码 这就是为什么有
  • Python 调度一个作业,每个工作日开始,每小时运行一次

    我目前有一个示例代码定义为 import schedule import time def job t print I m working t return schedule every day at 01 00 do job It is
  • 如何在 Jenkins 中安排构建?

    如何安排 Jenkins 构建 使其只能在每天的特定时间进行构建 例如下午 4 点开始 0 16 1 7 我理解为 每个月周一到周日下午 0 分钟 下午 4 点 但是它每分钟都会构建 如果有任何建议 我将不胜感激 谢谢 Update 请阅读
  • 如何在 PostgreSql 的预订表中找到第一个空闲时间

    预订表包含预订开始日期 开始时间和持续时间 工作日的开始时间为工作时间 8 00 18 00 以半小时为增量 持续时间也以每天半小时为增量 CREATE TABLE reservation startdate date not null s

随机推荐

  • “终于懂了” 系列:组件化框架 ARouter 完全解析(三)AGP/Transform/ASM—动态代码注入

    ARouter系列文章 终于懂了 系列 组件化框架 ARouter 完全解析 一 原理全解 终于懂了 系列 组件化框架 ARouter 完全解析 二 APT 帮助类生成 终于懂了 系列 组件化框架 ARouter 完全解析 三 AGP Tr
  • opencascad从入门到进阶之:下载 配置和编译

    Open CASCADE 简称OCC 平台是由法国Matra Datavision公司开发的CAD CAE CAM软件平台 可以说是世界上最重要的几何造型基础软件平台之一 开源OCC对象库是一个面向对象C 类库 用于快速开发设计领域的专业应
  • java 图片压缩 base64_java图片上传(2)----base64压缩图片

    本篇是用base64技术进行上传图片 前端进行压缩生成base64 后端接收base64字符串 进行解码 通过流保存到服务器文件夹上 重点在于 压缩图片 canvas 和base64 FileReader 页面元素 js function
  • npm WARN saveError ENOENT: no such file or directory, open 'C:\Users\...\package.json'问题解决

    根据错误提示 是系统没有 package json 这个文件导致 这个文件的作用就是管理你本地安装的npm包 所以我们要生成一个package json文件 执行命令 npm init 创建package json文件 系统会提示相关配置
  • 力扣:287. 寻找重复数

    给定一个包含 n 1 个整数的数组 nums 其数字都在 1 n 范围内 包括 1 和 n 可知至少存在一个重复的整数 假设 nums 只有 一个重复的整数 返回 这个重复的数 你设计的解决方案必须 不修改 数组 nums 且只用常量级 O
  • QT 手动触发一个槽函数

    QT 手动触发一个槽函数 1 使用emit关键字即可 创建一个信号 2 然后在需要的地方使用 就可以了 3 要注意的是 4 自定义界面控件的信号与槽函数 在对ui界面的控件添加槽函数的时候 直接右键添加即可 在构造函数内也不会看到conne
  • phpcms thumb缩略图调用图片失真的解决方法

    thumb 函数用于缩放图片 问题起源于调用方式缺少参数 当原图大小与缩略图比例不一致会出现图片失真错位的问题 其表现形式为 string thumb string imgurl int width 100 int height 100 i
  • Redis系列2-单节点安装

    一 下载压缩包 链接 https pan baidu com s 1IvXq xxZI3YckPHxXFwH9w 提取码 hghj 二 打开master主节点 先拍快照 1 配置阿里云yum源 下载配置文件 wget O etc yum r
  • 【C++入门到精通】C++入门 —— 类和对象(了解类和对象)

    目录 一 类和对象的历史由来 二 面向过程和面向对象的初步认识 三 类 1 引子 2 类的定义 3 类的访问限定符及封装 访问限定符 访问限定符解释说明 struct 与 class 的区别 1 默认访问级别 2 继承权限 默认的继承方式
  • wildfly 配置 pinpoint

    wildfly版本10 pinpoint版本1 8 4 set JAVA OPTS JAVA OPTS Djboss modules system pkgs org jboss logmanager com navercorp pinpoi
  • debian和archlinux下使用fcitx5-rime中州韵输入法之双拼及美化

    1 安装fcitx5和fcitx5 rime 中州韵输入法 apt install fcitx5 fcitx5 rime 2 启用fcitx5 debian用im config im config archlinux用 nano xprof
  • 使用反射技术实现的导入Excel文件到数据库的公共方法

    还是干脆 利索直接上代码最实惠 1 定义接口类IImportService public interface IImportService
  • R语言—随机抽样

    文章目录 专题 随机抽样 简单随机抽样 sample函数 srswor函数 srswr函数 分层抽样 专题 随机抽样 简单随机抽样 从总体中抽取样本的方法很多 最常用的方法是简单随机抽样 简单随机抽样 从容量为N的总体中 任意抽取n个单位作
  • consul学习与常用命令和使用教程

    目录 consul是什么 常用命令 API 实例1 新建服务API 注册服务 查询服务 consul是什么 Consul是分布式的 高可用的 可横向扩展的用于实现分布式系统的服务发现与配置 consul就是提供服务发现的工具 做服务发现的框
  • pyqt5按钮点击时传递参数(通过lambda表达式)

    pyqt5中按钮点击事件的响应 常见的是下面的方式 self btn clicked connet self click method 现在想在按钮click的时候能够传递参数 可以借助lambda表达式 self btn clicked
  • 数字IC手撕代码---百题斩

    前言 本篇导览目录 用来索引笔者写的其他手撕代码文章 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手
  • 线性代数的本质(六)——线性空间

    文章目录 线性空间 线性空间 子空间 坐标与同构 线性变换与矩阵 基变换与坐标变换 线性空间 线性空间 Grant 普适的代价是抽象 仔细分析就会发现 关于向量空间的一切概念及有关定理都不依赖于向量的具体表现形式 有序数组 也不依赖于向量加
  • 17、SysTick—系统定时器

    17 SysTick 系统定时器 文章目录 17 SysTick 系统定时器 1 SysTick简介 2 SysTick寄存器介绍 3 SysTick 定时实验 3 1 硬件设计 3 2 软件设计 本章参考资料 Cortex M3 内核编程
  • 【硬件电子】基础知识点学习记录

    眼图 USB信号质量判断通过下面哪个参数来判断 A 眼图 B 电压 C 信噪比 D 失真度 解析 眼图测试主要是用来检测高速串行传输的信号质量 本题选A 眼图 是由于示波器的余辉作用 将扫描所得的每一个码元波形重叠在一起 从而形成眼图 眼图
  • numa节点间CPU利用率不均衡 - wakeup affinity

    最近遇到服务器numa节点间cpu利用率不均衡 清除sched domain的flags中的AFFINE WAKEUPS标志位是一个优化方法 但是如果直接将AFFINE WAKEUPS关闭 将无法充分利用L2 L3 cache缓存命中带来的