在Linux系统中,咱们查看、监控系统内存使用状况,通常最经常使用的命令就是free。free命令其实很是简单,参数也很是简单,可是里面不少知识点未必你都掌握了。下面总结一下我所了解的free命令。若有不足,敬请指出。文章不少知识点参考了下面参考资料,都是在这些前辈文章的基础上所作的一个验证和总结。 html
free命令介绍 node
free命令是一个显示系统中空闲和已用内存大小的工具。大多数Linux发行版都包含有free命令,可是版本可能不同。free 命令使用/proc/meminfo中的值做为基准来显示内存利用率信息。free命令的英文介绍:free - displays the total amount of free and used physical and swap memory in the system, as well as the buffers used by the kernel. The shared memory column represents the ’Shmem’ value. The available memory column represents the ’MemAvailable’ value. linux
free参数介绍 缓存
你能够在控制台下输入man free命令查看更多关于free命令的信息。另外你能够使用下面命令获取free的使用信息(虽然是一个无效参数)服务器
[root@localhost ~]# free --help
free: invalid option -- '-'
usage: free [-b|-k|-m|-g] [-l] [-o] [-t] [-s delay] [-c count] [-V]
-b,-k,-m,-g show output in bytes, KB, MB, or GB
-l show detailed low and high memory statistics
-o use old format (no -/+buffers/cache line)
-t display total for RAM + swap
-s update every [delay] seconds
-c update [count] times
-a show available memory if exported by kernel (>80 characters per line)
-V display version information and exit
free命令的参数有下面一些,不一样版本可能有所区别(procps version 3.2.8):app
参数ide |
功能工具 |
-b -k -m -g性能 |
分别以Byte、KB、MB、GB为单位显示内存的使用状况测试 |
-l |
show detailed low and high memory statistics |
-o |
使用旧的格式显示内存的使用信息,没有描述 -/+buffers/cache信息这一行。 |
-t |
显示内存总和列 |
-s |
<间隔秒数> 持续观察内存使用情况。 |
-c |
结合参数-s使用,表示更新多少次。update [count] times |
-a |
show available memory if exported by kernel (>80 characters per line) |
-V |
显示free命令版本信息并退出该命令 |
例子:
1:以MB为单位显示内存的使用状况
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 11912 957 10955 1 167 498
-/+ buffers/cache: 291 11620
Swap: 12287 0 12287
[root@localhost ~]#
2:每隔3秒显示内存的使用信息
[root@localhost ~]# free -m -s 3
total used free shared buffers cached
Mem: 11912 957 10955 1 167 498
-/+ buffers/cache: 292 11620
Swap: 12287 0 12287
total used free shared buffers cached
Mem: 11912 957 10955 1 167 498
-/+ buffers/cache: 292 11620
Swap: 12287 0 12287
total used free shared buffers cached
Mem: 11912 957 10955 1 167 498
-/+ buffers/cache: 292 11620
Swap: 12287 0 12287
total used free shared buffers cached
Mem: 11912 957 10955 1 167 498
-/+ buffers/cache: 292 11620
Swap: 12287 0 12287
3:显示内存总和列
[root@localhost ~]# free -mt
total used free shared buffers cached
Mem: 11912 957 10955 1 167 498
-/+ buffers/cache: 292 11620
Swap: 12287 0 12287
Total: 24200 957 23243
[root@localhost ~]#
4:显示高低内存利用率
[root@localhost ~]# free -ml
total used free shared buffers cached
Mem: 11912 957 10955 1 167 498
Low: 11912 957 10955
High: 0 0 0
-/+ buffers/cache: 292 11620
Swap: 12287 0 12287
[root@localhost ~]#
5:每2秒显示一次内存使用状况,一共显示3次
[root@localhost ~]# free -s 2 -c 3
total used free shared buffers cached
Mem: 12198496 981976 11216520 1176 171260 510160
-/+ buffers/cache: 300556 11897940
Swap: 12582908 0 12582908
total used free shared buffers cached
Mem: 12198496 981976 11216520 1176 171260 510160
-/+ buffers/cache: 300556 11897940
Swap: 12582908 0 12582908
total used free shared buffers cached
Mem: 12198496 981976 11216520 1176 171260 510160
-/+ buffers/cache: 300556 11897940
Swap: 12582908 0 12582908
free指标介绍
free命令通常显示4行信息,使用参数-t则会显示5行信息(-l 参数会显示6行)。你是否真正理解每一项指标的意义呢?这个我以为可能很多人不甚了解。那么下面就来看看free命令输出信息的具体含义吧:
1:第一行从全局角度描述系统使用的内存情况:
指标 |
指标意义 |
total |
总的物理内存大小。total=used + free |
used |
已经使用的物理内存。通常状况这个值比较大。used=buffers + cached (maybe add shared also)+ -buffers/cache(used) |
free |
彻底未使用的物理内存 |
shared |
应用程序共享的物理内存 |
buffers |
缓存,主要用于块设备缓存,例如用户目录、inode值等(ls大目录能够看到这个值增长) |
cached |
缓存,主要用于缓存文件。 |
|
|
相信不少人和我同样,对buffers 和cached有点混淆不清。下面是对buffers和cached的一个较权威的解释。
buffers是指用来给块设备作的缓冲大小,它只记录文件系统的metadata以及 tracking in-flight pages.
cached是用来给文件作缓冲。
那就是说:buffers是用来存储目录里面有什么内容,权限等等。而cached直接用来缓存咱们打开的文件
下面是关于buffers和cached的英文资料:
Buffers are associated with a specific block device, and cover caching of filesystem metadata as well as tracking in-flight pages. The cache only contains parked file data. That is, the buffers remember what's in directories, what file permissions are, and keep track of what memory is being written from or read to for a particular block device. The cache only contains the contents of the files themselves.
也就是说buffers是用于存放要输出到disk的块设备数据的,而cache是存放从disk上读出的数据。这两者是为了提升IO性能的,并由OS管理。
下面咱们能够使用ls /dev命令来验证一下buffers增长的实验测试。以下所示。buffers从171140增长到了171144
关于cached,当应用程序读写文件的时候,Linux内核为了提升读写效率与速度,会将文件在内存中进行缓存,这部份内存就是Cache Memory(缓存内存)。即便你的程序运行结束后,Cache Memory也不会自动释放。这就会致使你在Linux系统中程序频繁读写文件后,你会发现可用物理内存变少。前阵子我就碰到这样一个案例,有位网友说他服务器上没有跑什么应用程序,可是内存都被耗尽了。其实真正的缘由只是内存被用来作buffer和cached缓存数据了,而他不了解状况,觉得free列就是剩余的内存,觉得内存被耗尽了。若是free部分很小,可是buffer和cached部分较大的话,彻底没有必要担忧,缓存内存(Cache Memory)在你须要使用内存的时候会自动释放。
Linux always tries to use RAM to speed up disk operations by using available memory for buffers (file system metadata) and cache (pages with actual contents of files or block devices). This helps the system to run faster because disk information is already in memory which saves I/O operations. If space is needed by programs or applications like Oracle, then Linux will free up the buffers and cache to yield memory for the applications. If your system runs for a while you will usually see a small number under the field "free" on the first line.
关于buffers与cached,Don't Panic! Your ram is fine! 这篇文章对这个有个很是有意思的描述。我简单翻译一下,你们对比英文看看吧
What's going on?
Linux is borrowing unused memory for disk caching. This makes it looks like you are low on memory, but you are not! Everything is fine!
Linux系统从空闲的内存借用内存来作磁盘数据缓存。这个致使你的系统看起来处于内存很是紧急的状况。可是实际上不是这样。一切都很是正常。
Why is it doing this?
Disk caching makes the system much faster! There are no downsides, except for confusing newbies. It does not take memory away from applications in any way, ever!
磁盘数据缓存让Linux运行得更快。它不会也永远不会从应用程序程序拿走内存。它没有任何缺点,只是会混淆新手。
What if I want to run more applications?
If your applications want more memory, they just take back a chunk that the disk cache borrowed. Disk cache can always be given back to applications immediately! You are not low on ram!
若是你的应用程序须要更多的内存,他们会收回一部分用做磁盘数据缓存(disk cache)的物理内存。磁盘数据缓存能很快的将内存返回给应用程序使用。
Do I need more swap?
No, disk caching only borrows the ram that applications don't currently want. It will not use swap. If applications want more memory, they just take it back from the disk cache. They will not start swapping.
不, 磁盘数据缓存只会从应用程序哪里借用不须要使用的物理内存。它不会使用交换分区。若是应用程序须要跟多内存。他们会从磁盘数据缓存里面拿回须要的物理内存。它们将不启动交换。
How do I stop Linux from doing this?
You can't disable disk caching. The only reason anyone ever wants to disable disk caching is because they think it takes memory away from their applications, which it doesn't! Disk cache makes applications load faster and run smoother, but it NEVER EVER takes memory away from them! Therefore, there's absolutely no reason to disable it!
Disk caching是不能禁用的。可是能够使用下面命令释放memory cached:
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
2: 第二行则是第一行各个指标的值:
3: 第三行描述应用程序的内存使用状况:
指标 |
指标意义 |
前个值表示-buffers/cache |
应用程序使用的内存大小,used减去缓存值:-buffers/cache=used-buffers-cached |
后个值表示+buffers/cache |
全部可供应用程序使用的内存大小,free加上缓存值:+buffers/cache=free+buffers+cached |
4: 第四行描述swap使用状况:
指标 |
指标意义 |
total |
所有交换分区(swap) |
used |
已使用交换分区(swap) |
free |
未使用交换分区(swap) |
以下图所示,咱们来验证一下各指标的关系,看看各指标是否如上述公式所将的那样:
total = used + free
12198496 = 982224 + 11216272
used = buffers + cached (maybe add shared also) + -buffers/cache(used):
982224 =171412 + 510180 + 300632
-buffers/cache(used) 表示第三行的used列的值。-buffers/cache(free) 表示第三行free列的值。
-buffers/cache(used) = used - buffers - cached
-buffers/cache(free) = free+buffers+cached
11897864 = 11216272 + 171412 + 510180
参考资料:
https://linux.cn/article-2443-1.html
http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316438.html