linux cpu 内存爆满 mysql停止_每个程序员都应该知道的 CPU 知识:NUMA

2023-11-08

什么是 NUMA?

早期的计算机,内存控制器还没有整合进 CPU,所有的内存访问都需要经过北桥芯片来完成。如下图所示,CPU 通过前端总线(FSB,Front Side Bus)连接到北桥芯片,然后北桥芯片连接到内存——内存控制器集成在北桥芯片里面。80b29be52b766b3b1217fb57458f4c86.png

这种架构被称为 UMA1(Uniform Memory Access, 一致性内存访问 ):总线模型保证了 CPU 的所有内存访问都是一致的,不必考虑不同内存地址之间的差异。

在 UMA 架构下,CPU 和内存之间的通信全部都要通过前端总线。而提高性能的方式,就是不断地提高 CPU、前端总线和内存的工作频率。

后面的故事,大部分人都很清楚:因为物理条件的限制,不断提高工作频率的路子走不下去了。CPU 性能的提升开始从提高主频转向增加 CPU 数量(多核、多 CPU)。越来越多的 CPU 对前端总线的争用,使前端总线成为了瓶颈。为了消除 UMA 架构的瓶颈,NUMA2(Non-Uniform Memory Access, 非一致性内存访问)架构诞生了:

2302147dd7cb4d1352dec11a378ef9f1.png
  1. CPU 厂商把内存控制器集成到 CPU 内部,一般一个 CPU socket 会有一个独立的内存控制器。
  2. 每个 CPU scoket 独立连接到一部分内存,这部分 CPU 直连的内存称为“本地内存”。
  3. CPU 之间通过 QPI(Quick Path Interconnect) 总线进行连接。CPU 可以通过 QPI 总线访问不和自己直连的“远程内存”。

和 UMA 架构不同,在 NUMA 架构下,内存的访问出现了本地和远程的区别:访问远程内存的延时会明显高于访问本地内存。

NUMA 的设置

Linux 有一个命令 numactl3 可以查看或设置 NUMA 信息。

  • 执行 numactl --hardware 可以查看硬件对 NUMA 的支持信息:
# numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
node 0 size: 96920 MB
node 0 free: 2951 MB
node 1 cpus: 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
node 1 size: 98304 MB
node 1 free: 33 MB
node distances:
node   0   1 
  0:  10  21 
  1:  21  10
  1. CPU 被分成 node 0 和 node 1 两组(这台机器有两个 CPU Socket)。
  2. 一组 CPU 分配到 96 GB 的内存(这台机器总共有 192GB 内存)。
  3. node distances 是一个二维矩阵,node[i][j] 表示 node i 访问 node j 的内存的相对距离。比如 node 0 访问 node 0 的内存的距离是 10,而 node 0 访问 node 1 的内存的距离是 21。
  • 执行 numactl --show 显示当前的 NUMA 设置:
# 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 
  • numactl 命令还有几个重要选项:
  1. --cpubind=0:绑定到 node 0 的 CPU 上执行。
  2. --membind=1:只在 node 1 上分配内存。
  3. --interleave=nodes:nodes 可以是 all、N,N,N 或 N-N,表示在 nodes 上轮循(round robin)分配内存。
  4. --physcpubind=cpus:cpus 是 /proc/cpuinfo 中的 processor(超线程) 字段,cpus 的格式与 --interleave=nodes 一样,表示绑定到 cpus 上运行。
  5. --preferred=1:优先考虑从 node 1 上分配内存。
  • numactl 命令的几个例子:
# 运行 test_program 程序,参数是 argument,绑定到 node 0 的 CPU 和 node 1 的内存
numactl --cpubind=0 --membind=1 test_program arguments

# 在 processor 0-4,8-12 上运行 test_program
numactl --physcpubind=0-4,8-12 test_program arguments

# 轮询分配内存
numactl --interleave=all test_program arguments

# 优先考虑从 node 1 上分配内存
numactl --preferred=1

测试 NUMA

#include 

#include 
#include 
#include 

int main(int argc, char** argv) {
  int size = std::stoi(argv[1]);
  std::vector<std::vector<uint64_t>> data(size, std::vector<uint64_t>(size));

  struct timeval b;
  gettimeofday(&b, nullptr);
  # 按列遍历,避免 CPU cache 的影响
  for (int col = 0; col     for (int row = 0; row       data[row][col] = rand();
    }
  }

  struct timeval e;
  gettimeofday(&e, nullptr);

  std::cout <"Use time "
            <1000000 + e.tv_usec - b.tv_sec * 1000000 - b.tv_usec
            <"us" <std::endl;
}
# numactl --cpubind=0 --membind=0 ./numa_test 20000
Use time 16465637us
# numactl --cpubind=0 --membind=1 ./numa_test 20000 
Use time 21402436us

可以看出,测试程序使用远程内存比使用本地内存慢了接近 30%

Linux 的 NUMA 策略

Linux 识别到 NUMA 架构后,默认的内存分配方案是:优先从本地分配内存。如果本地内存不足,优先淘汰本地内存中无用的内存。使内存页尽可能地和调用线程处在同一个 node。

这种默认策略在不需要分配大量内存的应用上一般没什么问题。但是对于数据库这种可能分配超过一个 NUMA node 的内存量的应用来说,可能会引起一些奇怪的性能问题。

下面是在网上看到的的例子:由于 Linux 默认的 NUMA 内存分配策略,导致 MySQL 在内存比较充足的情况下,出现大量内存页被换出,造成性能抖动的问题。

  • The MySQL “swap insanity” problem and the effects of the NUMA architecture4
  • A brief update on NUMA and MySQL5

参考资料

  1. UMA(Uniform Memory Access, 一致性内存访问):https://en.wikipedia.org/wiki/Uniform_memory_access
  2. NUMA(Non-Uniform Memory Access, 非一致性内存访问):https://en.wikipedia.org/wiki/Non-uniform_memory_access
  3. numactl:https://linux.die.net/man/8/numactl
  4. The MySQL “swap insanity” problem and the effects of the NUMA architecture:http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/
  5. A brief update on NUMA and MySQL:http://blog.jcole.us/2012/04/16/a-brief-update-on-numa-and-mysql/
  6. NUMA架构的CPU -- 你真的用好了么?:http://cenalulu.github.io/linux/numa/
  7. Thread and Memory Placement on NUMA Systems: Asymmetry Matters:https://www.usenix.org/conference/atc15/technical-session/presentation/lepers
  8. NUMA (Non-Uniform Memory Access): An Overview:https://queue.acm.org/detail.cfm?id=2513149
  9. NUMA Memory Policy:https://www.kernel.org/doc/html/latest/admin-guide/mm/numa_memory_policy.html
  10. What is NUMA?:https://www.kernel.org/doc/html/latest/vm/numa.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux cpu 内存爆满 mysql停止_每个程序员都应该知道的 CPU 知识:NUMA 的相关文章

  • [Anaconda]——Linux下conda虚拟环境缺“msvcrt”

    问题 这里是在使用不同节点的系统时 一个是普通的节点 一个是GPU节点 在普通节点下准备好了所有的环境 使用Linux的NIS功能 利用网络把硬盘挂载到不同的节点 这个时候普通节点和GPU节点就做到了数据同步 但是发现在使用conda虚拟环
  • ThinkPHP6 框架 对接 ChatGPT应用

    ThinkPHP6是一款优秀的PHP开发框架 它提供了丰富的功能和易于使用的API 使得开发人员可以快速构建高质量的Web应用程序 本文将介绍如何使用ThinkPHP6框架对接ChatGPT应用 实现智能聊天机器人的功能 首先 我们需要在T
  • 部署mac os渗透测试环境

    一 序言 每次重装系统后配置环境都是需要耗费大量时间 特此写一篇mac os部署渗透测试环境 二 过程 一 系统设置 1 常用设置 SSD 开启 TRIM 支持 sudo trimforce enable APP安装开启任何来源 sudo
  • Lua coroutine.create

    Lua coroutine creat 相当于在C 中使用lua newthread Equivalent of Lua coroutine create in C using lua newthread 问 题 I have a call
  • 基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十)面剔除

    Vries的教程是我看过的最好的可编程管线OpenGL教程 没有之一 其原地址如下 https learnopengl cn github io 04 20Advanced 20OpenGL 04 20Face 20culling 关于面剔
  • # HTB-Tier2- Vaccine

    HTB Tier2 Vaccine Web Network Vulnerability Assessment Databases Injection Custom Applications Protocols Source Code Ana
  • 毕业设计 基于Arduino的计算器

    0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求 为了大家能够顺利以及最少的精力通过毕设 学长分享优质毕业设计项
  • 暑期实训日志11——webstorm+chrome实时浏览插件

    在网上看到一个webstorm chrome里JetBrains IDE Support能够实现实时浏览的小工具 感觉非常实用 一 JetBrains IDE Support下载 下载地址 直接从谷歌商店下载也可 前提是进得去 下载好后打开
  • sqli-labs(28-28a)

    Less 28 1 测试http 127 0 0 1 sqli labs Less 28 id 1 27 页面回显不正常 但又没有错误提示 报错注入没戏 尝试闭合语句 加单引号回显不正常 说明sql语句闭合至少有 可能有 判断有无 在Les
  • log4cplus基础知识

    一 简介 log4cplus是C 编写的开源的日志系统 具有线程安全 灵活 以及多粒度控制的特点 通过将信息划分优先级使其可以面向程序调试 运行 测试 和维护等全生命周期 你可以选择将信息输出到屏幕 文件 NT event log 甚至是远
  • SSM controller要能跳转页面又要能返回字符串

    SpringMVC因为添加了下面这个bean 视图解析器 当你方法返回的是 json 字符串等其它值时 会404 跳转 jsp jsp页面
  • 回文数的判断

    文章目录 题目 一 方案一 二 方案二 三 方案三 四 方案四 题目 判断一个整数是否是回文数 回文数是指正序 从左向右 和倒序 从右向左 读都是一样的整数 提示 下面案例可供参考 一 方案一 public boolean palindro
  • 二叉树 深度优先搜索(DFS)、广度优先搜索(BFS)

    深度优先搜索算法 Depth First Search DFS是搜索算法的一种 它沿着树的深度遍历树的节点 尽可能深的搜索树的分支 当节点v的所有边都己被探寻过 搜索将回溯到发现节点v的那条边的起始节点 这一过程一直进行到已发现从源节点可达
  • pytorch Embedding模块,自动为文本加载预训练的embedding

    pytorch 提供了一个简便方法torch nn Embedding from pretrained 可以将文本与预训练的embedding对应起来 词 embedding word1 0 2 3 4 word2 1 2 3 4 word
  • Pytorch(六)(模型参数的遍历) —— model.parameters() & model.named_parameters() & model.state_dict()

    神经网络的模型参数 model parameters model named parameters model state dict 这三个方法都可以查看神经网络的参数信息 用于更新参数 或者用于模型的保存 作用都类似 写法略有出入 就以P
  • 爬虫技术研究综述

    爬虫技术研究综述 整理 Ackarlix 挨踢网 中文IT技术社区 http www aitic net 引言 随着网络的迅速发展 万维网成为大量信息的载体 如何有效地提取并利用这些信息成为一个巨大的挑战 搜索引擎 Search Engin
  • react运行项目出现报错:process is not defined

    具体报错效果 导致页面完全不能动弹 点击按钮没有效果 解决方式 首先删除 package lock json 文件夹 然后执行命令 npm install react error overlay 6 0 9 最后重新启动项目
  • End-to-End Object Detection with Transformers[DETR]

    End to End Object Detection with Transformers DETR 背景 概述 相关技术 输入 提取特征 获取position embedding transformer encoder decoder 回
  • C++ 学习笔记(17)tuple类型、bitset类型、随机数(引擎和分布)、IO库(操纵符、未格式化输入输出、随机访问)

    C 学习笔记 17 tuple类型 bitset类型 随机数 引擎和分布 IO库 操纵符 未格式化输入输出 随机访问 参考书籍 C Primer 5th 17 1 tuple 类型 17 1 1 定义和初始化tuple tuple 的构造函

随机推荐

  • 极路由 1s HC5661 玩转 openwrt

    注意 我的极路由1s是老版本的 是不带A的 安装篇 1 安装breed 根据这篇文章安装breed 成功后你就拥有了一台刷不死的路由器 2 下载openwrt系统 在这个网站可以下载 选择HC5661的版本 3 断电 按住reset键 上电
  • 在字符串中删除特定字符

    题目 在字符串中删除特定字符 删除后字符串变为 hi i a 即将原串中包含t e s中的都删除掉了 分析 方法 1 从头扫描原串 每遇到一个字符 在要删的串中比一遍 有的话就删除当前字符 然后继续下一个字符的判断 方法 2 由于方法 1
  • Shell编程学习(三)条件判断、流程控制

    条件判断 test 类似于if 前面说到过 可以用来判断上一个命令是否正确执行 我们就用一下这个命令来查看 等号两边要有空格 root iZwz9hv1phm24s3jicy8x1Z echo a 12 root iZwz9hv1phm24
  • MySQL是怎样运行的:从根儿上理解MySQL

    文章目录 快速查询的秘籍 B 树索引 1 没有索引的查找 1 1 在一个页中的查找 1 2 在很多页中查找 2 索引 2 1 一个简单的索引方案 2 2 InnoDB中的索引方案 1 聚簇索引 2 二级索引 2 3 InnoDB的B 树索引
  • python输出文件有省略号_解决python 输出是省略号的问题

    这个问题非常非常重要 搞了一晚上都没解决好 但是真的很简单很简单 如果你也 是用的numpy array 如果你也想得到输出矩阵的全部内容 而不是省略形式 0 10284943 0 0959931 0 00076021 0 01035775
  • 计算机技能应用大赛Java

    GO GO GO 大家好 我是你们的晴天学长 这是Java初赛考试范围知识点的快速链接 请自取哦 各位小伙伴觉得有帮助的话 可以给博主来波关注哦 考试范围 Java基础及环境 JDK发展历史 不同版本的进阶内容 Java程序的编写 编译 调
  • Unbuntu 20.4 配置RTX2080ti环境

    具体配置 显卡驱动460 cuda 11 0 3 450 51 06 linux run cudnn 11 3 linux x64 v8 2 1 32 Tensirflow 1 13 1 python 3 6 亲测有效
  • 微服务Ribbon在docker中无法通过服务名(SERVICE-ID)映射到宿主机IP

    I O error on GET request for http API ADMIN microservice 1 280d0f4200d8 nested exception isjava net UnknownHostException
  • Ubuntu操作系统学习笔记之FTP基础

    说明 FTP File Transfer Protocol 一个 古老但应用极为广泛 的互联网协议 FTP提供了一种可靠的方式在网络上进行文件共享 C S 架构 基于 TCP 提供了数据传输的可靠性 标准端口 20 数据端口 21 指令端口
  • 并发编程面试题汇总

    并发编程面试题 1 创建线程的方式有哪些 1 1继承 Thread 类 1 2实现 Runnable 接口 1 3实现 Callable 接口 1 4使用 Executors 工具类创建线程池 1 5使用 ThreadPoolExecuto
  • Sqli-labs Less8

    Sqli labs Less8 1 判断注入点 根据回显不同 存在单引号闭合注入点 可以尝试布尔盲注 2 判断字段 根据order by判断 字段数为3 3 爆破数据库 1 and length database 8 判断数据库名字的长度
  • 数据结构与算法【整理版】

    目录 数据结构 数据结构中查找 插入 删除分析 数组 链表 链表的创建代码 利用哨兵简化实现难度 删除链表中的倒数第N个结点 合并两个有序链表 141 环形链表 https leetcode cn com problems linked l
  • 【Unity-Cinemachine相机】虚拟相机旋转Composer属性详解

    Look At和Aim本质是控制虚拟相机自身的旋转 并不一定非要看着 或者并不一定非要瞄着这里的游戏对象 Look At和Aim是以Look At里面的对象作为参考来旋转自身 Do nothing 表现出来的行为和Look At空出来一样
  • iOS 应用测试总结

    在历代机型上的测试 主屏幕上的图标和程序名称显示是否正确 观察UI是否符合设计 多任务并存的情况下 测试app的流畅性 当前app的声音播放功能是否在拔出耳机后自动暂停 播放器类app或者有播放功能的app对各种格式文件的支持 播放视频时
  • 数据库JDBC(Java DataBase Connectivity)-->三层架构

    可以使用JDBC完成数据库的访问 java程序不能直接访问到某个具体的数据库 这种强耦合的方式不符合开闭原则 JDBC都是接口 具体JDBC的实现由数据库厂商来实现 将来数据库发生变化 只需要更改驱动 模拟数据库连接 通过反射创建对象 加载
  • 在Linux平台的CUDA cublas矩阵乘具体实现及编译过程

    文章目录 环境变量配置 代码 编译过程 结果 环境变量配置 vim bashrc 最后一行添加cublas v2所在的目录 export CPLUS INCLUDE PATH CPLUS INCLUDE PATH usr local cud
  • 从ChatGPT看人工智能

    ChatGPT是2022年出来的一个对话型人工智能 ChatGPT就是这样一种可以和人类用自然语言去交流的人工智能 一上线就引发了恐慌 最厉害的地方还是它能够用人类的语言来进行交流 不管是中文 英文 日文都可以 ChatGPT有可能就是传说
  • nuxt项目中引入ant design vue的less文件报错.bezierEasingMixin()

    最近使用nuxt 2 14 0版本当中使用 ant desgin vue 这个UI框架进行定制主题 首先 在nuxt项目当中的assets文件夹当中创建less文件夹 在less文件夹下创建index less和variable less文
  • 怎样在webpack中使用 art-template 模板引擎, art-template详解

    1 简介 art template是一个简约 执行速度超快的模板引擎 它采用作用域声明的技术来优化模板渲染速度 从而获得接近 Javascript 极限的运行性能 并且同时支持 NodeJs和浏览器 使用art template 便于代码的
  • linux cpu 内存爆满 mysql停止_每个程序员都应该知道的 CPU 知识:NUMA

    什么是 NUMA 早期的计算机 内存控制器还没有整合进 CPU 所有的内存访问都需要经过北桥芯片来完成 如下图所示 CPU 通过前端总线 FSB Front Side Bus 连接到北桥芯片 然后北桥芯片连接到内存 内存控制器集成在北桥芯片