单步调试Linux内核论证水位线watermark

哈喽,我是子牙,一个很卷的硬核男人

深入研究计算机底层、Windows内核、Linux内核、Hotspot源码……聚焦做那些大家想学没地方学的课程。为了保证课程质量及教学效果,一年磨一剑,三年先后做了这些课程:手写JVM、手写OS、带你用纯汇编写OS、手写64位多核OS、实战Linux内核…

这篇文章给大家分享Linux内核内存模块一个很重要的知识点:水位线,就是这玩意

这玩意干啥的呢?控制内存回收的。这玩意是理解Linux内核物理内存管理模块一个非常重要的知识点,还有一个就是lowmem_reserve,这个后面写文章详谈

关于水位线,能搜到的资料还是蛮多的,有的讲得蛮好的,但是我没有看到一篇文章是单步调试Linux内核给出证明的,如所有讲底层的文章还是一样,只是讲原理。所以我准备取其精华去其糟粕,结合自己的理解,再结合我能做到的单步调试Linux内核,写一篇通俗易懂、有理有据的文章。如果你觉得有收获,用你的小手点下分享就是对我最大的支持,创作不易……

我会分享这些:

  1. 水位线是个什么东东,机制是怎样的?

  2. Linux内核中有几条水位线,水位线的值是如何算出来的

  3. Linux内核是如何基于水位线控制内存回收线程的

  4. NUMA架构中,水位线是如何工作的

  5. 如果证明你说的都是对的

  6. 我想根据业务需求调整内存,怎么做

关注公众号【硬核子牙】,我写的硬核文章,关于操作系统、Linux内核、Java虚拟机…

本文是基于64位Linux内核写的,以下,enjoy

01   水位线watermark

如果你是做Java、Python、PHP的,你肯定听过垃圾收集器(GC),你写程序时不用考虑内存的申请与回收,都是由虚拟机帮你完成的。那虚拟机如何知道何时回收呢?有个阈值对吧,内存使用达到那个阈值就启动回收线程进行回收。这里说的水位线就相当于是这个阈值

那Linux内核中有几条水位线呢?三条。对应的阈值就是三个:

这三条水位线与内存回收线程之间是如何协同工作的呢?如图

从图中我们可以得出:

  1. 如果内存容量在high水位线之上,线程kswapd进入sleep

  2. 随着内存不断被使用,如果该zone中的可用内存,即managed_pages,低于low水位线,线程kswapd就会激活,进行异步内存回收

  3. 如果该zone中的可用内存,低于min水位线,这时候就会进入同步内存回收,即在__alloc_pages_slowpath函数中阻塞分配内存并尝试直接内存回收(reclaim)、内存压缩(compact)、更甚者OOM Killer强制回收,直到tatol size大于high水位线,回收才会停止

虽然从图中能得出这些信息,但是我猜这些问题是你想问的。比如:

  1. 什么是zone

  2. kswapd与zone之间的关系

  3. 水位线watermark与zone之间的关系

接着走……

02  Linux内核内存结构

有木有听过SMP、UMA、NUMA?不了解的话可以看下我之前写的相关文章 传送门

Linux内核是基于NUMA架构设计的,SMP/UMA架构被视为一个NUMA节点,如图

每个NUMA节点,在Linux内核中对应一个pglist_data对象。将每个NUMA节点包含的内存划分为多个zone进行管理,在Linux内核中的存在形式就是zone对象,关于zone是如何划分的,上面提到的文章里有讲到

水位线是与zone相关联的,而回收线程是与pglist_data相关联的,即一个NUMA节点只有一个内存回收线程kswapd。其实在内存紧张的时候,除了内存回收,还有内存压缩,对应的线程是kcompactd,这个后面有机会再聊

那水位线与zone之间的关系是怎样的呢?如图

到这里我们已经知道了:

  1. Linux内核是基于NUMA架构进行设计的,SMP/UMA架构在Linux内核中被视为只有一个节点的NUMA架构,用pglist_data对象来表示,内置一个内存回收线程kswapd

  2. Linux内核将一个NUMA节点中的内存分成几个ZONE进行管理,如果是64位内核,则包含这三个ZONE:DMA、DMA32、NORMAL

  3. 每个ZONE都有三条水位线:high、low、min,当每个zone的可用内存,即managed_pages,越过这三条水位线,分别会触发不同的内存回收机制

接下来咱们就来单步调试Linux内核,看三条水位线的阈值是如何算出来的

03  单步调试Linux内核论证

high与low是在min的基础上算出来的,所以我们先来看min是怎么算出来的

网上的文章大部分都说到它们三个之间的关系是这样的,其实是错的

我怎么证明他们说的是错的呢?我单步调试内核看结果的


min的计算公式是这样的

min = 当前NUMA节点要保留的最少page数 * 当前zone的总page数 / 当前NUMA节点的总page数

你是不是想问:公式为什么是这样的?那你得去问写这个Linux内核源码的coder了


当前NUMA节点的总page数是怎么算出来的呢?是每个zone的managed_pages - high_pages相加得到的,如图

得到当前NUMA节点的总page数=1259658pages


当前NUMA节点要保留的最少page数怎么算出来的呢?

将计算得到的new_min_free_kbytes与用户想优化内存设置的user_min_free_kbytes进行比较,直接看代码吧

经过一系列运算,得到当前NUMA节点要保留的最少page数=8978kbytes=2244pages


计算min的三个数据都有了,就可以计算min的值了,比如DMA区域的min的值

2244 * 3977 / 1259658 = 7


再来看high、low的值是如何算出来的

mult_frac的运算公式是

tmp就是在7乘以2与Result之间取最大值,结果是3。所以low的结果是10,high的结果是13

watermark_scale_factor的值是多少呢?

我们学习一个东西是为了用对吧!接下来看看,我们学会了水位线机制,那我们能用它来做什么呢?Linux内核内存调优!接下来讲讲如何做内存调优

04  Linux内核内存优化

从上面的讲解中可以看出,Linux内核提供了两个参数让我们可以调整内存:

  1. user_min_free_kbytes

  2. watermark_scale_factor

设置user_min_free_kbytes会影响三条水位线,设置watermark_scale_factor只会影响两条水位线:low、high。

user_min_free_kbytes更多地关注于保证系统在内存紧张时的稳定性和关键操作的可行性。所以内存密集型应用,可以调大user_min_free_kbytes,以减少同步回收内存的巨大消耗

而watermark_scale_factor则提供了一种机制,根据系统当前的内存状况动态调整内存回收的敏感度,以平衡性能和资源利用。一般不太会调

如何设置这两个参数呢:

这样设置会立即生效,对应的处理逻辑

至此,关于水位线的all就讲完了。你学会(废)了吗?如果觉得还不错,可以帮忙分享一下吗?

手写x64多核操作系统

我的《实战Linux内核》二期今晚开班,早鸟价最后一天4299,开班后恢复原价5000。如果你也想像我这样玩转Linux内核,可以咨询班主任,领取免费试看视频,了解一下我的讲课风格与技术实力,再做打算

课程共十二大专题,三个月时间,带你手写x86单核os、手写x64多核os打底,再带你以手写Linux驱动的方式实战Linux内核。只有这样学,才能真正学会Linux内核,才能做实验,而不是只是停留在原理层面,无法论证…

学完以后,你可以

为了保证课程质量,课程所有内容由子牙老师亲授!Linux内核中,少部分代码是体系相关的,主要受CPU架构的影响,绝大多数代码是体系无关的。这套课程是基于x86_64架构,你如果是ARM、MIPS、RISCV架构,也可以学,技多不压身!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

互联网加竞赛 机器视觉人体跌倒检测系统 - opencv python

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 机器视觉人体跌倒检测系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数&…

nn.AdaptiveAvgPool3d的用法

#B,C,D,H,W->B,C,1,H,W self.adaptive_pool nn.AdaptiveAvgPool3d((1, None, None)) nn.AdaptiveAvgPool3d的Pytorch官方文档: https://pytorch.org/docs/stable/generated/torch.nn.AdaptiveAvgPool3d.html import torch import torch.nn as nn # target output size of …

JavaAPI常用类02

目录 基本数据类型封装类 包装类常用属性方法 8中基本数据类型各自所对应的包装类 以下方法以java.lang.Integer为例 代码 运行 装箱和拆箱 装箱 何为装箱 代码 范围问题 代码 运行 拆箱 代码 String类 概述 代码 运行 创建形式 画图讲解 代码 运行 构造…

挑战杯 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 🔥 优质竞赛项目系列,今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖,适合作为竞赛课…

mac下使用jadx反编译工具

直接执行步骤: 1.创建 jadx目录 mkdir jadx2.将存储库克隆到目录 git clone https://github.com/skylot/jadx.git 3. 进入 jadx目录 cd jadx 4.执行编译 等待片刻 ./gradlew dist出现这个就代表安装好了。 5.最后找到 jadx-gui 可执行文件,双击两下…

Spring Cloud微服务网关Zuul过滤链实现的源码解读

一、Zuul过滤器的加载过程 Zuul网关的Filter需要经过初始化加载到Spring容器后,才能在请求中发挥作用: 在上篇文章:《Spring Cloud微服务网关Zuul的注解EnableZuulProxy或EnableZuulServer做了什么事情》 中说到的ZuulServerAutoConfigurati…

2-23 switch、JVM内存模型、垃圾回收机制、this、static、变量的分类

文章目录 switch 实现成绩评级JVM内存模型概念栈的特点堆的特点 垃圾回收机制通用的分代垃圾回收机制三种清理算法垃圾回收过程垃圾回收常见的两种检测引用算法内存泄露常见原因 this的用法创建对象的四步 static 静态特点 变量的分类和作用域import switch 实现成绩评级 switc…

windows安装git(全网最详细,保姆教程)

1.下载git(windows版本) 官网下载:Git - Downloads 点进去后,进入如下界面 2.安装git (1)找到下载到的文件,进行双击进行安装 (2)这里是安装前的使用说明, …

抖音博主老隋分享的temu蓝海项目怎么做更好?

很多网友在讨论老隋分享的temu蓝海项目,恰巧我也是通过抖音知道的这个项目,经过前段时间的系统学习temu的知识,加上我自己也是干过电商相关的工作,理解起来比较容易,下面我就用本文详细介绍一下抖音博主老隋分享的temu…

2024年2月22日 Go生态洞察:强化切片上的通用函数

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 专栏链接: 🔗 精选专栏:…

【人工智能高频面试题--基础篇】

🚀 作者 :“码上有前” 🚀 文章简介 :人工智能高频面试题 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 人工智能高频面试题 1.什么是人工智能?什么是人工智能神经网络?2.解释…

力扣 724. 寻找数组的中心下标

思路: 创建两个变量sum和sum1,sum代表左边元素的和,sum1代表右边元素的和 然后假设从数组下标0开始,一直到最后一个作为中心下标 如果sumsum1,返回此时的中心下标 如果所有下标循环完了,发现没有return…

F,B,Alpha Matting

https://huggingface.co/spaces/leonelhs/FBA-Mattinghttps://huggingface.co/spaces/leonelhs/FBA-Matting1.introduction matte细节要比分割多很多,大多数几种在增加编码器-解码器架构的分辨能力上,本文的特点在于同时计算alpha,F&#xff…

软件工程复习笔记

一、软件工程概述 软件 = 程序 + 数据 + 相关文档 软件危机(Software Crisis) 指由于落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。 软件工程三要素 方法、工具、过程 软件工程目标 在给定成本、进度的…

Linux部署前后端分离项目

目录 一、jdk安装 二、tomcat安装 三、MySQL安装 四、nginx安装 五、配置多个tomcat负载,部署后端项目 六、前端部署 一、jdk安装 1. 上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录,将安装包拖进去 2. 解压安装包 这里需要解压到usr/loc…

用一行代码在几秒钟内抓取任何网站

如果你正在寻找最强大的 Python 抓取工具?不要再看了!这一行代码将帮助你立即启动并运行。 Scrapeasy Scrapeasy 是一个 Python 库,可以轻松抓取网页并从中提取数据。它可用于从单个页面抓取数据或从多个页面抓取数据。它还可用于从 PDF 和…

【串口工具实战】关于USB转TTL工具的推荐

好的工具使用不但可以提高工作效率而且能够带来稳定性 一、更新日志 2024/02/26 A1.0 初稿 二、前言 以前:USB转TTL这东西有什么讲头不就是个数据转换模组集成 现在:你说的都对,对对对 结论:USB转TTL工具的推荐 作为下载…

软考37-上午题-【数据库】-数据模型、数据库的三级模式和二级映像

一、考情简介 上午题:6分——6道选择题 下午题:15分——一道分析题 E-R图、关系模式:下午考试必考!!!(编制也要考!) 二、数据模型 数据模型是对现实世界数据特征的抽象…

vue项目的前端工程化思路webpack(持续更新中)

写在前面:现在的前端网页功能丰富,特别是SPA(single page web application 单页应用)技术流行后,JavaScript的复杂度增加和需要一大堆依赖包,还需要解决Scss,Less……新增样式的扩展写法的编译工…

什么是Dapp

什么是Dapp Dapp(去中心化应用)程序的后端代码(智能合约)运行在一个去中心化的网络上,而非中心化的服务器。他们使用以太坊区块链网络作为数据存储端,并且用智能合约实现app的业务逻辑。 特点 智能合约&am…