# **free** ## 说明 **free命令** 可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区 ## 选项 ```markdown -b, --bytes Bytes为单位显示内存使用 -k, --kilo KB为单位显示内存使用(默认) -m, --mega MB为单位显示内存使用 -g, --giga GB为单位显示内存使用 --tera 以TB为单位显示内存量 --peta 以PB为单位显示内存量 -h, --human 显示自动缩放到最短三位数单位的所有输出字段,并显示打印输出的单位。 使用以下单位 B = bytes K = kilos M = megas G = gigas T = teras P = petas -w, --wide 切换到宽屏模式。 宽模式生成超过80个字符的行。 在此模式下,缓冲区和缓存将在两个单独的列中报告 -c, --count count 显示结果计数次数。 需要-s选项 -l, --lohi 显示详细的高低内存统计信息 -s, --seconds seconds 间隔几秒显示结果,实际上可以指定任意浮点数 --si Use power of 1000 not 1024 -t, --total 在一行以总和的形式显示内存的使用信息 ``` ## 实例 ```bash free -t # 以总和的形式显示内存的使用信息 free -s 10 # 周期性的查询内存使用信息,每10s 执行一次命令 ``` ## free输出解释: ```markdown total 安装的总内存 (MemTotal and SwapTotal in /proc/meminfo) used 已用内存 (calculated as total - free - buffers - cache) free 空闲内存 (MemFree and SwapFree in /proc/meminfo) shared (大部分)被tmpfs使用的内存 (Shmem in /proc/meminfo, available on kernels 2.6.32, displayed as zero if not available) buffers 被kernel buffers使用的内存 (Buffers in /proc/meminfo) cache 被the page cache and slabs使用的内存 (Cached and Slab in /proc/meminfo) buff/cache buffers和cache的总和 available 估计可用于启动新应用程序的内存量,而无需交换。 与缓存或空闲字段提供的数据不同,此字段考虑了页面缓存,并且由于 正在使用的项目,并非所有可回收的内存块都将被回收(MemAvailable在/proc/meminfo中,在内核3.14上可用,模拟在内核2.6.27+,否则与免费相同) 关系:total = used + free 交换将通过三个途径来减少系统中使用的物理页面的个数:  1. 减少缓冲与页面cache的大小 2. 将系统V类型的内存页面交换出去 3. 换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足) 事实上,少量地使用swap是不是影响到系统性能的。buffers和cached都是缓存,两者有什么区别呢? 为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式: Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents) 的时间磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的 Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系 由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,因为Buffer Cache就是缓存磁盘块的。但是这种处理 在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作 Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如, 文件系统的元数据都会缓存到buffer cache中 简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache, 如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache ```