图中的例子很典型,就是:多数的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:这一行)

MemFree=total-used

314952=24946552-24631600

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

MemFree=buffers+cached+free

19536392=152116+19069324+314952

所以本着监控应用对物理内存使用情况的目的采取如下计算方法:

内存使用率(MEMUsedPerc)=100*(MemTotal-MemFree-Buffers-Cached)/MemTotal

在这里为了PatrolAgent的监控性能,采用定期读取/proc/meminfo文件来获取MemTotal ,MemFree,Buffers,Cached这些参数的值

该算法在MEMORY.km中实现。

===============================================================

通过看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查看处理器型号 If you rely on somebody else for managed hosting of your Linux servers, you might not a ...

  2. linux 查看ntp版本号_如何让Linux时间与internet时间同步(CentOS)?

    在使用linux时(虚拟机),经常会发现使用一段时间后,linux时间和我的宿主机(真实机)的时间不一致,而宿主机的时间确实是internet时间,安装linux时选择的时区也是Asia/Shangh ...

  3. 计算机内存槽清理,正确清理内存条和内存槽的方法

    正确清理内存条和内存槽的方法 电脑出现蓝屏.无法开机等故障,最常见的原因就是内存,这时只要对内存条和内存槽进行清理,重新插上内存条就能解决问题,那么如何正确的清理内存条和内存槽呢? 正确清理内存条和内 ...

  4. 如何正确计算LINUX内存使用率

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

  5. linux查看usb硬件_使用USB记忆棒测试Linux硬件兼容性

    linux查看usb硬件 像其他所有人一样,我们中使用Linux的人有时需要购买新计算机. 尽管硬件兼容性差的日子早已过去,但仍然有可能遇到问题. 仅仅去本地商店,例如Rale​​igh的Intrex ...

  6. linux查看tcl版本_查看Linux内核版本的方法有几个?你也是这样操作吗?

    请关注本头条号,每天坚持更新原创干货技术文章.如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 内核是操作系统的核心组件. 它管理系统的资源,是计算机硬 ...

  7. linux内存管理_浅谈Linux内存管理

    1. 扫盲篇 1.1 操作系统存储层次 常见的计算机存储层次如下: 寄存器:CPU提供的,读写ns级别,容量字节级别. CPU缓存:CPU和CPU间的缓存,读写10ns级别,容量较大一些,百到千节. ...

  8. linux 查看jvm虚拟内存_看完你还敢说你懂JVM吗?

    在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m.从表面上,物理内存应该 ...

  9. linux java缓存失效_转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案...

    原文链接: https://blog.csdn.net/u014740338/article/details/66975550 问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存, ...

最新文章

  1. Mybatis集成二级缓存与同时使用缓存与事务存在的坑
  2. python 进度条_Python小程序系列——动态进度条(1)
  3. AT串口抽象层的设计思路及代码实现
  4. ios 带scrollView的控制器,双击“状态栏”,返回scrollView的顶部
  5. OpenCASCADE:Foundation Classes之集合、字符串、数量和单位转换
  6. 2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 分组(矩阵快速幂套NTT优化dp)
  7. linux 环境下配置python虚拟环境
  8. 常用的方法论-PARR
  9. 【转】DICOM图像像素值(灰度值)转换为CT值
  10. 循环小数与费马小定理
  11. 直接访问 可以拿到cookie 本地起的服务拿不到 cookie_微服务下的分布式session管理...
  12. JavaSE基础———StringBuffer StringBuilder Arrays和基本数据类型包装类
  13. 如何解读vmlinux.lds.S文件
  14. 本科毕业论文引用、编写英文参考文献格式的方法
  15. HTML超链接、锚链接
  16. TOJ2333 Feel Good
  17. 大数据时代下对马克思主义的一些探讨
  18. 深度学习环境搭建第一步----Ubuntu 安装(win7 + win10)
  19. 盘点业务流程的SAP操作调整
  20. maven PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable

热门文章

  1. why we need a undefined parameter in function signature
  2. SAP Cloud Connector里点击Check按钮的可达性roundtrip实现
  3. SAP CRM One Order scheduline buffer handling
  4. workaround for COM_ATTRFRG_GEN 066
  5. could not change product header data even after switching to change mode
  6. Multiple Origin composition test - Opportunity Creation case
  7. SAP CRM呼叫中心和社交媒体集成的所有BC set实现列表
  8. 参数 中_Python中函数的参数传递
  9. 中点和中值滤波的区别_桥式整流二极管及滤波电容如何选择
  10. python和sqlserver应用_Windows和Linux下使用Python访问SqlServer的方法介绍