当前位置: 首页 > news >正文

Linux 回收内存到底怎么计算anon/file回收比例,只是swappiness这么简单?

概述

Linux内核为了区分冷热内存,将page以链表的形式保存,主要分为5个链表,除去evictable,我们主要关注另外四个链表:active file/inactive file,active anon和inactive anon链表,可以看到这主要分为两类,file和anon page,内存紧张的时候,内核开始从inactive tail定量回收page,那么这里面就有个很重要的选择:inactive file和inactive anon lru链表的回收比例到底怎么确定?稍微了解mm的肯定都知道内核有个回收倾向可以设置:swappiness,值越大代表更多的回收anon内存,相反,更倾向于回收非anon内存,但是内核控制两者回收比例仅仅是swappiness控制这么简单吗?在阅读v6.1内核发现,随着内核的不断发展和优化,两者回收比例不断的迭代,逐步考虑到更多的情况,本文将以v6.1源码,逐步揭开内核对于两种page回收比例控制的神秘面纱。

比例计算的核心源码

ap和fp分别表示 anon和file扫描回收的比重,其计算主要是涉及几个重要的元素:swappiness,file_cost和anon_cost。为了更好的理解这几个控制变量的意义,我们需要从内核回收两种页面的涉及思想上来考虑。

1. 回收file-backed page和anon page的IO成本不同,故引入swappiness。

比如内核在引入zram内存压缩技术之前,回收anon page的成本比较高,因为需要将内存通过IO写入磁盘,而file-backed文件页有可能遇到clean page不需要IO回写,而比如嵌入式往往都存在zram内存压缩技术,anon匿名内存得回收成本可能比file-backed page要低得,因为内存操作性能比IO性能更好,所以swappiness这个控制选项从另外一个角度理解:代表两种类型得IO成本。

swappiness的具体函数参见内核文档:

 翻译:swappiness用于粗略得表示swap或者file-back page回收得IO成本,取值范围是0-200,如果是100代表内核得mm子系统认为内存回收两种page得IO成本是相当得。内核默认将该值设置60,这种情况内核认为swap的IO成本更高,但是对于存在内存swap的(比如zram或者zswap技术),超过100的值是值得考虑的,因为这种情况下swap是内存操作,性能更好,IO成本更低。

 2. 内存回收要考虑refault概率和两种类型page pageout的数量

refault次数:

内核引入workingset算法后,可以精准的评估出来两种page的refault次数;如果refault次数越多,认为file-cost或者anon-cost数值越大(意味者要减少回收比例,否则频繁发生了refault影响性能)。

pageout数量:

内核也要避免某一种类型的page在疯狂的进行回收,尽量做到均衡,内核实现的时候pageout的page数量也作为一种参考变量,如果某一种类型的页面回收的过多也需要进行一定程度的抑制。

源码解析

源码分析部分我们主要关注file-cost和anon-cost数值的计算逻辑,根据上面分析refault次数和pageout次数都会影响cost数值的计算,下面我们

http://www.lryc.cn/news/178580.html

相关文章:

  • 软件测试中的测试工具和自动化测试
  • 个人博客系统测试报告
  • 高效搜索,提升编程效率
  • Java编程技巧:文件上传、下载、预览
  • 【蓝桥杯选拔赛真题63】Scratch云朵降雨 少儿编程scratch图形化编程 蓝桥杯选拔赛真题解析
  • 【新版】系统架构设计师 - 软件架构的演化与维护
  • 安卓循环遍历计时器
  • Docker-基本了解
  • Leetcode383. 赎金信
  • overleaf杂谈-Springer文献格式问题
  • No148.精选前端面试题,享受每天的挑战和学习
  • BASH shell脚本篇4——函数
  • VisualStudio配置OpenCV环境
  • C++手写NMS
  • 第9讲:VUE中监听器WATCH使用详解
  • 微信小程序开发基础(一)认识小程序
  • LeetCode 1049. 最后一块石头的重量 II
  • Golang中的类型转换介绍
  • 本人碰到的RN项目的坑
  • EcmaScript标准-导入与导出-js
  • 如何将matlab中的mat矩阵文件在python中读取出来
  • 解释C语言中 6.18f (浮点数常量后缀)
  • Pandas 2.1中的新改进和新功能
  • c#static(静态)关键字
  • GitHub配置SSH key
  • 文件审计及文件完整性监控
  • 华为智能企业远程办公安全解决方案(1)
  • k8s中常用命令总结
  • Logistic map混沌掩盖信号
  • 外包干了2个月,技术有明显退步...