概述
首先,我们可以查看内存。
[jboss5@i5315234391-9 ~]$ free -mh
total used free shared buff/cache available
Mem: 7.6G 156M 6.2G 368M 1.3G 6.9G
Swap: 4.0G 0B 4.0G
这种显示中
total1 = used + free + buff/cache
另一种显示风格是
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 7869 7651 218 1 191 5081
-/+ buffers/cache: 2378 5490
Swap: 478 139 339
上述显示满足如下等式
total1 = used1 + free1
total1 = used2 + free2
used1 = buffers1 + cached1 + used2
free2 = buffers1 + cached1 + free1
其实swap不是真实的内存,而是硬盘上充当内存的交换分区。这里,我们的服务器内存占用率很低,所以4个G的交换区没有使用。内存一共是7.6G,实际使用只有156M。1.3G充当了磁盘内容的缓存。shared的内存我们将在下面介绍。buff/cache是指被充当磁盘缓存的内存。
上面的内存其实是非常充足的。下面是一个典型的内存不足的服务器
total used free shared buff/cache available
Mem: 31G 29G 356M 99M 1.2G 879M
Swap: 4.0G 4.0G 0B
Cache和Buffe
在 Linux 的内存管理中,这里的buffer 指 Linux 内存的:Buffer cache。
这里的 cache 指 Linux 内存中的:Page cache。翻译成中文可以叫做缓冲区缓存和页面缓存。
Buffer cache 主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用 buffer cache 进行缓存,比如我们在格式化文件系统的时候。一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache 的内容会被改变,而 buffer cache 则可以用来将 page 标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写writeback时,就不用将整个 page 写回,而只需要写回修改的部分即可。
page cache主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有 read/write 操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用:mmap 是不是很自然的也应该用到 page cache?在当前的系统实现里, page cache 也被作为其它文件类型的缓存设备来用,所以事实上 page cache 也负责了大部分的块设备文件的缓存工作。
Linux 内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,这个操作中主要的内存释放都来自于对 buffer/cache 的释放。尤其是被使用更多的 cache 空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放 cache,作为 free 空间分给相关进程使用。所以一般情况下,我们认为 buffer/cache 空间可以被释放,这个理解是正确的。
但是这种清缓存的工作也并不是没有成本。理解 cache 是干什么的就可以明白清缓存必须保证 cache 中的数据跟对应文件中的数据一致,才能对 cache 进行释放。所以伴随着 cache 清除的行为的,一般都是系统 IO 飙高。
进程的内存模型
上述的共享内存归内核直接管理。
交换区
交换分区(swap space)是一定磁盘空间(分区或文件),用于将部分内存中的数据换下来,以腾出内存空间用于其他需求。在一个系统中,物理内存的容量是有限的,当物理内存快使用完时,操作系统会使用交换分区(如果有的话)。当系统内存使用紧张时,操作系统根据一定的算法规则,将一部分最近没使用的内存页面保存到交换分区,从而为需要内存的程序留出足够的内存空间;在SWAP中的内存页面被访问到时,系统会将其重新载入到物理内存中去运行。
swap in (换入):是指页面从交换分区转移到内存之中;
swap out (换出):是指页面从从内存转移到交换分区中。
(这里的in/out是站在内存的角度来说的,就好理解了。)
在Windows、Unix、Linux系统中都有交换分区的概念。
//查看交换区状态
cat /proc/swaps
swapon
//输出如下
Filename Type Size Used Priority
/dev/dm-1 partition 4194300 0 -1
可以看到,上述系统拥有一个4G大小的交换区。
在Linux系统,我们可以参照Redhat公司为RHEL5、RHEL6推荐的SWAP空间的大小划分原则,在你没有其他特别需求时,可以作为很好的参考依据。
4GB of RAM requires a minimum of 2GB of swap space
4GB to 16GB RAM requires a minimum of 4GB of swap space
16GB to 64GB of RAM requires a minimum of 8GB of swap space
64GB to 256GB of RAM requires a minimum of 16GB of swap space
内存作为文件系统
内存也可以改造为文件系统。
请参见
https://blog.youkuaiyun.com/define_us/article/details/52317791
MMAP
https://www.cnblogs.com/zhaoyl/p/5515317.html