性能常识 关于内存利用率高的讲解

会飞的猪 · 2018年12月12日 · 最后由 槽神 回复于 2018年12月12日 · 1800 次阅读


多数的 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

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 2 条回复 时间 点赞

内容很好,楼主不妨改一下 markdown 格式?

cache:缓存低速 IO 设备上的内容,供频繁读,用于提高 IO 效率
buffer:缓存程序所需交换的数据,供合并写入,用于减少内存和 CPU 操作次数,某些情况下也是为了提高 IO 效率

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册