2011年3月12日星期六

free 命令

free [-b | -k | -m] [-o] [-s 间隔秒数 ] [-t] [-V]
free, Linux 内存查看命令, 它不仅会显示内存的使用情况, 还包括实际物理内存, 虚拟的交换文件内存, 共享内存区段, 以及系统核心使用的缓冲区等.

  • -b 以 Byte 为单位显示内存使用情况

  • -k 以 KB 为单位显示内存使用情况

  • -m 以 MB 为单位显示内存使用情况

  • -o 不显示缓冲区调节剂

  • -s 间隔秒数持续观察内存使用状况

  • -t 显示内存总和列

  • -V 显示版本信息



[bash]
[root@localhost ~]# free
[/bash]

[bash title="free"]
total used free shared buffers cached
Mem: 1035292 965476 69816 0 165876 415680
-/+ buffers/cache: 383920 651372
Swap: 2096472 284 2096188
[/bash]

各值释意如下:





































  total used free shared buffers cached
Mem 物理内存 1035292 物理内存总量 965476 总计分配给缓存(buffer, chahe)使用的数量,但其中可能部分缓存并未实际使用 69816 未被分配的内存 0 共享内存 165876 系统分配但未被使用的 buffer 数量 415680 系统分配但未被使用的 cache 数量
-/+ buffers/cached 物理内存的缓存统计   383920 实际使用的 buffer 和 cache 数量, 即实际使用的内存总量 651372 未被使用的 buffer, cache和未被分配的内存之和, 即当前系统实际可用内存      
Swap 硬盘上交换分区的使用情况 2096472 284 2096188      


从上可得如下等式:

  • Mem|total = Mem|used + Mem|free

  • Mem|total = -/+ buffers/cached|used + -/+ buffers/cached|free

  • Mem|used = Mem|buffers + Mem|cached + -/+ buffers/cached|used

  • -/+ buffers/cached|free = Mem|free + Mem|buffers + Mem|cached




Mem 的 used/free与 -/+ buffers/cache used/free

  • Mem 行是从 OS 的角度来看, 因为对于 OS, buffers/cached 都是属于被使用, 所以他的可用内存是 69816KB, 已用内存是 965476KB, 包括OS 系统内核使用 + Application(X, Nginx etc)使用 + buffers + cached, 即 Mem|used = Mem|buffers + Mem|cached + -/+ buffers/cached|used

  • -/+ buffers/cache 行是从应用程序角度来看, 对于应用程序来说, buffers, cached 是等于可用, 因为 buffers/cached 是为了提高文件读取的性能, 当应用程序需在用到内存的时候, buffers/cached 会很快地被回收. 所以从应用程序的角度来说, -/+ buffers/cached|free = Mem|free + Mem|buffers + Mem|cached





buffer 与 cache 的区别

  • cache, 高速缓存, 位于 CPU 与 主内存间的一种容量较小但速度很高的存储器. 由于 CPU 的速度高于主内存, CPU 直接从内存中存取数据要等待一定时间周期, Cache 中保存着 CPU 干用过后循环使用的一部分数据, 当 CPU 再次使用该部分数据时可从 Cache 中直接调用, 这样可减少 CPU 的等待时间, 提高系统的效率. Cache 分为一级 Cache(L1 Cache)和二级 Cache(L2 Cache), L1 Cache集中在 CPU 内部, L2 Cache 早期一般焊在主板上, 现在也集中在 CPU 内部.

  • buffer, 缓冲区, 一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域. 通过缓冲区, 可使进程之间的相互等待变少, 从而使速度慢的设备读入数据时, 速度快的设备的操作进程不发生间断.

  • Free 中的 buffer and cache(它们都是占用内存), buffers, 做为 buffer cache 的内存, 是块设备的读写缓冲区;cached, 做为 page cache 的内存, 是文件系统的 cache.

  • 如果 cache 值很大, 说明 cache 住的文件和数据很多. 频繁访问到的文件都能被 cache 住, 如此, 磁盘的读 IO 必会非常小.这样也就提高了系统性能, 当需要这些内存时, 系统也会自动释放(Windows 除外)




在 Linux 的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(Mem|free >0),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。
因此查看目前进程正在实际被使用的内存,是Mem|used = Mem|buffers + Mem|cached + -/+ buffers/cached|used,也可认为如果 Swap 没有大量使用,Mem 还是够用,只有 Mem 被当前进程实际占用完(Mem|buffers=0 and Mem|cached=0), 才使用到 Swap.


另外, 为了提高磁盘存取效率, Linux 还做了一些精心的设计, 除了对 dentry 进行缓存(用于 VFS, 加速文件路径名到 inode 的转换), 还采取了两种主要 Cache 方式:Buffer Cache 和 Page Cache, 前者针对磁盘块的读写, 后者针对文件 inode 的读写. 这些 Cache 有效缩短了 I/O 系统调用(read, write, getdents etc)的时间.

如果感兴趣可以进一步参考文件 /proc/meminfo, free命令就是根据它的信息生成的. free命令的源码可从procps-xxx-.src.rpm获取, xxx为版本号, 比如procps-3.2.3-5.3.src.rpm.

内核参考代码
arch/i386/mm/init.c
fs/proc/proc_misc.c
include/linux/swap.h
mm/filemap.c
fs/buffer.c

另外还可参考O'REILLY的书《Understanding the LINUX KERNEL》.

没有评论:

发表评论