裁剪内核和新内核available差异大原因分析

news2024/12/22 19:41:29

背景

host内核裁剪时会进行收益的比较,比如裁剪前用5.10最新内核得出内存数据,然后和裁剪后的内存数据进行对比。

在进行对比中,发现裁剪后的内存available比裁剪前多了10个G,有点不正常了,需要分析下这10个G到底是怎么多出来的

5.10 最新内核:

裁剪后的内核:

 

available计算方法:

available是通过 si_mem_available 函数获取的,分析 si_mem_available 就可以给出available计算方法

        available = global_zone_page_state(NR_FREE_PAGES) - totalreserve_pages;

        /*
         * Not all the page cache can be freed, otherwise the system will
         * start swapping. Assume at least half of the page cache, or the
         * low watermark worth of cache, needs to stay.
         */
        pagecache = pages[LRU_ACTIVE_FILE] + pages[LRU_INACTIVE_FILE];
        pagecache -= min(pagecache / 2, wmark_low);
        available += pagecache;

        /*
         * Part of the reclaimable slab and other kernel memory consists of
         * items that are in use, and cannot be freed. Cap this estimate at the
         * low watermark.
         */
        reclaimable = global_node_page_state_pages(NR_SLAB_RECLAIMABLE_B) +
                global_node_page_state(NR_KERNEL_MISC_RECLAIMABLE);
        available += reclaimable - min(reclaimable / 2, wmark_low);

通过代码可以大致概括 available = free + pagecache + kernel_reclaimable - totalreserve_pages

上面公式里的 free 是 "free 命令" 里看到的 free,另外pagecache和kernel_reclaimable 也都是大于0的,所以 available 比 free 大10G,肯定是出在 totalreserve_pages 上了,所以接下来需要分析 totalreserve_pages 是怎么计算的

static void calculate_totalreserve_pages(void)
{
	struct pglist_data *pgdat;
	unsigned long reserve_pages = 0;
	enum zone_type i, j;

	for_each_online_pgdat(pgdat) {

		pgdat->totalreserve_pages = 0;

		for (i = 0; i < MAX_NR_ZONES; i++) {
			struct zone *zone = pgdat->node_zones + i;
			long max = 0;
			unsigned long managed_pages = zone_managed_pages(zone);

			/* Find valid and maximum lowmem_reserve in the zone */
			for (j = i; j < MAX_NR_ZONES; j++) {
				if (zone->lowmem_reserve[j] > max)
					max = zone->lowmem_reserve[j];
			}

			/* we treat the high watermark as reserved pages. */
			max += high_wmark_pages(zone);

			if (max > managed_pages)
				max = managed_pages;

			pgdat->totalreserve_pages += max;

			reserve_pages += max;
		}
	}
	totalreserve_pages = reserve_pages;
}

calculate_totalreserve_pages 函数会遍历numa node下所有的zone,然后把zone下的 lowmem_reserve 和 zone的 watermark[WMARK_HIGH] (也就是内存回收的高水位) 相加,然后得到 totalreserve_pages;

zone下的 lowmem_reserve 和 zone 的内存回收高水位他们的值分别是多少,去哪里看呢,可以通过 /proc/zoneinfo 查看。

lowmem_reserve:

cat /proc/zoneinfo | grep protection 输出的就是lowmem_reserve,有两行,一行表示numa0, 一行表示numa1,数组里几个数字分别表示不同zone下的lowmem_reserve,具体是 dma zone, dma32 zone, normal zone, moveable zone, device zone。

[root@localhost /mnt]# cat /proc/zoneinfo | grep protection
        protection: (0, 1221, 9401, 9401, 9401)
        protection: (0, 0, 8180, 8180, 8180)

[root@localhost ~]# cat /proc/zoneinfo | grep protection
        protection: (0, 1221, 9401, 9401, 9401)
        protection: (0, 0, 8180, 8180, 8180)

zoneinfo里的 protection就是 lowmem_reserve ,能看出5.10单机最新内核和我们裁剪过的内核,两者值是一样的

所以导致available不同的只可能是 watermark[WMARK_HIGH],所以接下来分析zone的高水位是怎么算出来的。

zone高水位值 high_wmark_pages:

zone的low水位和high水位是在 __setup_per_zone_wmarks 里设置的,需要分析 __setup_per_zone_wmarks 函数

 
static void __setup_per_zone_wmarks(void)
{
	unsigned long pages_min = min_free_kbytes >> (PAGE_SHIFT - 10);
	unsigned long lowmem_pages = 0;
	struct zone *zone;
	unsigned long flags;

	/* Calculate total number of !ZONE_HIGHMEM pages */
	for_each_zone(zone) {
		lowmem_pages += zone_managed_pages(zone);
	}

	for_each_zone(zone) {
		u64 tmp;

		spin_lock_irqsave(&zone->lock, flags);
		tmp = (u64)pages_min * zone_managed_pages(zone);
		do_div(tmp, lowmem_pages);
        /*
         * If it's a lowmem zone, reserve a number of pages
         * proportionate to the zone's size.
         */
        zone->_watermark[WMARK_MIN] = tmp;

		/*
		 * Set the kswapd watermarks distance according to the
		 * scale factor in proportion to available memory, but
		 * ensure a minimum size on small systems.
		 */
		tmp = max_t(u64, tmp >> 2,
			    mult_frac(zone_managed_pages(zone),
				      watermark_scale_factor, 10000));

		zone->watermark_boost = 0;
		zone->_watermark[WMARK_LOW]  = min_wmark_pages(zone) + tmp;
		zone->_watermark[WMARK_HIGH] = min_wmark_pages(zone) + tmp * 2;

		spin_unlock_irqrestore(&zone->lock, flags);
	}
}

这个函数初步看会很比较迷糊,linux kernel的一些写法和普通的用户态程序相比会有些奇怪,mult_frac是用第一个参数乘以 第二个参数分子和第三个参数的分母组成的分数。

mult_frac(zone_managed_pages(zone), watermark_scale_factor, 10000) 的意思相当于 总内存 * watermark_scale_factor / 10000, watermark_scale_factor 表示是总内存的万分之几。

watermark_scale_factor 这是个内核参数,可以配置,也可以使用默认值。

于是sysctl -a | grep watermark_scale_factor 发现两个内核版本之间这个值果然不一样。

结论

我们新内核的代码把 watermark_scale_factor 改成了100,这样高水位内存值自然就上去了。

那为什么我们内核裁剪的内核available会多些了,在空闲内存都是25G的情况下,available增加必然和 watermark_scale_factor有关,因为我是基于master分支打的包,于是查看master的watermark_scale_factor相关改动,https://console.google./devops/icode/cbu/linux-5-10/commits/e35d40db5c44f1ceae7b240c547fcbc0e1a2fb1a/mm/page_alloc.c,原来前段时间解决pdd抖动

所以是因为这个改动导致的available减少10G的,并不是我们内核裁剪增加了10G的available

watermark_scale_factor 决定多少空闲内存的时候开始回收内存,

10, 是千分之一整个系统内存的时候开始回收,1T的物理机,也就是只剩下1G的时候开始回收,2g的时候结束回收。

100, 是百分之一整个系统内存的时候开始回收,1T的物理机,也就是只剩下10G的时候开始回收,20G的时候结束回收。

对于我们的1T的机器,只有30g左右不是内存大页,10g开始回收内存太频繁了。

最近内核大佬在解决pdd虚拟机抖动问题的时候把这个也解决了,所以下次出的5.10内核rpm包是不会有available和free差异很大的情况了。

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

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

相关文章

基于VORS、CCDM模型、GeoDetector、GWR模型集成技术在城镇化与生态系统健康空间关系分析及影响效应

详情点击链接&#xff1a;基于VORS、CCDM模型、GeoDetector、GWR模型集成技术在城镇化与生态系统健康空间关系分析及影响效应 第一&#xff1a;生态系统健康理论基础及研究热点分析 1.生态系统健康概念及内涵 2.生态系统健康评价方法与指标体系 3.城镇化与生态系统健康 4.…

Git使用规范Git常用命令

Git使用规范&&Git常用命令 分支规范 master分支 master的分支HEAD和历史commit均是是稳定、可发布的状态。master分支的每个commit都需要打tag&#xff0c;如v1.0、v1.1、v1.2、v2.0等。仅能从test分支和hotfix分支合并过来。 hotfix的合并必须是通过代码审核和测试…

AI数字人:图像超分辨率模型 Real-ESRGAN

1 Real-ESRGAN介绍 1.1 Real-ESRGAN是什么&#xff1f; Real-ESRGAN全名为Enhanced Super-Resolution GAN&#xff1a;增强的超分辨率的对抗生成网络&#xff0c;是由腾讯ARC实验室发布的一个盲图像超分辨率模型&#xff0c;它的目标是开发出实用的图像/视频修复算法&#xf…

oled拼接屏在柳州的户外广告中有哪些应用展现?

柳州oled拼接屏是一种高端的显示屏&#xff0c;它采用了OLED技术&#xff0c;具有高亮度、高对比度、高色彩饱和度、高刷新率等优点&#xff0c;能够呈现出更加真实、清晰、细腻的图像效果。 同时&#xff0c;柳州oled拼接屏还具有拼接功能&#xff0c;可以将多个屏幕拼接在一…

2023婴幼儿奶粉市场数据分析(天猫数据中心)

我国婴幼儿奶粉市场一直保持着相当大的规模&#xff0c;虽然近几年新生人口数量不断下降&#xff0c;但伴随消费者的消费升级不断加速、大龄孩童吃奶粉的时间延长等&#xff0c;整体来看&#xff0c;婴幼儿奶粉行业市场规模保持平稳。 根据鲸参谋电商数据分析平台的相关数据显示…

240. 搜索二维矩阵 II

题目描述&#xff1a; 主要思路&#xff1a; 利用矩阵中的单调性进行搜索。 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int nmatrix.size(),mmatrix[0].size();int in-1,j0;while(i>0&&j<m){if(m…

Hadoop: High Available

序言 在Hadoop 2.X以前的版本&#xff0c;NameNode面临单点故障风险&#xff08;SPOF&#xff09;&#xff0c;也就是说&#xff0c;一旦NameNode节点挂了&#xff0c;整个集群就不可用了&#xff0c;而且需要借助辅助NameNode来手工干预重启集群&#xff0c;这将延长集群的停…

行为型模式 - 命令模式

概述 日常生活中&#xff0c;我们出去吃饭都会遇到下面的场景。 定义&#xff1a; 将一个请求封装为一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通&#xff0c;这样方便将命令对象进行存储、传递、调用、增加与管理。 结构 …

美颜SDK与动态贴纸技术的发展趋势:向更智能、更新颖的美化

美颜SDK和动态贴纸技术在近年来迅速发展&#xff0c;成为移动应用、社交媒体和视频直播等领域中不可或缺的元素。本文将探讨美颜SDK和动态贴纸技术的最新发展趋势&#xff0c;包括智能化算法的应用、增强现实的融合以及个性化定制的兴起。我们将展望未来&#xff0c;展示这些技…

LiveGBS流媒体平台GB/T28181功能-平台国标GB28181级联上级如何抓包分析windows抓包和Linux抓包Wireshark和TCPDUMP

LiveGBS平台国标GB28181级联上级如何抓包分析windows抓包和Linux抓包Wireshark和TCPDUMP 1、背景3、抓包工具准备3.1、Linux3.2、windows 3、找到级联的上级ip4、执行命令抓级联的上级ip4.1 Linux4.2 Windwos 5、触发相关操作6、停止抓包6.1、Linux6.2、Windows 7、查看抓包8、…

【笔试训练】排序子序列和倒置字符串

目录 一、选择题 二、倒置字符串 一、选择题 一、A 派生出子类 B &#xff0c; B 派生出子类 C &#xff0c;并且在 java 源代码有如下声明&#xff1a; 1. A a0new A(); 2. A a1new B(); 3. A a2new C(); 问以下哪个说法是正确的&#xff08;D&#xff09; A. 只有第一行能通…

项目化思维

项目任务负责人的角色 整合者 管理者 影响者 明确需求和目标&#xff1a;IPAD四问法 I:Influencer关键影响人 P:Purpose目的 A:Acceptance 成功标准 时间&#xff0c;成本&#xff0c;质量 D:Deliverables 可交付物 MoSCoW原则 任务分解WBS&#xff08;work breakdown str…

【已解决】哪些软件可以解压RAR文件?

RAR文件是我们日常生活及工作中经常用的压缩文件&#xff0c;文件压缩后可以更方便储存或者传输&#xff0c;后续要使用的时候再进行解压。 那RAR文件如何解压呢&#xff1f;哪些软件可以用来解压RAR文件&#xff1f;在这一方面还是小白的小伙伴可以来看看下面的分享。 解压任…

06_本地方法接口+07_本地方法栈

一、本地方法&#xff1f; 本地方法就是Java调用非Java代码的接口。 本地方法的作用是融合不同的编程语言为Java所用&#xff0c;它的初衷是融合 C、C程序 二、为什么要使用Native Method? 三、本地方法栈 Java虚拟机栈用于管理Java方法的调用&#xff0c;而本地方法栈用于…

JVM系统优化实践(20):GC生产环境案例(三)

您好&#xff0c;这里是「码农镖局」CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 某新手开发工程师接到了一个保存Elasticsearch日志的任务&#xff0c;以供后续分析之用。但写代码的时候&#xff0c;误将保存日志的代码段弄成了无限循环&#xff0c;程序…

玩转单细胞(10):替换单细胞Seurat对象UMAP坐标

玩转单细胞往期精彩系列&#xff1a; 玩转单细胞(2):Seurat批量做图修饰 玩转单细胞(3):堆叠柱状图添加比例 玩转单细胞(4):单细胞相关性 玩转单细胞(5):单细胞UMAP图只标记特定细胞群、圈定细胞群及坐标轴修改 玩转单细胞(6):单细胞差异基因展示之对角散点图 玩转单细胞…

《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(5)-Charles如何设置捕获Https会话

1.简介 在大数据时代&#xff0c;互联网时代&#xff0c;个人信息安全尤为重要&#xff0c;网络安全在近日多起电信诈骗事情发酵下的情况下&#xff0c;引起国家&#xff0c;企业&#xff0c;个人对于互联网安全进一步的重视。而之前很多以http协议传输的网站出现的网站信息泄露…

APIKIT 自学日记:不光有测试报告,还可以保存测试方案呢

在 APIkit 中做测试&#xff0c;可以直接查看测试报告的&#xff01; 测试报告 进入测试报告页面&#xff0c;在这里会列出所有手动批量测试、定时测试、Open api测试的测试报告。 查看测试报告 点击顶部的标签&#xff0c;进入定时测试报告列表&#xff0c;你可以在这里选择…

【hadoop】HDFS

HDFS 操作HDFSWeb Console 网页工具操作NameNode操作SecondaryNameNode 命令行Java API HDFS的原理解析数据上传的过程数据下载的过程 HDFS的高级特性回收站配额Quota名称配额空间配额 快照Snapshot安全模式 SafeMode权限管理&#xff1a;类似LinuxHDFS的集群 HDFS的底层原理&a…

LangChain + Embedding + Chromdb,关联使用ChatGLM的本地搭建训练平台教程

一.介绍 OpenAI 在国内用户注册会遇到各种阻力&#xff0c;目前可行的方法是使用本地数据集的功能实现联网搜索并给出回答&#xff0c;提炼出TXT、WORD 文档里的内容。 现在主流的技术是基于强大的第三方开源库&#xff1a;LangChain 。 文档地址&#xff1a;&#x1f99c;…