free
[root@VM-165-116-centos bin]# free -h
total used free shared buff/cache available
Mem: 15Gi 5.8Gi 807Mi 289Mi 8.8Gi 9.1Gi
Swap: 0B 0B 0B
[root@VM-165-116-centos bin]#
- used 应用程序占用的private memory以及进程间共享内存,也就是说used包括shared。
used = total - free - buffers - cache = total - available
- free 未使用的闲置内存
- shared 进程间共享内存, which is the same as
grep Shmem /proc/meminfo
- buff/cache 内核使用的缓存(以内存为载体)
3个公式
total = used + available
used includes shared
available = free + buffer + cache
free col vs available col
free 是真正尚未被使用的物理内存数量
至于 available ,它是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是上面介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available = free + buffer + cache。但请注意,这只是一个理想的计算方式
buffer(buffer cache) VS cache(page cache)
buffer 缓冲。一般是write-buffer
cache 快取。一般是read-cache
虽然现在buffer和cache已经越来越混为一谈,但知道它们的本来意义能过让我们有更清晰的认识
-
Disk -> page cache -> mem
read from page cache
Page Cache本质上是memory
当进程调用read去发起读取文件请求的时候,最后都是从Page Cache中读。如果在Page Cache中没有match,系统会从磁盘中读取然后再加载到Page Cache中。当然,由局部性原理,当系统从磁盘中读取数据时,将会多读取一些页到Page Cache中(预读取)
write to page cache
当进程调用write写文件时,实际的直接写入对象是Page Cache。写Page Cache后将对应的页标记为dirty,就直接返回。Page Cache真正被写入到磁盘是由单独的线程触发:a. 空闲内存低于阈值 b. 脏页在内存中处理时间超过阈值 c. 主动调用sync -
Mem -> buffer cache -> disk
buffer cache
Buffers: Relatively temporary storage for raw disk blocks
磁盘的最小数据单位为sector,每次读写磁盘都是以sector为单位对磁盘进行操作。sector有的为512Byte, 有的为4K Bytes。无论用户是希望读取1个byte,还是10个byte,最终访问磁盘时,都以sector为单位读取,如果裸读磁盘,那意味着数据读取的效率会非常低。
同样,如果用户希望向磁盘某个位置写入(更新)1个byte的数据,他也必须整个刷新一个sector,言下之意,则是在写入这1个byte之前,我们需要先将该1byte所在的磁盘sector数据全部读出来,在内存中,修改对应的这1个byte数据,然后再将整个修改后的sector数据,一口气写入磁盘。
为了降低这类低效访问,尽可能的提升磁盘访问性能,内核在磁盘sector上构建一层缓存,他以sector的整数倍单位(block),缓存部分sector数据在内存中,当有数据读取请求时,他能够直接从内存中将对应数据读出。当有数据写入时,他可以直接再内存中直接更新指定部分的数据,然后再通过异步方式,把更新后的数据写回到对应磁盘的sector中。这层缓存则是块缓存Buffer Cache
The page cache behave exactly like [files], and caches pages of files to optimize file I/O.
The buffer cache behave exactly like a [disk], and caches disk blocks to optimize block I/O.
网友评论