图中的例子很典型,就是:多数的linux系统在free命令后会发现free(剩余)的内存很少,而自己又没有开过多的程序或服务。对于上述的情况,正确的解释是:linux的内存管理机制与windows的有所不同。具体的机制我们无需知道,我们需要知道的是,linux的内存管理机制的思想包括(不敢说就是)内存利用率最大化。内核会把剩余的内存申请为cached,而cached不属于free范畴。当系统运行时间较久,会发现cached很大,对于有频繁文件读写操作的系统,这种现象会更加明显。

直观的看,此时free的内存会非常小,但并不代表可用的内存小,当一个程序需要申请较大的内存时,如果free的内存不够,内核会把部分cached的内存回收,回收的内存再分配给应用程序。所以对于linux系统,可用于分配的内存不只是free的内存,还包括cached的内存(其实还包括buffers)。

1、通过定期采集/proc文件系统内的meminfo文件来获取当前内存使用情况:

proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的采集流程图。/proc/meminfo 信息如下: 需要使用的指标有:MemTotal ,MemFree,Buffers,Cached

MemTotal:总内存大小

MemFree: 空闲内存大小

Buffers和Cached:磁盘缓存的大小Buffers和Cached的区别:buffers 是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.

cached 是用来给文件做缓冲。

buffers 是用来存储目录里面有什么内容,权限等等。

而cached直接用来记忆我们打开的文件,比如先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。

而buffers随时都在增加,比如先后两次使用ls /dev后,就会发现第二次执行的速度会较第一次快。

这就是buffers/chached的区别。

2、下面分别从操作系统角度和应用程序角度来区别Buffers和Cached

使用free命令可以看到

对操作系统来说,Buffers和Cached是已经被使用的(上图Mem:这一行)

1      MemFree=total-used

2      314952=24946552-24631600

对应用程序来说(上图对应-/+ buffers/cache那一行)

1      MemFree=buffers+cached+free

2      19536392=152116+19069324+314952

通过看free命令的说明可以发现,free命令的数值是从/proc/meminfo文件重读取的。查看free的源码包查看其源码,明确知道了其中的每个数值的来源(具体内容可查看linux命令free源码解读:Procps free.c)。

有时我们计算内存使用率的时候会读取free命令的回显,但有时也会直接读取文件/proc/meminfo的内容,毕竟free命令的回显数据就是从meminfo文件中获得的。

然而,由于不同的linux发行版,在系统制作过程中会修改部分源码。一般的系统(如Debian)使用free命令和读取meminfo文件两种方式计算的内存使用率是相同的。但是对于部分系统,如SUSE(并不确定是每个版本的都是,这里指SUSE Enterprise Server 11),其在free命令回显的结果中,cached部分的值并不等于meminfo文件中的cached所显示的值,而是等于meminfo文件中cached部分和SReclaimable部分之和。

也就是说,debian之类的系统认为:

可用内存=free的内存+cached的内存+buffers的内存

而SUSE之类的系统则认为:

可用内存=free的内存+cached的内存+buffers的内存+SReclaimable的内存

PS:什么是SReclaimable?在linux内核中会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry。那么这些对象如果每次构建的时候就向内存要一个页,而其实际大小可能只有几个字节,这样就非常浪费,为了解决这个问题就引入了一种新的机制来处理在同一页框中如何分配小存储器区,这个机制可以减少申请和释放内存带来的消耗,这些小存储器区的内存称为Slab。meminfo文件中标识了Slab的大小,而SReclaimable是指可收回Slab的大小。

分类: Linux

正确计算linux系统内存使用率相关推荐

  1. linux 查看内存用量_正确计算linux系统内存使用率

    图中的例子很典型,就是:多数的linux系统在free命令后会发现free(剩余)的内存很少,而自己又没有开过多的程序或服务. 对于上述的情况,正确的解释是: linux的内存管理机制与windows ...

  2. Linux计算内存,正确计算linux系统内存使用率

    对操作系统来说,Buffers和Cached是已经被使用的(上图Mem:这一行) MemFree=total-used 314952=24946552-24631600 对应用程序来说(上图对应-/+ ...

  3. 自动清理内存linux,linux 过滤内存使用率并于计划任务结合来自动清理内存缓存...

    过滤出内存使用率并进行判断 #!/bin/bash echo "###cleand free_cache script########" #memory usage mem_pus ...

  4. [转]如何正确查看Linux机器内存使用情况

    原文链接 如何正确查看Linux机器内存使用情况 背景 只要工作上涉及到Linux机器,基本上都会有这样一个需求,查看内存使用情况,但是怎么看才正确呢?之前使用的是top命令,一直存在一个误区. 为什 ...

  5. Linux下内存使用率、CPU使用率、以及运行原理-转

    Linux下内存使用率.CPU使用率.以及运行原理 Linux下怎样查看机器配置啊?cpu/内存/硬盘 dmesg 显示开机信息.kernel会将开机信息存储在ring buffer中.您若是开机时来 ...

  6. Linux系统内存知识总结

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:22j.co/dJ29 Linux 内存是后台开发人员,需要深入了解 ...

  7. sql怎么把小数变百分比_云计算基本技能有哪些 怎么监控Linux系统内存

    云计算基本技能有哪些?怎么监控Linux系统内存?Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行.掌握Shell脚本是对云计算运维工程师的 ...

  8. 如何查看Linux的内存使用率

    Linux不像Windows,你不会总是可以看到一个图形化的系统界面,特别是在服务器环境中.作为 Linux 管理员,了解如何检查可用和已用资源(如内存.CPU.磁盘空间等)非常重要.如果有任何应用程 ...

  9. Linux系统内存管理之伙伴系统分析 - 旭东的博客 - 博客园

    Linux系统内存管理之伙伴系统分析 - 旭东的博客 - 博客园 Linux系统内存管理之伙伴系统分析 今天去面试,一位面试官提到了内存管理的伙伴系统,当时就懵了,因为根本就没有听说过.晚上回来在实验 ...

最新文章

  1. 2022-2028年中国热熔胶产业竞争现状及发展规模预测报告
  2. 深入理解按位异或运算符
  3. 利用PHPExcel转Excel柱形图
  4. 计算机科普知识小动画,4岁嗯哼知识量惊呆杜江!这4部科普启蒙动画,孩子绝对不能错过...
  5. Appium Python 六:管理应用和Activity
  6. React-native键盘遮挡输入框问题的解决
  7. 15个Java多线程面试题
  8. lua如何打印行号_LUA教程错误信息和回跟踪(Tracebacks)-34
  9. (八)flax Engine游戏引擎物理引擎——物理碰撞器
  10. google服务框架
  11. 你知道百度的全景街景地图是怎么做的吗?
  12. 相机参数(焦距)初始化对三维重建过程的影响
  13. Elasticsearch:运用 Elasticsearch 查找类似文档:more_like_this
  14. 谷歌浏览器翻译插件推荐——Google Chrome 插件推荐
  15. 2022年上海落户最快方式!本科2年落户上海!硕士1年落户上海!
  16. python openpyxl操作Excel表格
  17. java版餐饮管理系统
  18. Android ble开发详解
  19. IT基础架构规划方案三(IT基础软件和系统规划)
  20. 前端装逼技巧 108 式(一)—— 打工人

热门文章

  1. 操作系统 - - 生产者—消费者问题(PV操作)代码显示
  2. HDU 6608:Fansblog(威尔逊定理)
  3. Excel删除指定列(VB)
  4. java全jit编译_Javac编译与JIT编译
  5. python迭代遍历_迭代遍历思维
  6. 从GraalVM到Quarkus系列-B002篇-Quarkus中的字节码框架gizmo
  7. Chrome播放视频时只有声音没有画面
  8. table中填写数据并批量增加
  9. 谷歌pay 手续费_您可以使用Google Pay进行的所有操作
  10. 机器学习(七)音频可视化第一篇