码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • NUMA备忘


    NUMA起源百度一搜一大把,就不写了,写几条笔记给自己备忘。

    为什么要关注NUMA

    原因就是由于在某个Node上运行的程序要访问的内存在另外一个Node(一个有内存控制器的单核或者多核CPU组合体,对intel AMD来说,一般一个物理socket就是一个Node)的内存控制器管理之下,会造成内存读写延时加大(非本地Node读写还要通过CPU之间的串行互联来传输,amd的HT,intel的QPI),而且如果遇上另外一个Node如果也有程序在读写这块内存,还存在争用情况,造成等待,还有就是两个Node还有缓存一致性也需要处理。

    由于存在这种情况,会让性能敏感型的应用程序响应时间变慢导致性能问题。

    如何配置NUMA

    硬件和操作系统有不同的地方对NUMA做调整。

    硬件

    在有多个Node服务器的BIOS里面,可能会存在 Memory Options > Node Interleaving.这样的选项,或者内存交错选项供开启或者关闭。

    开启  内存地址交错分布在机器上所有Node安装的内存上,但实际程序性能可能会受影响,因为实际物理上读写的时候,会出现程序在Node A上运行,但内存分布在Node A ,Node B两个Node所在的内存控制器下。

    禁用   默认状态,每个Node 各管各的内存。实际性能根据程序和程序所在的内存分布情况而定。

    参考Enabling or disabling node interleavinghttps://techlibrary.hpe.com/docs/iss/proliant-gen10-uefi/GUID-D7147C7F-2016-0901-0A72-000000000AAE.html

    操作系统

    操作系统可以在启动的时候给内核加参数numa=off关闭numa,这样系统下看到的就是一个Node,反正让程序是看起来是一个Node,分配内存的时候到底分配到那一块,会不会导致程序性能有问题,这还不太清楚,有待继续学习看内核如何处理的。反正系统下就没法用numactl来让程序绑定Node了。

    这在vmware的blog上有人做了些测试,我没细看,但针对的负载主要是oracle数据库,但百度搜索,oracle确实也有关于开启了numa出现bug的情况,所以好多情况下应该都是一关了之,但实际我觉得还是得根据版本和实际测试情况来看,我想其他数据库原理上也应该相同 ,但文章反复提及,不管开不开,都建议在测试环境做好充分测试。

    To NUMA or not to NUMA - Oracle workloads and NUMA - Virtualize Applicationshttps://blogs.vmware.com/apps/2020/08/to-numa-or-not-to-numa-oracle-workloads-and-numa.html

    但实际上,比较科学的办法就是让程序和程序使用的内存都在一个Node上才是最优解。

    这可以用numactl来做node绑定,taskset只能绑CPU,没法绑内存。

    numactl  --cpunodebind 0 --membind 0 xxxx   这样的格式来指定程序xxx的CPU和内存节点,

    注:实际未测试过,等有机会部署大内存程序测试。

    查看numa的状态可以用numastat ,当然也可以加-p 参数查看某个进程的numa内存分配情况。

    当然,程序也可以使用libnuma库来实现程序自己的numa感知和调度。

    还可以通过numad在后台周期性观察业务程序情况,从而动态调整numa分配,提高性能,当然,这个只是程序判断,具体业务还是人判断比较好。

    https://indico.cern.ch/event/304944/contributions/1672535/attachments/578723/796898/numa.pdfhttps://indico.cern.ch/event/304944/contributions/1672535/attachments/578723/796898/numa.pdf这个PDF是老外自己做的测试和结果分析,从他的结果分析来看,要么用绑定能测出好成绩,要么用named能优化出好成绩,但默认肯定不是最优的。下面嫖几张结果图吧。

     

    其他:

    在Libvirt里配置虚拟机的NUMA拓扑,可以直接在xml编辑里面添加拓扑

    1. <cpu>
    2. <numa>
    3. <cell cpus='0-3' memory='512000'/>
    4. <cell cpus='4-7' memory='512000'/>
    5. </numa>
    6. </cpu>

    参考的红帽官网虚拟化调试和优化指南手册。

    8.4. libvirt NUMA 调试 Red Hat Enterprise Linux 7 | Red Hat Customer Portalhttps://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/virtualization_tuning_and_optimization_guide/sect-virtualization_tuning_optimization_guide-numa-numa_and_libvirt#sect-Virtualization_Tuning_Optimization_Guide-NUMA-Guest_NUMA_Topology

    另外记录一点内存使用的备忘

    参考以下两个链接:


    NUMA导致的MySQL服务器SWAP问题分析与解决方案-百度网盘下载-Java自学者论坛 - Powered by Discuz!【SWAP产生原理】 先从swap产生的原理来分析,由于linux内存管理比较复杂,下面以问答的方式列了一些重要的点,方便大家理解:  1、swap是如何产生的 swap指的是一 ...https://www.javazxz.com/thread-7173-1-1.html分享Linux内存占用几个案例 - 知乎案例一问题最近一台 CentOS 服务器,发现内存无端损失了许多,free 和 ps 统计的结果相差十几个G,非常奇怪,后来Google了许久才搞明白。分析1、linux系统内存消耗主要有三个地方: 进程slabpagecacge用 free 命令…https://zhuanlan.zhihu.com/p/521290111第一个分析了由于NUMA节点内存使用不均衡,导致其中给一个节点不活动的内存太多,内存不够就被换出去了的情况。

    第二个分析了top ps 的used是没包括slab内存的情况(大量文件同步导致大量的inode这种小内存申请从slab里面取,但偏偏top ps没统计slab的使用量,这也不能怪top ps,毕竟对他们来说,他们是进程视角,free是系统视角)。

    内存水位:

    high  低于low时候,进行swap页面交换后,物理内存回收,达到high,停止回收。

    low 低于low时候,进行swap页面交换后,物理内存回收,

    min   空闲内存低于这个值(单位kB),发生内存直接回收,严重的时候就OOM(oom分高的进程可能就被回收挂了)了。

    内存分zone,一般系统有DMA ,DMA32 ,NORMAL,可以通过/proc/zoneinfo 查看每个zone的内存页面信息。

    Linux内存管理太复杂了,常见的都能百度到,但谁要能把系统里面的物理内存系统是怎么使用的以及内存都分布到哪儿去了说清楚了,那绝对是大师级的高手了。(自己经常连所有内存加起来都没法和物理内存给对应上,尤其是好多保留的那种。)

    [    0.000000] Memory: 8011812K/8323072K available (11772K kernel code, 1282K rwdata, 6524K rodata, 4096K init, 947K bss, 311260K reserved, 0K cma-reserved)
    

    reserved内存随着计算机内安装的物理内存越多,增长越多,有人有512G内存,这个reserved内存居然达到9G左右。不知道这个如何理解,搜遍google也没人说清楚,实在不行可能只有看内核源码了吧,但这工作量太大了,对基础知识也有一定要求,后面有机会再慢慢学习吧。

  • 相关阅读:
    大数据调度工具azkaban的安装,配置
    交叉编译glib
    困境添乱:即将开庭的2场离奇诉讼
    Redis(五)发布与订阅
    Perl中的文件系统守卫:实现自定义访问控制
    Redis典型应用之分布式锁
    Flink 1.13 源码解析——JobManager启动流程概览
    spring boot课程评价系统 毕业设计源码211004
    teamtalk原理
    Python 中的 4 个非常好用的自动化脚本
  • 原文地址:https://blog.csdn.net/chenqioulin/article/details/127908977
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号