centos7 free 命令

可用参数

free 的显示信息来自于/proc/meminfo,常用的参数包括:

  • -b, --bytes 指定单位为bytes
  • -k, --kilo 指定单位为KB
  • -m, --mega 指定单位为MB
  • -g, --giga 指定单位为GB
  • --tera 指定单位为TB
  • --peta 指定单位为PB
  • -h, --human 以人性化显示
  • –si 指定计算倍数为1000 不是 1024
  • -l, --lohi 显示最低和最高的内存数据统计
  • -t, --total 显示物理内存和虚拟内存的总和
  • -s N, --seconds N 每隔n秒显示一次
  • -c N, --count N 重复打印N次,然后退出
  • -w, --wide 将buff和cacher 分开显示,默认是在一起显示的。
  • –help 显示帮助然后退出
  • -V, --version 显示free的版本信息并退出

centos7 free 命令示例

[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        159M        1.7G        9.5M        107M        1.6G
Swap:            0B          0B          0B
[root@localhost ~]# free -wh
              total        used        free      shared     buffers       cache   available
Mem:           1.9G        160M        1.7G        9.5M        2.1M        105M        1.6G
Swap:            0B          0B          0B

各项信息代表含义:

  • total 代表的总的内存 (对应/proc/meminfo 里的MemTotalSwapTotal)
  • used 代表的是已经使用的内存(计算公式:total - free - buffers - cache)
  • free 是代表空闲的内存(对应/proc/meminfo 里的MemFreeSwapFree)
  • shared 代表的是共享的内存(对应/proc/meminfo 里的Shmem)
  • buff 代表的是内核缓冲区使用的内存(对应/proc/meminfo里的Buffers)
  • cache 代表的是页面缓存和slab使用的内存(对应/proc/meminfo 里的·Cached and SReclaimable)
  • available 代表的是活跃的内存,一个新的应用程序可以使用内存的估计值,它不等于 free + buff/cache。它会考虑 Page Cache 和无法回收的 Slab 的内存,最后估算出一个”当前可用内存”。

man free对available的解释:Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free

buff/cache = buffers + cache, /proc/meminfo 中用 SReclaimable 和 SUnreclaim 这两个指标标明了可回收的 Slab 大小与不可回收的 Slab 大小。
所以用available来计算内存使用率还是比较通用的,计算方式如下:

( MemTotal - MemAvailable) / MemTotal

buffers与cache:

  • buffers 指的是 Memory used by kernel buffers(磁盘等块设备的缓冲) ,buffers 的字面意思就是缓冲,缓冲存在的目的是为了解决从速度快的地方往速度慢的地方输出东西,缓冲经常用于像 内存写入数据到磁盘,寄存器数据写到内存等等。位于内存buffer中的数据不是即时写入磁盘,而是系统空闲或者buffer达到一定大小统一写到磁盘中,所以断电易失,为了防止数据丢失所以我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据立刻写到磁盘里。
  • cache 指的是 Memory used by the page cache and slabs(文件系统层级的缓存),cache 的字面意思是缓存,缓存存在的目的是为了解决从速度慢的地方获取数据,比如我们读取硬盘里面的文件,硬盘的传输速度是比内存慢很多的,当我们读取完一个文件后,然后重新打开这个文件,如果有缓存,也就是将上次读取文件后将文件缓存在内存里面,我们会发现,我们打开文件会比第一次打开快很多。

针对于两者直接的关系,下图可以很清晰的说明
free_page_buffer

如何清除 buffers 和caches

因为caches是缓存的一些数据,当我们实际的数据内容已经更新了的话,那么当我们需要获取最新的数据时候,我们就需要清除caches里面的内容。
或者当我们的内存的不足(将被耗尽)时,那么系统会自动清除buffers 和caches ,以满足程序对内存的需求。
注意: 在清除buffers 前,为了防止数据丢失所以我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据立刻写到磁盘里。设置此参数可能导致系统性能下降,主要是由于他丢弃了一部分缓存对象,导致频繁的与磁盘交互进行对象的重建,不建议在测试环境以外使用。

方法:

echo N > /proc/sys/vm/drop_caches

N的值可以是0-3之间的数字,代表不同的含义:

  • 0:不释放(系统默认值)
  • 1:只清理 pagecache
  • 2:清理可回收对象(包括 dentries 和 inodes)
  • 3:同时清理 pagecache 和 可回收对象

原文:https://www.kernel.org/doc/Documentation/sysctl/vm.txt

drop_caches

Writing to this will cause the kernel to drop clean caches, as well as
reclaimable slab objects like dentries and inodes. Once dropped, their
memory becomes free.

To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes):
echo 2 > /proc/sys/vm/drop_caches
To free slab objects and pagecache:
echo 3 > /proc/sys/vm/drop_caches

This is a non-destructive operation and will not free any dirty objects.
To increase the number of objects freed by this operation, the user may run
`sync’ prior to writing to /proc/sys/vm/drop_caches. This will minimize the
number of dirty objects on the system and create more candidates to be
dropped.

This file is not a means to control the growth of the various kernel caches
(inodes, dentries, pagecache, etc…) These objects are automatically
reclaimed by the kernel when memory is needed elsewhere on the system.

Use of this file can cause performance problems. Since it discards cached
objects, it may cost a significant amount of I/O and CPU to recreate the
dropped objects, especially if they were under heavy use. Because of this,
use outside of a testing or debugging environment is not recommended.

You may see informational messages in your kernel log when this file is
used:

cat (1234): drop_caches: 3

These are informational only. They do not mean that anything is wrong
with your system. To disable them, echo 4 (bit 2) into drop_caches.