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

news2025/1/12 12:00:20

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

深入研究计算机底层、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架构,也可以学,技多不压身!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux安装jdk、tomcat、MySQL离线安装与启动

一、JDK和Tomcat的安装 1.JDK安装 直接上传到Linux服务器的,上传jdk、tomcat安装包 解压JDK安装包 //解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 置环境变量(JAVA_HOME和PATH) vim /etc/profile 在文件末尾添加以下内容: //java environment expo…

matlab一维二维和三维RBF插值方法

1、内容简介 略 50-可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 matlab一维二维和三维RBF插值方法_哔哩哔哩_bilibili 4、参考论文 略

【Linux运维系列】vim操作

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

03-Linux权限

root用户 root用户(超级管理员) 无论是Windows、MacOS、Linux均采用多用的管理模式进行权限管理 在Linux系统中,拥有最大权限的账户名为:root(超级管理员)刚开始学习的时候,大多时间都是用的…

MySQL 篇-深入了解 DDL 语言(一)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 MySQL 说明 2.0 DDL 语言 2.1 DDL 语言 - 定义数据库 2.1.1 创建数据库操作 2.1.2 查看数据库操作 2.1.3 使用数据库操作 2.1.4 删除数据库操作 2.2 DDL 语言 …

leetcode-hot100-双指针

剪枝,减少不必要的计算 283. 移动零 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2: 输入: nums [0] 输出: [0] 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 第一印象:使用一个辅助数组,同时以…

蓝桥杯-答疑

原题链接:用户登录 答疑 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。一位同学答疑的过程如下 1.首先进入办公室,编号为 的同学需要 s,…

卖家横扫海外露营市场的机会来了,赛盈分销预测2024年消费者新需求

甲辰龙年开篇,就要迎来国外野营浪潮了,希望点开这篇推送的你,红红火火、热辣滚烫一整年。每年的3月份,海外用户对露营设备的搜索开始迅速增长。今天和大家聊聊露营市场出海的一些布局方向。 全球露营商品的市场规模愈发壮大&#…

Wireshark过滤DNS协议包语法实战

背景 现网DNS服务器发现CPU突增,发现有可能是客户恶意发起的随机子域名扫描,对服务器进行抓包分析,记录下当时的操作。 抓包 执行命令 tcpdump -iany port 53 and host $ip -nnv -w $ip.pcap进行抓包导出到本地,使用Wireshark进…

网站开发--详解Servlet

💕"Echo"💕 作者:Mylvzi 文章主要内容:网站开发–详解Servlet 一.基本介绍 tomcat是Java中开发服务器的重要的一个工具,任何开发的服务器都要部署在tomcat之上,可以说tomcat是所有服务器的底座,为了更好的操作http,to…

网络安全Web Hacking 101笔记,2023年最新整理!

在计算机技术如日中天的今天,Web安全问题也接踵而来。但Web安全却“入门简单精通难”,涉及技术非常多且广,学习阻力很大。 为此今天分享一份94页的《Web Hacking 101》笔记,包含Web安全知识,例如HTML注入、XSS、CSRF、…

MATLAB Function转C代码实战

文章目录 前言1. 准备工作2. 使用MATLAB Coder2.1 确定输入输出的类型2.2 MATLAB Coder过程 3. 代码调整和优化4. 编译和测试5. 性能分析和优化结语 前言 在科学与工程领域,MATLAB(Matrix Laboratory)是一种广泛使用的高级技术计算软件&…

Spring Boot 接口请求日志(基于AOP和自定义注解)

一、需求 在Spring Boot应用中,实现接口请求日志记录功能,要求能够记录包括请求方法、接口路径及请求参数等核心信息,并提供灵活的开关配置。 二、方案概述 采用AOP(面向切面编程)结合自定义注解的方式实现。 具体…

1904_ARM Cortex M系列芯片特性小结

1904_ARM Cortex M系列芯片特性小结 全部学习汇总: g_arm_cores: ARM内核的学习笔记 (gitee.com) ARM Cortex M系列的MCU用过好几款了,也涉及到了不同的内核。不过,关于这些内核的基本的特性还是有些不了解。从ARM的官方网站上找来了一个对比…

《游戏引擎架构》 -- 学习4

资源及文件系统 文件系统 游戏引擎的文件系统API通常提供以下功能: 搜需路径:是含一串路径的字符串,各路径之间以特殊字符(如冒号或分号)分隔,找文件时就会从这些路径进行搜寻。例如在命令行下执行程序&a…

2023年06月CCF-GESP编程能力等级认证Scratch编程一级真题解析

一、单选题(共10题,共30分) 第1题 以下不属于计算机输出设备的有( )。 A:麦克风 B:音箱 C:打印机 D:显示器 答案:A 第2题 点击下面哪个图标可以使舞台区…

真香!NineData SQL开发全面适配 GaiaDB

2 月,新年伊始,NineData 重磅发布,提供了对百度云原生关系型数据库 GaiaDB 的支持。 这一次的发布不仅仅是简单的数据源支持,而是覆盖了整个 SQL 开发能力的重要发布,意味着您已经可以完整地使用 NineData SQL 开发的…

Redis高并发分布锁实战

Redis高并发分布锁实战 问题场景 场景一: 没有捕获异常 // 仅仅加锁 // 读取 stock15 Boolean ret stringRedisTemplate.opsForValue().setIfAbsent("lock_key", "1"); // jedis.setnx(k,v) // TODO 业务代码 stock-- stringRedisTemplate.delete(&quo…

AI时代 编程高手的秘密武器:世界顶级大学推荐的计算机教材

文章目录 01 《深入理解计算机系统》02 《算法导论》03 《计算机程序的构造和解释》04 《数据库系统概念》05 《计算机组成与设计:硬件/软件接口》06 《离散数学及其应用》07 《组合数学》08《斯坦福算法博弈论二十讲》 清华、北大、MIT、CMU、斯坦福的学霸们在新学…

MySQL篇—持久化和非持久化统计信息介绍(第一篇,总共三篇)

☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…