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

linux查看剩余多少内存_内存性能篇-swap的概念

  • 背景
Swap 把不常访问的内存先写到磁盘中,
然后释放这些内存,给其他更需要的进
程使用。再次访问这些内存时,重新从
磁盘读入内存

有新的大块内存分配请求,但是剩余内存不足。
这个时候系统就需要回收一部分内存(比如前
面提到的缓存),进而尽可能地满足新内存请求。
这个过程通常被称为直接内存回收。

除了直接内存回收,还有一个专门的内核线程
用来定期回收内存,也就是 kswapd0
  • kswapd0
为了衡量内存的使用情况,kswapd0 定义了三个内存阈值
(watermark,也称为水位),分别是页最小阈值(pages_min)
、页低阈值(pages_low)和页高阈值(pages_high)。
剩余内存,则使用 pages_free 表示。

4dcd869894afc0c14ae48e68556c3ae7.png
kswapd0 定期扫描内存的使用情况,并根据剩余内存落在这三个阈值
的空间位置,进行内存的回收操作。

剩余内存小于页最小阈值,说明进程可用内存都耗尽了,只有内核才可
以分配内存。

剩余内存落在页最小阈值和页低阈值中间,说明内存压力比较
大,剩余内存不多了。这时 kswapd0 会执行内存回收,直到剩
余内存大于高阈值为止。

剩余内存落在页低阈值和页高阈值中间,说明内存有一定压力,但还可以满
足新内存请求。

剩余内存大于页高阈值,说明剩余内存比较多,没有内存压力



这个页低阈值,其实可以通过内核选项 /proc/sys/vm/min_free_kbytes 来间
接设置。min_free_kbytes 设置了页最小阈值,而其他两个阈值,都是根据页
最小阈值计算生成的,计算方法如下:
pages_low = pages_min*5/4
pages_high = pages_min*3/2
  • 为什么剩余内存很多但是swap却在升高
处理器的 NUMA (Non-Uniform Memory Access)架构导致的
在 NUMA 架构下,多个处理器被划分到不同 Node 上,且每个
 Node 都拥有自己的本地内存空间。而同一个 Node 内部的
内存空间,实际上又可以进一步分为不同的内存域(Zone),
比如直接内存访问区(DMA)、普通内存区(NORMAL)、伪内
存区(MOVABLE)等,如下图所示

ca6981698d7222f8305a490ede256923.png
然 NUMA 架构下的每个 Node 都有自己的本地内存空间,那么,在分析
内存的使用时,我们也应该针对每个 Node 单独分析。你可以通过 
numactl 命令,来查看处理器在 Node 的分布情况,以及每个 Node 的
内存使用情况。比如,下面就是一个 numactl 输出的示例
# 需要安装apt install numactl
root@ubuntu:~# numactl --hardware
available: 1 nodes (0)
node 0 cpus: 0 1 2 3
node 0 size: 7953 MB
node 0 free: 5699 MB
node distances:
node   0 
  0:  10 

我的系统中只有一个 Node,也就是 Node 0 ,而且编号为 0 、 1、2、3 的四个 CPU, 
都位于 Node 0 上。另外,Node 0 的内存大小为 7953 MB,剩余内存为 4416 MB
  • 内存阈值查看
root@ubuntu:~# cat /proc/zoneinfo 
Node 0, zone      DMA
  per-node stats
      nr_inactive_anon 2668
      nr_active_anon 232344
      nr_inactive_file 99975
      nr_active_file 97279
      nr_unevictable 4
      nr_slab_reclaimable 14518
      nr_slab_unreclaimable 17376
      nr_isolated_anon 0
      nr_isolated_file 0
      workingset_refault 0
      workingset_activate 0
      workingset_nodereclaim 0
      nr_anon_pages 232008
      nr_mapped    64949
      nr_file_pages 200270
      nr_dirty     52
      nr_writeback 0
      nr_writeback_temp 0
      nr_shmem     3017
      nr_shmem_hugepages 0
      nr_shmem_pmdmapped 0
      nr_anon_transparent_hugepages 0
      nr_unstable  0
      nr_vmscan_write 0
      nr_vmscan_immediate_reclaim 0
      nr_dirtied   35872
      nr_written   29016
  pages free     3968
        min      33
        low      41
        high     49
        spanned  4095
        present  3997
        managed  3976
        protection: (0, 2911, 7878, 7878, 7878)
      nr_free_pages 3968
      nr_zone_inactive_anon 0
      nr_zone_active_anon 0
      nr_zone_inactive_file 0
      nr_zone_active_file 0
      nr_zone_unevictable 0
      nr_zone_write_pending 0
      nr_mlock     0



上面参数单位是多杀?


pages 处的 min、low、high,就是上面提到的三个内存阈值,
而 free 是剩余内存页数,它跟后面的 nr_free_pages 相同。
nr_zone_active_anon 和 nr_zone_inactive_anon,分别是活
跃和非活跃的匿名页数。nr_zone_active_file 和 nr_zone_inactive_file,
分别是活跃和非活跃的文件页数。从这个输出结果可以发现,剩
余内存远大于页高阈值,所以此时的 kswapd0 不会回收内存

Node 扩充内存的方法

某个 Node 内存不足时,系统可以从其他 Node 寻找空闲内存,
也可以从本地内存中回收内存。具体选哪种模式,你可以通过
 /proc/sys/vm/zone_reclaim_mode 来调整。

它支持以下几个选项:默认的 0 ,也就是刚刚提到的模式,
表示既可以从其他 Node 寻找空闲内存,也可以从本地回收内存。

1、2、4 都表示只回收本地内存,2 表示可以回写脏数据回收
内存,4 表示可以用 Swap 方式回收内存。

查看命令:
root@ubuntu:~# cat /proc/sys/vm/zone_reclaim_mode 
0

swappiness 权重配置

内存回收的机制了。这些回收的内存既包括了文件页,
又包括了匿名页。

对文件页的回收,当然就是直接回
收缓存,或者把脏页写回磁盘后再回收。

而对匿名页的回收,其实就是通过 Swap 机制,
把它们写入磁盘后再释放内存。

既然有两种不同的内存回收机制,
那么在实际回收内存时,到底该先回收哪一种呢?
其实,Linux 提供了一个  /proc/sys/vm/swappiness 选
项,用来调整使用 Swap 的积极程度。swappiness 的范
围是 0-100,数值越大,越积极使用 Swap,也就是更倾
向于回收匿名页;数值越小,越消极使用 Swap,也就是
更倾向于回收文件页。虽然 swappiness 的范围是 0-100,
不过要注意,这并不是内存的百分比,而是调整 Swap 积极
程度的权重,即使你把它设置成 0,当剩余内存 + 文件页小
于页高阈值时,还是会发生 Swap。
  • 总结
在内存资源紧张时,Linux 通过直接内存回收和定期扫描
的方式,来释放文件页和匿名页,以便把内存分配给更需
要的进程使用。

文件页的回收比较容易理解,直接清空,或者把脏数据写
回磁盘后再释放。

而对匿名页的回收,需要通过 Swap 换出到磁盘中,下次访
问时,再从磁盘换入到内存中。

相关文章:

  • python小课文件_使用python实现一个(文件版)简单的课程管理系统
  • mfc在原页面的基础上增加一个页面并保存原来内容_简悦 1.1.4 发布了,它已经是一个即将满 1000 天的「老」产品了,这里有关于它的一些记忆...
  • python列表、元组、字典和集合的算法时间_Python中序列,列表,元组,字典及集合...
  • python自动处理文档_用Python完成一件小事:自动生成文档报告
  • htmlcss实例小项目_HTMLCSS学习笔记(一)-- 入门介绍
  • drools规则引擎可视化_几大工作流引擎对比
  • python3检测文件的编码格式_python判断文件的编码格式是否为UTF8 无BOM格式
  • git-2.29.2.2-64-bit安装_FairRoot安装注意事项
  • java执行sql文件_Mybatis进阶笔记:架构概述与基本执行流程梳理
  • catia二次开发_CATIA二次开发文件双手奉上,重命名非参后的CATPart
  • admin manager_Hadoop - 企业级大数据管理平台CDH(安装cloudera-manager)
  • python如何打印字符串_python 中 打印及格式化字符串的相关方法
  • selenium firefox驱动_[Selenium]2.开发环境配置
  • js regexp 匹配任意一个字符串_JavaScript基础知识:字符串的使用和基本操作
  • python列表的存储结构_3-Python内置结构-列表
  • @angular/forms 源码解析之双向绑定
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • CODING 缺陷管理功能正式开始公测
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • MD5加密原理解析及OC版原理实现
  • python学习笔记-类对象的信息
  • vue的全局变量和全局拦截请求器
  • Vue小说阅读器(仿追书神器)
  • vue自定义指令实现v-tap插件
  • Vue组件定义
  • 笨办法学C 练习34:动态数组
  • 编写高质量JavaScript代码之并发
  • 从零开始学习部署
  • 高性能JavaScript阅读简记(三)
  • 搞机器学习要哪些技能
  • 面试遇到的一些题
  • 批量截取pdf文件
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何选择开源的机器学习框架?
  • 新手搭建网站的主要流程
  • !$boo在php中什么意思,php前戏
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (Java)【深基9.例1】选举学生会
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (四)库存超卖案例实战——优化redis分布式锁
  • 、写入Shellcode到注册表上线
  • .gitignore
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ 转载 ] SharePoint 资料
  • [C/C++]数据结构 堆的详解
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统
  • [HTTP]HTTP协议的状态码
  • [Linux] LVS+Keepalived高可用集群部署
  • [python基础] python 2与python 3之间的区别 —— round
  • [pytorch入门] 3. torchvision中的transforms