Linux中的内存

概述

首先,我们可以查看内存。

[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.csdn.net/define_us/article/details/52317791

MMAP

https://www.cnblogs.com/zhaoyl/p/5515317.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值