`

(转)linux下的free命令小结

阅读更多
  linux下的free命令,一开始会让不少人觉得奇怪;比较好的文有
http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html

http://blog.yufeng.info/archives/2456
这两篇。简单转载下

下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(Free Output)。例如:

FO[2][1] = 24677460
FO[3][2] = 10321516 
                   1          2          3          4          5          6
1              total       used       free     shared    buffers     cached
2 Mem:      24677460   23276064    1401396          0     870540   12084008
3 -/+ buffers/cache:   10321516   14355944
4 Swap:     25151484     224188   24927296
  free的输出一共有四行,第四行为交换区的信息,分别是交换的总量(total),使用量(used)和有多少空闲的交换区(free),这个比较清楚,不说太多。

  free输出地第二行和第三行是比较让人迷惑的。这两行都是说明内存使用情况的。第一列是总量(total),第二列是使用量(used),第三列是可用量(free)。

  第一行的输出时从操作系统(OS)来看的。也就是说,从OS的角度来看,计算机上一共有:

24677460KB(缺省时free的单位为KB)物理内存,即FO[2][1];
在这些物理内存中有23276064KB(即FO[2][2])被使用了;
还用1401396KB(即FO[2][3])是可用的;
这里得到第一个等式:

FO[2][1] = FO[2][2] + FO[2][3]
FO[2][4]表示被几个进程共享的内存的,现在已经deprecated,其值总是0(当然在一些系统上也可能不是0,主要取决于free命令是怎么实现的)。

FO[2][5]表示被OS buffer住的内存。FO[2][6]表示被OS cache的内存。在有些时候buffer和cache这两个词经常混用。不过在一些比较低层的软件里是要区分这两个词的,看老外的洋文:

A buffer is something that has yet to be "written" to disk.
A cache is something that has been "read" from the disk and stored for later use.
也就是说buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由OS管理。

Linux和其他成熟的操作系统(例如windows),为了提高IO read的性能,总是要多cache一些数据,这也就是为什么FO[2][6](cached memory)比较大,而FO[2][3]比较小的原因。我们可以做一个简单的测试:

释放掉被系统cache占用的数据;
echo 3>/proc/sys/vm/drop_caches


读一个大文件,并记录时间;
关闭该文件;
重读这个大文件,并记录时间;
第二次读应该比第一次快很多。原来我做过一个BerkeleyDB的读操作,大概要读5G的文件,几千万条记录。在我的环境上,第二次读比第一次大概可以快9倍左右。

  free输出的第二行是从一个应用程序的角度看系统内存的使用情况。

对于FO[3][2],即-buffers/cache,表示一个应用程序认为系统被用掉多少内存;
对于FO[3][3],即+buffers/cache,表示一个应用程序认为系统还有多少内存;
因为被系统cache和buffer占用的内存可以被快速回收,所以通常FO[3][3]比FO[2][3]会大很多。

这里还用两个等式:

FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]
这二者都不难理解。

  free命令由procps.*.rpm提供(在Redhat系列的OS上)。free命令的所有输出值都是从/proc/meminfo中读出的。

在系统上可能有meminfo(2)这个函数,它就是为了解析/proc/meminfo的。procps这个包自己实现了meminfo()这个函数。可以下载一个procps的tar包看看具体实现,现在最新版式3.2.8。
    那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。

所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准.
如果是应用服务器的话,一般只看第二行,+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了。
分享到:
评论

相关推荐

    Suse_Linux常用命令小结

    Suse Linux 常用命令小结 作为一款流行的 Linux 发行版,Suse Linux 的命令行操作是每个 Linux 用户都需要掌握的基本技能。今天,我们将总结 Suse Linux 中一些常用的命令,帮助您更好地管理和维护您的 Linux 系统...

    linux中查看各硬件资源信息的命令小结.docx

    下面是对Linux中查看硬件资源信息的常用命令的详细解释: 1. **显卡信息**: 使用`dmesg | grep -i vga`或`lspci | grep -i vga`可以查看系统的显卡信息。`dmesg`会打印内核启动时的日志,而`lspci`用于列出系统中...

    linux常用命令书籍

    ### 小结 通过学习这些命令,我们可以更高效地管理和使用Linux系统。例如,`login` 命令帮助我们安全地登录系统,而 `shutdown` 命令则让我们能够正确地关闭或重启系统,避免数据丢失或硬件损坏的风险。此外,像 `...

    Linux命令搜索工具linux-command.zip

    Linux知识点小结 10大白帽黑客专用的 Linux 操作系统 软件工具 超赞的Linux软件 Github仓库Zh En 程序员喜欢的9款最佳的Linux文件比较工具 提高...

    Linux必学的60个命令

    ### 小结 学习并掌握这些基本的Linux命令对于任何人来说都是非常重要的。无论是系统管理员还是开发人员,了解这些命令可以帮助他们更高效地管理和操作Linux系统。通过不断实践和探索,你可以逐渐成为Linux领域的...

    linux命令大全硬件部分

    ### 小结 以上就是关于Linux系统中硬件部分常见命令的大全。这些命令可以帮助用户快速了解计算机的硬件配置情况,对于日常维护、故障排查以及性能优化等方面都非常有用。需要注意的是,在实际操作过程中,部分命令...

    Linux GDB命令详细文档

    #### 七、小结 GDB是一个强大而灵活的调试工具,不仅支持基础的调试功能,还提供了丰富的高级特性,如多线程调试、多进程调试等。通过熟练掌握GDB的各种命令和技巧,开发者能够高效地定位和修复程序中的各种问题,...

    Linux操作系统总结与心得.doc

    掌握Linux操作系统的常用命令是使用和管理Linux系统的基础。例如,`ls`用于列出目录内容,`touch`用于创建新文件或更新文件时间戳,`cp`和`mv`分别用于复制和移动文件或目录,而`rm`用于删除文件或目录。此外,`cat`...

    Linux检查Swap交换空间的五个命令小结

    1. **free命令**: `free` 命令用于查看系统内存和交换空间的使用情况。默认情况下,它以千字节(KB)为单位显示信息。添加 `-h` 开关可以让输出更易读,以人类可读的单位(如MB、GB)显示。 ```bash free free -...

    linux系列之常用运维命令整理笔录(小结)

    - **free** 命令:用于查看系统的内存使用情况,包括物理内存和交换内存。通过不同参数,如`-m`以MB为单位显示,`-s`持续观察,`-t`显示总和,可以帮助我们了解系统内存的使用状态。 - **ulimit** 命令:展示和...

    LINUX 24学时教程

    1.10 课时小结 13 1.11 专家答疑 13 1.12 练习题 13 第2学时 安装Linux操作系统 14 2.1 开始安装 14 2.2 完成Linux操作系统安装过程 20 2.2.1 登录到Linux操作系统 22 2.2.2 重新启动和关机 24 2.3 课时小结 25 2.4 ...

    我常用的一些linux命令小结

    本文将详细介绍一些常用且实用的Linux命令,帮助你提升在Linux环境中的操作效率。 1. `ps`:用于查看系统进程状态。`ps -aux` 可以查看所有进程,而`ps -T -p ${pid}` 可以查看特定进程的线程详情。了解进程的状态...

    Linux命令集

    #### 小结 本篇文章主要介绍了Linux中的一些基本命令及其使用方法,包括启动登录、注销、关机重启以及文件和目录的基本操作。对于初学者来说,掌握这些基础命令是非常重要的,它们能够帮助用户快速上手并有效地管理...

    linux课程的ppt

    3. **Linux目录结构**:Linux遵循FHS(Filesystem Hierarchy Standard),根目录“/”下包含标准目录,如/bin(基本命令)、/etc(配置文件)、/usr(用户程序)和/home(用户主目录)等。 4. **命令行基础**:...

    Linux编程精髓 部分笔记

    **1.2 小结** 这一节介绍了C语言中内存管理的基础知识,包括如何使用`malloc()`、`calloc()`、`realloc()`和`free()`来有效地管理程序运行时所需的内存资源。 #### 文件和文件I/O 这部分内容讲解了在Linux环境下...

    Linux之如何在系统使用过程中配置SWAP分区

    小结 在本篇文章中,我们学习了如何在系统使用过程中配置 SWAP 分区。首先,我们查看当前系统的分区状态及 SWAP 状态,然后选择一个合适的分区来作为 SWAP 分区。接着,我们使用 `mkswap` 命令将分区转换为 SWAP ...

    集群好书《高性能Linux服务器构建实战》 试读章节下载

    10.6.4 free命令 10.6.5 uptime命令 10.6.6 netstat命令 10.6.7 top命令 10.7 基于Web应用的性能分析及优化案例 10.7.1 基于动态内容为主的网站优化案例 10.7.2 基于动态、静态内容结合的网站优化案例 ...

Global site tag (gtag.js) - Google Analytics