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

YxY 61051人觉得有帮助

{{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人已打赏

Sangfor_闪电回_朱丽 发表于 2020-9-1 14:59
  
您好,您的文章已被收录到计划中,交由专家评审小组评审,奖励将在下周安排发放!发文越多,奖励越多,期待您更多的精彩文章哦!:感恩:
点击查看本季原创内容要求及奖励规则:http://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=117259
林明纲_福州办 发表于 2020-9-5 11:31
  
楼主分享的很完整了,对学习理解linux内存很有帮助
暖暖的毛毛 发表于 2020-9-7 08:36
  
感谢分享
新手078326 发表于 2020-11-21 12:09
  

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

本版达人

新手89785...

本周建议达人

YangZhe...

本周分享达人