正确计算linux系统内存使用率

参考:https://blog.gesha.net/archives/406/

图中的例子很典型,就是:多数的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的大小。

时间: 2024-10-21 18:44:02

正确计算linux系统内存使用率的相关文章

如何正确查看Linux机器内存使用情况

如何正确查看Linux机器内存使用情况 背景 ??只要工作上涉及到Linux机器,基本上都会有这样一个需求,查看内存使用情况,但是怎么看才正确呢?之前使用的是top命令,一直存在一个误区. 为什么top命令看内存会有误区? ??top是个很好用的系统分析工具,可以实时查看进程,cpu使用率,内存使用率等情况,有点像windows下的任务管理器.我以前一直以为top看到的就是真正的内存使用情况,后来baidugoogle好久,才发现自己图样.= =|| 首先看下top命令后展示出来的内存使用情况,

Java获取Linux系统cpu使用率

原文:http://www.open-open.com/code/view/1426152165201 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Li

Linux系统内存占用90%以上 ?

问题: [[email protected] zx_epp_db]# free -m total used free shared buffers cached Mem: 15953 14706 1246 0 39 12687 -/+ buffers/cache: 1979 13973 Swap: 8015 27 7988 ---------------------------------------------------------------------------------------

Linux 系统内存分析

1. 内存基本介绍 1.计算机基本结构: 电脑之父--冯·诺伊曼提出了计算机的五大部件:输入设备.输出设备.存储器.运算器和控制器 如图: 输入设备:键盘鼠标等 CPU:是计算机的运算核心和控制核心,让电脑的各个部件顺利工作,起到协调和控制作用. 存储器:一系列的存储设备,硬盘,内存等 输出设备:如打印机,扬声器等 2.存储器: 我们看一下系统中存储器的层次结构: 图中L0-L5分别表示系统中所有存储器的层次结构,其中包括高速缓存,主存,磁盘等. 越上层的存储器造价越高,速度也越快,也更加靠近c

从Linux系统内存逐步认识Android应用内存

总述 Android应用程序被限制了内存使用上限,一般为16M或24M(具体看系统设置),当应用的使用内存超过这个上限时,就会被系统认为内存泄漏,被kill掉.所以在Android开发时,管理好内存的分配及使用十分重要,而首先要做的应是认识内存. 这篇文章便是从Linux的系统内存划分开始,逐步介绍至Android应用的内存划分. 一 硬件上看内存划分   从硬件上看,内存分为两个部分:物理内存和SWAP区. SWAP区就是Linux下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(

Android内存解析(一)—从Linux系统内存逐步认识Android应用内存

总述 Android应用程序被限制了内存使用上限,一般为16M或24M(具体看系统设置),当应用的使用内存超过这个上限时,就会被系统认为内存泄漏,被kill掉.所以在android开发时,管理好内存的分配及使用十分重要,而首先要做的应是认识内存. 这篇文章便是从Linux的系统内存划分开始,逐步介绍至Android应用的内存划分. 一 硬件上看内存划分 从硬件上看,内存分为两个部分:物理内存和SWAP区. SWAP区就是Linux下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就

怎样正确查看Linux的内存占用情况

昨天下午客户那边反馈,说服务器里面32G的内存通过TOP查看,已经用了31G多的,让我处理解决.我当时过程过去一看,刚开始也认为是内存快满了,晚上回去做了个24小时的稳定性测试,探讨了Linux的Mem使用情况: 查看内存最方便的命令是free -m,如:[[email protected] ~]# free -m           total  used  free shared buffers cached       Mem: 1024  1005  19   0    9    782

正确学习Linux系统的5个建议

最近几年Linux系统应用越来越广泛,以至于很多人开始热衷学习Linux.但是我们都是从小都是学习windows系统长大的,从windows 98到现在的windows 10,而根据学习windows系统的经验来学习Linux,使很多人越学越茫然,收效甚微,而不知怎么样才能有效的学习好Linux.下面本人根据自己的经验来给大家说说,怎么样有效的学习Linux系统. 我们学习Linux系统的目标是什么? Linux被当作是一个类Unix的系统,我们学习Linux的相关知识,就可以更好的学习Unix

linux系统内存转换成硬盘使用

解决问题点: 1:站点数据提速,数据放入内存空间,速度指数级提升: 2:数据库缓存: 3:临时数据处理: 4:等等... #查看系统内存 [[email protected] ~]# free -m total        used        free      shared  buff/cache   available Mem:          64257         861       62730          41         665       63103 Swap