#原创分享#Linux系统的内存使用率和可用内存
  

YxY 95591人觉得有帮助

{{ttag.title}}
本帖最后由 我想要豆豆 于 2021-1-31 18:49 编辑

背景
在超融合上安装了Redhat Linux系统,用户常常反馈,虚拟机的内存使用率高。用户会非常担心是否是系统内存不够用了,甚至部分用户会认为这是虚拟化带来的问题。今天和大家简单的聊一下Linux的内存管理。

Linux内存使用情况
Linux中我们可以通过free命令查看内存使用情况。


参数比较多,以下是各个参数的解释:
Mem行 是内存的使用情况:
  total :系统总的可用物理内存大小。
  used:已经被使用的物理内存。
  free:还有多少物理内存没用。
  shared:被共享使用(大部分是tmpfs使用的内存)的物理内存大小。
  buff/cache:被 buffer 和 cache 使用的物理内存大小。
  available :显示还可以被应用程序使用的物理内存大小。
Swap行是交换空间的使用情况:
  total:系统总的可用交换空间大小。
  used:已经被使用的交换空间。
  free:还有多少交换空间没用。

计算内存可用率的公式
通过前面的解释,我们可以得到total = used + free + buff/cache 这个计算公式。

对于当前系统来说,剩余可用的内存,并不是输出的free值,而是free加上Buff/cache(可回收)的部分内存。
在Linux7(kernels 3.14, emulated on kernels 2.6.27+)中available值用于表示此可用的内存。其中available = free + buffers/cache(可回收部分)

Linux 7真正占用的内存=used+ buffers/cache(正在使用部分)。
Linux 7真正占用的内存=total-available。

我们可以得出以下公式:
内存使用率=(total - free)/ total
内存可用率= available/ total


什么是buff/cache
buffer:
buffer 在操作系统中指 buffer cache, 中文一般翻译为 "缓冲区"。
要理解缓冲区,必须明确另外两个概念:"扇区" 和 "块"。扇区是设备的最小寻址单元,也叫 "硬扇区" 或 "设备块"。块是操作系统中文件系统的最小寻址单元,也叫 "文件块" 或 "I/O 块"。每个块包含一个或多个扇区,但大小不能超过一个页面,所以一个页可以容纳一个或多个内存中的块。
当一个块被调入内存时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示(下图来自互联网):

buffer cache 只有块的概念而没有文件的概念,它只是把磁盘上的块直接搬到内存中而不关心块中究竟存放的是什么格式的文件。

cache
cache 在操作系统中指 page cache,中文一般翻译为 "页高速缓存"。页高速缓存是内核实现的磁盘缓存。它主要用来减少对磁盘的 I/O 操作。
具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。页高速缓存缓存的是内存页面。
缓存中的页来自对普通文件、块设备文件(buffer cache )和内存映射文件的读写。

页高速缓存对普通文件的缓存我们可以这样理解:
当内核要读一个文件(比如 /etc/hosts)时,它会先检查这个文件的数据是不是已经在页高速缓存中了。如果在,就放弃访问磁盘,直接从内存中读取。这个行为称为缓存命中。如果数据不在缓存中,就是未命中缓存,此时内核就要调度块 I/O 操作从磁盘去读取数据。然后内核将读来的数据放入页高速缓存中。这种缓存的目标是文件系统可以识别的文件(比如 /etc/hosts)。
页高速缓存对块设备文件的缓存就是我们在前面介绍的 buffer cahce。因为独立的磁盘块通过缓冲区也被存入了页高速缓存(缓冲区最终是由页高速缓存来承载的)。

到这里我们应该搞清楚了,无论是缓冲区还是页高速缓存,它们的实现方式都是一样的。缓冲区只不过是一种概念上比较特殊的页高速缓存罢了。

free 与 available
free
是真正尚未被使用的物理内存数量。
available
available 是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。
所以从应用程序的角度来说,available  = free + buffer + cache。请注意,这只是一个很理想的计算方式,实际中cache并能全部释放,数据往往有较大的误差。

交换空间(swap space)

swap space 是磁盘上的一块区域,可以是一个分区,也可以是一个文件。所以具体的实现可以是 swap 分区也可以是 swap 文件。
当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问 swap 上存储的内容时,再将 swap 上的数据加载到内存中,这就是常说的换出和换入。交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。

清理caches
如果想手工回收buff/cache则可以通过命令清理,但在实际生产环境中不建议这么做,除非操作者确实明白这么做的副作用。
清理cache的命令:
echo 1 > /proc/sys/vm/drop_caches


总结
超融合部分版本所展示的内存使用率是((total - free)/ total),事实上如果存在内存泄露或判断内存是否够用可参考内存可用率(available/ total),对数据库或者应用添加的内存limit则需要从应用或观察系统负载情况的角度去判断内存是否足够。

打赏鼓励作者,期待更多好文!

打赏
5人已打赏

阿威十八式 发表于 2024-10-27 09:53
  
感谢分享,学习一下~
阿威十八式 发表于 2024-8-30 10:22
  
感谢分享,学习一下~
新手537797 发表于 2024-7-15 11:01
  
每天坚持打卡学习签到!!
屁屁我很忙 发表于 2024-7-6 10:05
  
感谢分享,学习一下~
向上吧,少年 发表于 2021-11-3 13:02
  
每日一学,坚持打卡。
向上吧,少年 发表于 2021-11-2 20:42
  
每日一学,坚持打卡。
一个无趣的人 发表于 2021-11-2 10:13
  
楼主的文章图文并茂,清晰易懂,看完这波操作可以轻松上手了,如遇到问题再向楼主请教~
新手780102 发表于 2021-9-24 22:17
  
过程很详细,值得学习
JM 发表于 2021-9-20 11:20
  
多谢楼主分享故障排查办法,学习了。
发表新帖
热门标签
全部标签>
西北区每日一问
技术盲盒
安全效果
技术笔记
【 社区to talk】
每日一问
干货满满
新版本体验
产品连连看
GIF动图学习
2023技术争霸赛专题
技术咨询
功能体验
通用技术
秒懂零信任
安装部署配置
原创分享
技术晨报
自助服务平台操作指引
每周精选
标准化排查
排障笔记本
玩转零信任
深信服技术支持平台
社区新周刊
POC测试案例
信服课堂视频
畅聊IT
答题自测
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
每日一记
运维工具
云计算知识
用户认证
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
产品预警公告
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
社区帮助指南
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
排障那些事
高手请过招
升级&主动服务
高频问题集锦
全能先锋系列
云化安全能力

本版达人

新手89785...

本周建议达人

YangZhe...

本周分享达人