www.hj8828.com 6

www.hj8828.com6 个例子让初学者掌握 free 命令 | Linux 中国,freelinux

6 个例子让初学者掌握 free 命令 | Linux 中国,freelinux

在 Linux
系统上,有时你可能想从命令行快速地了解系统的已使用和未使用的内存空间。如果你是一个
Linux 新手,有个好消息:有一条系统内置的命令可以显示这些信息:free。–
Himanshu Arora
本文导航◈ Linux free 命令07%◈ Q1. 怎么用 free
命令查看已使用和未使用的内存?14%◈ Q2.
如何更改显示的单位呢?44%◈ Q3.
怎么显示可读的结果呢?53%◈ Q4. 怎么让 free
命令以一定的时间间隔持续运行?61%◈ Q5. 怎么使
free 基于 1000 计算内存,而不是 1024?73%◈ Q6.
如何使 free 命令显示每一列的总和?81%◈ 总结89%编译自 |  
 作者 | Himanshu Arora
 译者 | jessie-pang

在 Linux
系统上,有时你可能想从命令行快速地了解系统的已使用和未使用的内存空间。如果你是一个
Linux 新手,有个好消息:有一条系统内置的命令可以显示这些信息:free

在本文中,我们会讲到 free
命令的基本用法以及它所提供的一些重要的功能。文中提到的所有命令和用法都是在
Ubuntu 16.04LTS 上测试过的。

Linux free 命令

让我们看一下 free 命令的语法:

  1. free [options]

free 命令的 man 手册如是说:

free 命令显示了系统的可用和已用的物理内存及交换内存的总量,以及内核用到的缓存空间。这些信息是从 /proc/meminfo 中得到的。

接下来我们用问答的方式了解一下 free 命令是怎么工作的。

Q1. 怎么用 free 命令查看已使用和未使用的内存?

这很容易,您只需不加任何参数地运行 free 这条命令就可以了:

  1. free

这是 free 命令在我的系统上的输出:

view used and available memory using free command

这些列是什么意思呢?

◈ total –
安装的内存的总量(等同于 /proc/meminfo 中的 MemTotal 和 SwapTotal)◈ used –
已使用的内存(计算公式为:used = total – free – buffers – cache)◈ free –
未被使用的内存(等同于 /proc/meminfo 中的 MemFree 和 SwapFree)◈ shared –
通常是临时文件系统使用的内存(等同于 /proc/meminfo 中的 Shmem;自内核
2.6.32 版本可用,不可用则显示为 0)◈ buffers –
内核缓冲区使用的内存(等同于 /proc/meminfo 中的 Buffers)◈ cache –
页面缓存和 Slab
分配机制使用的内存(等同于 /proc/meminfo 中的 Cached 和 Slab)◈ buff/cache – buffers 与 cache 之和◈ available –
在不计算交换空间的情况下,预计可以被新启动的应用程序所使用的内存空间。与 cache 或者 free 部分不同,这一列把页面缓存计算在内,并且不是所有的可回收的
slab
内存都可以真正被回收,因为可能有被占用的部分。(等同于 /proc/meminfo 中的 MemAvailable;自内核
3.14 版本可用,自内核 2.6.27
版本开始模拟;在其他版本上这个值与 free 这一列相同)

Q2. 如何更改显示的单位呢?

如果需要的话,你可以更改内存的显示单位。比如说,想要内存以兆为单位显示,你可以用 -m这个参数:

  1. free -m

free command display metrics change

同样地,你可以用 -b 以字节显示、-k 以 KB 显示、-m 以 MB
显示、-g 以 GB 显示、--tera 以 TB 显示。

Q3. 怎么显示可读的结果呢?

free 命令提供了 -h 这个参数使输出转化为可读的格式。

  1. free -h

用这个参数,free 命令会自己决定用什么单位显示内存的每个数值。例如:

diplsy data fromm free command in human readable form

Q4. 怎么让 free 命令以一定的时间间隔持续运行?

您可以用 -s 这个参数让 free 命令以一定的时间间隔持续地执行。您需要传递给命令行一个数字参数,做为这个时间间隔的秒数。

例如,使 free 命令每隔 3 秒执行一次:

  1. free -s 3

如果您需要 free 命令只执行几次,您可以用 -c 这个参数指定执行的次数:

  1. free -s 3 -c 5

上面这条命令可以确保 free 命令每隔 3 秒执行一次,总共执行 5 次。

注:这个功能目前在 Ubuntu 系统上还存在 问题[1],所以并未测试。

Q5. 怎么使 free 基于 1000 计算内存,而不是 1024?

如果您指定 free 用 MB 来显示内存(用 -m 参数),但又想基于 1000
来计算结果,可以用 --sj 这个参数来实现。下图展示了用与不用这个参数的结果:

How to make free use power of 1000 \(not 1024\) while displaying
memory figures

Q6. 如何使 free 命令显示每一列的总和?

如果您想要 free 命令显示每一列的总和,你可以用 -t 这个参数。

  1. free -t

如下图所示:

How to make free display total of columns

请注意 Total 这一行出现了。

总结

free 命令对于系统管理来讲是个极其有用的工具。它有很多参数可以定制化您的输出,易懂易用。我们在本文中也提到了很多有用的参数。练习完之后,请您移步至 man
手册[2]了解更多内容。


via: 

作者:Himanshu Arora[4] 译者:jessie-pang 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

LCTT 译者jessie-pang ?共计翻译:1 篇贡献时间:5

推荐文章

< 左右滑动查看相关文章 >

点击图片、输入文章 ID 或识别二维码直达

原文链接请访问“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。

##/proc的意义
在linux查看各种状态,其实质是查看内核中相关进程的数据结构中的项通过工具将其格式化后输出出来。但是内核的数据是绝对不能随意查看或更改的,至少不能直接去修改。所以,在linux上出现了伪文件系统/proc,它是内核中各属性或状态向外提供访问和修改的接口。
##查看进程信息

www.hj8828.com 1

pstree命令

在 Linux
系统上,有时你可能想从命令行快速地了解系统的已使用和未使用的内存空间。如果你是一个
Linux 新手,有个好消息:有一条系统内置的命令可以显示这些信息:free

选项说明:
  -a:显示进程的命令行
  -c:展开分支
  -h:高亮显示当前正在运行的进程及其父进程
  -p:显示进程的pid,此选项也将展开分之
  -l:允许显示长格式进程

在本文中,我们会讲到 free
命令的基本用法以及它所提供的一些重要的功能。文中提到的所有命令和用法都是在
Ubuntu 16.04LTS 上测试过的。

ps命令

Linux free 命令

让我们看一下 free 命令的语法:

free [options]

free 命令的 man 手册如是说:

free
命令显示了系统的可用和已用的物理内存及交换内存的总量,以及内核用到的缓存空间。这些信息是从
/proc/meminfo 中得到的。

接下来我们用问答的方式了解一下 free 命令是怎么工作的。

ps aux各列的意义

Q1. 怎么用 free 命令查看已使用和未使用的内存?

这很容易,您只需不加任何参数地运行 free 这条命令就可以了:

free

这是 free 命令在我的系统上的输出:

www.hj8828.com 2

view used and available memory using free command

这些列是什么意思呢?

  • total – 安装的内存的总量(等同于 /proc/meminfo 中的 MemTotal
    SwapTotal
  • used – 已使用的内存(计算公式为:used = totalfree
    bufferscache
  • free – 未被使用的内存(等同于 /proc/meminfo 中的 MemFree
    SwapFree
  • shared – 通常是临时文件系统使用的内存(等同于 /proc/meminfo 中的
    Shmem;自内核 2.6.32 版本可用,不可用则显示为 0
  • buffers – 内核缓冲区使用的内存(等同于 /proc/meminfo 中的
    Buffers
  • cache – 页面缓存和 Slab 分配机制使用的内存(等同于 /proc/meminfo
    中的 CachedSlab
  • buff/cachebufferscache 之和
  • available
    在不计算交换空间的情况下,预计可以被新启动的应用程序所使用的内存空间。与
    cache 或者 free
    部分不同,这一列把页面缓存计算在内,并且不是所有的可回收的 slab
    内存都可以真正被回收,因为可能有被占用的部分。(等同于
    /proc/meminfo 中的 MemAvailable;自内核 3.14 版本可用,自内核
    2.6.27 版本开始模拟;在其他版本上这个值与 free 这一列相同)

  %CPU:表示CPU占用百分比,计算方式是“进程占用CPU时间/CPU总时间”
  %MEM:表示各进程所占物理内存百分比
  VSZ:表示各进程占用的虚拟内存,也就是其在线性地址空间中占用的内存
  RSS:表示各进程占用的实际物理内存,单位为Kb
  TTY:表示属于哪个终端,”?”表示不依赖于终端的进程
  TAT:进程所处的状态
  D:不可中断睡眠
  R:运行中或等待队列中的进程(running/runnable)
  S:可中断睡眠
  T:进程处于stopped状态
  Z:僵尸进程
对于BSD风格的ps选项,进程的状态还会显示下面几个组合信息。
  <:高优先级进程
  N:低优先级进程
  L:该进程在内存中有被锁定的页
  s:表示该进程是session leader,即进程组的首进程。例如管道左边的
进程,shell脚本中的shell进程
  l:表示该进程是一个线程
  +:表示是前段进程。前段进程一般来说都是依赖于终端的

Q2. 如何更改显示的单位呢?

如果需要的话,你可以更改内存的显示单位。比如说,想要内存以兆为单位显示,你可以用
-m 这个参数:

free -m

www.hj8828.com 3

free command display metrics change

同样地,你可以用 -b 以字节显示、-k 以 KB 显示、-m 以 MB 显示、-g
以 GB 显示、--tera 以 TB 显示。

  START:表示进程是何时被创建的
  TIME:表示各进程占用的CPU时间
  COMMAND:表示进程的命令行。如果是内核线程,则使用方括号”[]”包围

Q3. 怎么显示可读的结果呢?

free 命令提供了 -h 这个参数使输出转化为可读的格式。

free -h

用这个参数,free 命令会自己决定用什么单位显示内存的每个数值。例如:

www.hj8828.com 4

diplsy data fromm free command in human readable form

ps -elf

Q4. 怎么让 free 命令以一定的时间间隔持续运行?

您可以用 -s 这个参数让 free
命令以一定的时间间隔持续地执行。您需要传递给命令行一个数字参数,做为这个时间间隔的秒数。

例如,使 free 命令每隔 3 秒执行一次:

free -s 3

如果您需要 free 命令只执行几次,您可以用 -c 这个参数指定执行的次数:

free -s 3 -c 5

上面这条命令可以确保 free 命令每隔 3 秒执行一次,总共执行 5 次。

注:这个功能目前在 Ubuntu 系统上还存在
问题,所以并未测试。

选项说明
  -e:输出全部信息
  -f:全格式输出
  -l:长格式输出

Q5. 怎么使 free 基于 1000 计算内存,而不是 1024?

如果您指定 free 用 MB 来显示内存(用 -m 参数),但又想基于 1000
来计算结果,可以用 --sj
这个参数来实现。下图展示了用与不用这个参数的结果:

www.hj8828.com 5

How to make free use power of 1000 \(not 1024\) while displaying
memory figures

各列的意义:
  F:程序的标志位。0表示该程序只有普通权限,4表示具有root超级管理员权
限,1表示该进程被创建的时候只进行了fork,没有进行exec
  S:进程的状态位,注意ps选项加了”-“的是非BSD风格选项,不会有”s””<“”N
“”+”等的状态标识位
  C:CPU的百分比,注意衡量方式是时间
  PRI:进程的优先级,值越小,优先级越高,越早被调度类选中运行
  NI:进程的NICE值,值为-20到19,影响优先级的方式是PRI(new)=PRI(old)+
  NI,所以NI为负数的时候,越小将导致进程优先级越高。但是要注意NICE值
    只能影响非实时进程。可以通过 renice xx 22041(xx为nice值
22041进程号)
  ADDR:进程在物理内存中哪个地方
  SZ:进程占用的实际物理内存
  WCHAN:若进程处于睡眠状态,将显示其对应内核线程的名称,若进程为R状
态,则显示”-“
  ps 后grep的问题:

Q6. 如何使 free 命令显示每一列的总和?

如果您想要 free 命令显示每一列的总和,你可以用 -t 这个参数。

free -t

如下图所示:

www.hj8828.com 6

How to make free display total of columns

请注意 Total 这一行出现了。

在ps后加上grep筛选目标进程时,总会发现grep自身进程也被显示出来。先解释下为何会如此。
[root@xuexi ~]# ps aux | grep “crond”
root 1425 0.0 0.1 117332 1276 ? Ss Jun10 0:00 crond
root 8275 0.0 0.0 103256 856 pts/2 S+ 17:07 0:00 grep crond
通过管道将ps结果传递给grep时,管道协调了ps和grep两进程间通信,但管道的本质是进程间数据传递。管道左边的输出数据放入内存,由管道右边的进程读取。假如划分的内存不足以完全存放输出数据,则管道左边的进程将一直等待,直到管道右边取出内存中一部分的数据以让管道左边的进程继续输出,而管道右边的进程在管道左边的进程启动后也立刻启动了,但是它一直处于等待状态,等待接收管道传递来的数据(就像是平时执行命令时不给输入文件将会一直等待输入一样)。

总结

free
命令对于系统管理来讲是个极其有用的工具。它有很多参数可以定制化您的输出,易懂易用。我们在本文中也提到了很多有用的参数。练习完之后,请您移步至
man 手册了解更多内容。

【编辑推荐】

也就是说,管道左右两端的进程是同时被创建的(不考虑父进程创建进程消耗的那点时间),但数据传输是有先后顺序的,左边先传,右边后收,所以可能会造成交叉的情况,左边还没执行完,就捕获到了右边的进程信息。在此处体现在ps还没有统计完进程信息时,grep进程就已经被ps抓到了。

要将grep自身进程排除在结果之外,方法有二:

[root@xuexi ~]# ps aux | grep “crond” | grep -v “grep” #
使用-v将grep自己筛选掉
root 1425 0.0 0.1 117332 1276 ? Ss Jun10 0:00 crond

[root@xuexi ~]# ps aux | grep “cron[d]”
root 1425 0.0 0.1 117332 1276 ? Ss Jun10 0:00 crond
第二种方法能成功是因为grep进程被ps捕获时的结果是”grep
cron[d]”,而使用cron[d]匹配时,grep将只能匹配crond,而不能匹配cron
所以”grep cron[d]”被筛选掉了。其实加上其他字符将更容易理解。

[root@xuexi ~]# ps aux | grep “cron[dabc]”
root 1425 0.0 0.1 117332 1276 ? Ss Jun10 0:00 crond

uptime命令
显示当前时间,已开机运行多少时间,当前有多少用户已登录系统,以及3个平均负载值。
所谓负载率(load),即特定时间长度内,cpu运行队列中的平均进程数(包括线程),一般平均每分钟每核的进程数小于3都认为正常,大于5时负载就已经非常高
在UNIX系统中,运行队列包括cpu正在执行的进程和等待cpu的进程(即所谓的可运行runable)。在Linux系统中,还包括不可中断睡眠态(IO等待)的进程。运行队列中每出现一个进程,load
就加1,进程每退出运行队列,Load就减1。如果是多核cpu,则还要除以核数。
例如,单核cpu上的负载值为”1.73 0.60 7.98″时,表示:

  最近1分钟:1.73表示平均可运行的进程数,这一分钟要一直不断地执行这1.73个进程。0.73个进程等待该核cpu。

  最近5分钟:平均进程数还不足1,表示该核cpu在过去5分钟空闲了40%的时间。

  最近15分钟:7.98表示平均可运行的进程数,这15分钟要一直不断地执行这7.98个进程。

  结合前5分钟的结果,说明前15-前10分钟时间间隔内,该核cpu的负载非常高。

如果是多核cpu,则还要将结果除以核数。例如4核时,某个最近一分钟的负载值为3.73,则意味着有3.73个进程在运行队列中,这些进程可被调度至4核中的任何一个核上运行。最近1分钟的负载值为1.6,表示这一分钟内每核cpu都空闲(1-1.6/4)=60%的时间。所以,load的理想值是正好等于CPU的核数,小于核数的时候表示cpu有空闲,超出核数的时候表示有进程在等待cpu,即系统资源不足

##top、htop、以及iftop命令

top命令查看动态进程状态,默认每5秒刷新一次。

top选项说明:

  -d:指定刷新的时间间隔,默认为5秒
  -b:批处理模式,每次刷新分批显示
  -n:指定top刷新几次就退出,可以配合-b使用
  -p:指定监控的pid,指定方式为-pN1 -pN2…或-pN1,N2 [,…]
  -u:指定要监控的用户的进程,可以是uid也可以是user_name

在top动态模式下,按下各种键可以进行不同操作。使用”h”或”?”可以查看相关键的说明。

  1 :(数字一)表示是否要在top的头部显示出多个cpu信息
  H :表示是否要显示线程,默认不显示
  c,S :
c表示是否要展开进程的命令行,S表示显示的cpu时间是否是累积模式,cpu累积模式下已死去的子进程cpu时间会累积到父进程中
  x,y :x高亮排序的列,y表示高亮running进程
  u :仅显示指定用户的进程
  n or #:设置要显示最大的进程数量
  k :杀进程
  q :退出top
  P :以CPU 的使用资源排序显示
  M :以Memory 的使用资源排序显示
  N :以PID 来排序以下是top的一次结果。

[root@xuexi ~]# top
top – 17:43:44 up 1 day, 14:16, 2 users, load average: 0.10, 0.06,
0.01
Tasks: 156 total, 1 running, 155 sleeping, 0 stopped, 0 zombie
Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
Cpu2 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1004348k total, 417928k used, 586420k free, 52340k buffers
Swap: 2047996k total, 0k used, 2047996k free, 243800k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19364 1444 1132 S 0.0 0.1 0:00.96 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT 0 0 0 0 S 0.0 0.0 0:01.28 migration/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.59 ksoftirqd/0
5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/0

第1行:和w命令的第一行一样,也和uptime命令的结果一样。此行各列分别表示”当前时间”、”已开机时长”、”当前在线用户”、”前1、5、15分钟平均负载率”。
第2行:分别表示总进程数、running状态的进程数、睡眠状态的进程数、停止状态进程数、僵尸进程数。
第3-6行:每颗cpu的状况。
  us = user mode
  sy = system mode
  ni = low priority user mode
(nice)(用户空间中低优先级进程的cpu占用百分比)
  id = idle task
  wa = I/O waiting
  hi = servicing IRQs(不可中断睡眠,hard interruptible)
  si = servicing soft IRQs(可中断睡眠,soft interruptible)
  st = steal (time given to other DomU
instances)(被偷走的cpu时间,一般被虚拟化软件偷走)
第7-8行:从字面意思理解即可。

  VIRT:虚拟内存总量

  RES:实际内存总量

  SHR:共享内存量

  TIME:进程占用的cpu时间(若开启了时间累积模式,则此处显示的是累积时间)

top命令虽然非常强大,但是太老了。所以有了新生代的top命令htop。htop默认没有安装,需要手动安装。

##vmstat命令
注意vmstat的第一次统计是自开机起的平均值信息,从第二次开始的统计才是指定刷新时间间隔内的资源利用信息,若不指定刷新时间间隔,则默认只显示一次统计信息。