0%

Linux 内存

内存是评判服务器的一个非常重要的指标。内存的多少,可能会直接影响着服务器的整体性能。


前言

内存是评判服务器的一个非常重要的指标。内存的多少,可能会直接影响着服务器的整体性能。阅读Linux性能监测:内存篇

物理内存和虚拟内存

说到内存,我们都会说到物理内存和虚拟内存的

物理内存就是真实的硬件设备,也就是咱们的内存条

虚拟内存(Virtual Memory)是把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为虚拟内存为计算机提供了一个连贯的虚拟内存空间

好处是我们拥有的内存“变多了”,可以运行更多、更大的程序,坏处是把部分硬盘当内存用整体性能受到影响,硬盘读写速度要比内存慢几个数量级,并且RAM和SWAP之间的交换增加了系统的负担

需要记住的一点是Linux会在物理内存不足时,使用交换分区的虚拟内存

关于虚拟内存更多跳转内存参数

关于物理内存和虚拟内存的释放参阅Linux 释放物理内存和虚拟内存

物理内存释放有坑。。。。 Linux 清除内存中的cache 内核2.6的版本执行上述的操作都没问题的,但是到了内核3系列,就不能执行echo 0 >/proc/sys/vm/drop_caches的操作了,这是一个坑,重启才能改回去

实操

请跳转阅读centos6 free 和 centos 7的free 的差异与对比

free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer

free命令习惯上有以下几种形式

1
2
3
4
free -k # 以KB为单位显示内存使用情况
free -m # 以MB为单位显示内存使用情况
free -g # 以GB为单位显示内存使用情况
free -h # 以人类友好的方式显示内存使用情况

输入free -m时,系统就会输出以下内容

1
2
3
4
5
[root@massive-dataset-new-002 ~]# free -g
total used free shared buffers cached
Mem: 61 19 41 0 0 10
-/+ buffers/cache: 8 52
Swap: 4 0 4

输出解释
total: 内存总数,物理内存总数
used: 已经使用的内存数
free: 空闲的内存数
shared: 多个进程共享的内存总额
buffers: 缓冲内存数
cached: 缓存内存数
- buffers/cached: 应用使用内存数
+ buffers/cached: 应用可用内存数
Swap: 交换分区,虚拟内存

通过free命令查看机器空闲内存时,会发现free的值很小。
这主要是因为,在Linux系统中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。
但实际上这些内存也是可以立刻拿来使用

在使用free命令时,都是需要重点关注 - buffers/cached和 + buffers/cached

- buffers/cached,即used - buffers/cached,表示应用程序实际使用的内存
+ buffers/cached,即free + buffers/cached,表示理论上都可以被使用的内存

可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。

cache、buffer

buffer和cache是两个在计算机技术中被用滥的名词,放在不通语境下会有不同的意义

在Linux的内存管理中,这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page cache。翻译成中文可以叫做缓冲区缓存和页面缓存

cached

当程序启动的时候,Linux内核首先检查CPU的缓存和物理内存,如果数据已经在内存里就忽略,如果数据不在内存里就引起一个缺页中断(Page Fault),然后从硬盘读取缺页,并把缺页缓存到物理内存里。

缺页中断可分为主缺页中断(Major Page Fault)和次缺页中断(Minor Page Fault),要从磁盘读取数据而产生的中断是主缺页中断;数据已经被读入内存并被缓存起来,但是没有向MMU注册的情况,操作系统只需要在MMU中注册相关页对应的物理地址即可,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断是次缺页中断。

内存缓存区起到了预读硬盘的作用,内核先在物理内存里寻找缺页,没有的话产生次缺页中断从内存缓存里找,如果还没有发现的话就从硬盘读取。

这里说的内存缓存区即为cached,主要用于提升读取相关页面的效率,内核会将经常访问的页面放到cached中,这样就提高了页面的命中率,cached越大,命中率就越高,就减少了I/O读请求

如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小

所以cached是用来给文件做缓冲。cached直接用来记忆我们打开的文件

buffers

Buffer cache则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用

buffers 主要用于I/O写,将应用程序的多次零碎写事件,集中到一个缓冲区(即buffers),然后再一次性写入磁盘中,这样就提高了写磁盘的效率

来自马哥Linux运维对Buffer和Cache解读

Cache(缓存)位于CPU与内存之间的临时存储器,缓存容量比内存小的多但交换速度比内存要快得多。Cache通过缓存文件数据块,解决CPU运算速度与内存读写速度不匹配的矛盾,提高CPU和内存之间的数据交换速度。Cache缓存越大,CPU处理速度越快。

Buffer(缓冲)高速缓冲存储器,通过缓存磁盘(I/O设备)数据块,加快对磁盘上数据的访问,减少I/O,提高内存和硬盘(或其他I/O设备)之间的数据交换速度。Buffer是即将要被写入磁盘的,而Cache是被从磁盘中读出来的。