高效使用Top

标签: IT技术 工具与资源 Linux top 进程 | 发表时间:2013-04-17 13:08 | 作者:刘志成
出处:http://blog.jobbole.com

英文原文: Using Top More Efficiently,编译: oschina

对桌面用户来说,监视系统资源使用是一项重要的工作。通过这项工作,我们可以找到系统瓶颈所在,针对性的进行系统优化,识别内存泄露等。问题是,我们应该用什么软件,以及如果针对我们的需求使用它。

在众多备选的监测工具中,多数人使用“top”(procps 包的一部分)。Top 提供了几乎可以说是所有的我们所需要的系统资源使用监测,就在这一个软件中。本文中的所有信息都是基于运行在 Linux 2.6.x 内核上的版本号为3.2.5的 procps 包。

在这里,我们假定 procps 已经安装并运行在你的 Linux 系统中。这里无需你对 top 的使用经验,但如果你尝试去用一下,将更有利。

下面是一些挑战:

A.交互还是批处理模式?

默认情况下,Top 被调用时使用交互模式。在此模式下,Top 无限期运行,并可以通过按键重新定义 Top 的运行方式。但是,有时你需要对 Top 的输出进行后续处理,但这在此模式下难以实现。解决方法?使用批处理模式。

$ top -b

你将获得类似下面的输出:

top - 15:22:45 up  4:19,  5 users,  load average: 0.00, 0.03, 0.00
Tasks:  60 total,   1 running,  59 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.8% us,  2.9% sy,  0.0% ni, 89.6% id,  3.3% wa,  0.4% hi,  0.0% si
Mem:    515896k total,   495572k used,    20324k free,    13936k buffers
Swap:   909676k total,        4k used,   909672k free,   377608k cached
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  1 root      16   0  1544  476  404 S  0.0  0.1   0:01.35 init
  2 root      34  19     0    0    0 S  0.0  0.0   0:00.02 ksoftirqd/0
  3 root      10  -5     0    0    0 S  0.0  0.0   0:00.11 events/0

哈,等等,它是不断重复运行的,同交互模式一样。不用担心,你可以使用 -n 限制重复数量。所以,如果你希望获得一次性结果,键入:

$ top -b -n 1

这一模式的真正优势在于你可以很容易的与 at 或 cron 命令结合。它们的结合,使得 Top 可以在特定时间对资源使用状态进行快照。例如,使用 at ,我们可以设定 top 在一分钟之后运行。

$ cat ./test.at
TERM=linux top -b -n 1 >/tmp/top-report.txt
$ at -f ./test.at now+1minutes

细心的读者可能会问“在创建新任务时,为什么我需要在调用 Top 之前设置环境变量 TERM?”。答案是,Top 运行时需要此变量,但“at”在定时调用时并不会保留它。同上面那样简单的设置可以确保 Top 正常运行。

B.如何监控制定进程?

有时,我们只对几个进程感兴趣,可能只是全部进程中的4个或5个。例如,如果你想要监测进程标识(PID)为4360和4358的进程,你需要键入:

$ top -p 4360,4358

$ top -p 4360 -p 4358

看起来很简单,只需要使用 -p 列出所有需要的 PID,并使用逗号间隔或简单的多次使用 -p即可。
另一种可能是监测拥有特定用户标识(UID)的进程。应对此需求,你可以使用 -u 或 -U 选项。假设用户“johndoe”的 UID 为500,键入:

$ top -u johndoe

OR

$ top -u 500

$ top -U johndoe

结论是,你既可以纯使用用户名,也可使用数字 UID。“-u,-U?这两者不同?”是的。同多数其它 GNU 工具一样,选项是大小写敏感的。-U 意味着 Top 将会搜索有效的、真实的、被保存的以及文件系统的 UID 进行匹配,而 -u 仅匹配有效的用户id。要知道,每一个 *nix 进程在运行时都是用有效用户标识(effective UID),而其中有些并不等同真实用户标识。多数情况是,对类似文件系统权限或操作系统功能这项的有效用户标识感兴趣的人将会检查它,而不是 UID。
不同于 -p 仅用于命令行选项,-U 和 -u 都可以在交互模式中使用。同你猜测的一样,键入‘U’或‘u’可以依据用户名过滤进程。同样的规则依然适用,‘u’为有效用户标识,‘U’为 真实/有效/保存/文件系统用户名。你将被要求键入用户名或数字 UID。

C.快熟还是缓慢更新?

在回答这个问题之前,让我们先简单介绍一下,Top 是如何运行的。这里,Strace 能够帮助你:

$ strace -o /tmp/trace.txt top -b -n 1

使用你偏爱的文本编辑器打开 /tmp/trace.txt。你怎么想?一次调用有太多的活要做了,反正我是这么想的。Top 在每次遍历中必做的工作之一就是打开很多文件,并解析其内容,可以看看次数:

$ grep open( /tmp/hasil.txt | wc -l

举例而言,我的 Linux 中,这个数量是304.仔细观察就会发现,Top 遍历 /proc 文件夹,以收集进程信息。/proc 本身是一个虚拟文件系统,意味着它并非存在于真实硬盘之中,而是由 Linux 内核凭空创建,保存在内存中的。在文件夹中,如/proc/2097(2097为 PID),Linux 内核将与之关联的信息打印到此文件中,而这里就是 Top 的消息来源。

同时试一下:

$ time top -b -n 1

这样你就能了解到 Top 单轮工作有多快了。在我的系统中,大约为0.5-0.6秒。看“real”字段,不是“user”或“system”字段,因为“real”字段反应了 Top 工作需要的总时间。

所以,有了这个认知之后,使用适度的更新间隔是明智的。基于文件系统访问内存也是需要时间的。经验法则是,对于多数用户来说,1到3秒的间隔就足够了。在命令行中使用-d,或在交互模式下按下“s”以设置。你可以使用类似2.5,4.1这样的小树。

什么时候我们需要快于1秒的更新?

  • 时间段内需要更多的样本。应对这点要求,最好使用批处理模式,并将标准输出重定向到文件中,以便更好的分析。
  • 你并不在意 Top 消耗的额外CPU负荷。是的,虽然它很小,它依然需要负荷。如果你的 Linux 系统相对比较空闲,随意使用短间隔,如果不是,最好为重要的任务保留你的 CPU 时间。

一个减少 Top 工作的办法是只监测特定的几个 PID。这样,Top 无需遍历 /proc 下所有的子文件夹。用户名过滤呢?并不会变得更好。用户名过滤会给Top带来额外工作量,因此将其与短间隔联合将会增加 CPU 负荷。

当然,当你需要强制更新时,按下 Space 键,Top 将会刷新统计。、

D.我们需要的字段

默认时,Top 启动后会显示下面的任务属性:

字段 描述
PID : 进程 ID
USER : 有效用户 ID
PR : 动态优先值
NI : 良好值,也被称为基本优先级
VIRT : 任务虚拟大小。包括进程的可执行二进制文件大小,数据区大小以及所有已加载的共享库的大小。
RES : 目前任务内存消耗。存入交换分区的部分并不包含。
SHR : 一些内存区域可能由两个或多个任务分享,此字段反应这些共享区域。例如共享库以及 Sysv 共享内存。
S : 任务状态
%CPU : Top 屏幕更新时专用于运行任务的CPU 时间百分比。
%MEM : 任务当前内存消耗的百分比
TIME+ : 在任务启动后消耗的总CPU时间。”+” sign means it is displayed with hundreth of a second granularity. 默认时,TIME/TIME+ 不会计入已经关闭的任务子进程。
COMMAND : 显示程序名。

不止这些。下面我介绍一些你可能会用到的列:

描述
nFLT (‘u’键) 进程启动以来重大页面错误(page fault)的个数。准确地说,页面错误是由于进程访问它的地址空间内不存在的页面引起的。“重大”的页面错误是指内核需要访问磁盘来使得该页面有效。相反,小型页面错误是指内核只需要在内存中分配页面而不用读磁盘。例如,假设程序ABC的大小为8KB,页面大小为4KB。当程序读进内存的时候,发生了两次重大的页面错误(2*4KB)。程序本身分配了8KB空间当作临时数据。因此,还会有两次小型页面错误。nFLT过高可能意味着:

  1. 进程从磁盘读取大量资源。The task is aggressively load some portions of its executable or library from the disk.
  2. 进程访问了一个已经交换到磁盘的页面。

当进程第一次运行时,看到大量重大页面错误很正常。下次运行的时候,由于缓存已经分配好了,你很可能看到”0″次或者很小的 nFLT。但是,如果一个程序频繁地触发重大页面错误,很有可能是你目前安装的内存不够那个程序使用。

nDRT (‘v’键) 上次页面写入磁盘以来,脏页面的数目。什么是脏页面?先看一点背景知识。大家都知道,Linux使用了缓存系统,所以从磁盘读取的数据也会被缓存到内存中。这样做的优点是,后续的对这个磁盘块的读操作可以直接从内存中取数据,因而速度更快。但这也是有代价的。如果缓冲区的内容被修改了,那么就需要进行同步。因此,被更改的缓冲区(脏页面)必需写回到磁盘中。同步失败则可能导致磁盘上的数据不一致。在负载不重的系统中,nDRT 通常小于10(大约估计)或者为0。如果你的系统通常大于10,则有可能:

  1. 进程正在往磁盘写入大量数据。磁盘I/O经常跟不上缓冲区的速度。
  2. 磁盘I/O拥塞,因此即使进程修改了很小部分文件,也必需等待一段时间才能完成同步。拥塞出现在很多进程同时访问磁盘而缓存命中率低的情况下(译者注:FTP服务的典型情况)。

现在的话,(1) 不太可能出现,因为I/O速度越来越快,需要更少的CPU(DMA技术的出现)。所以 (2) 出现的概率更高。

注意:在 2.6.x 内核中, 不知道为什么,这个列的值总是0。

P (‘j’键) 上次使用的CPU。这个列只在SMP环境中有意义。这里的SMP指超线程,多核或者多CPU架构。如果你只有一个CPU(不是多核,没有超线程),这个列总是显示0。在SMP系统中,即使这个列有几次改变,也不要吃惊。这意味着,Linux 内核尝试将你的进程移到另一个负载更少的CPU。
CODE (‘r’键) 和 DATA (‘s’键) CODE 只是反映了你程序代码的大小,DATA反映了你数据段(栈,堆,变量,不包含共享库) 的大小。单位都是KB。DATA可以显示你的程序分配了多少内存。有时,也可以用来协助分析内存泄漏。当然,你需要更好的工具,如使用 valgrind 来查看每次的内存分配。如果DATA不断增长,则很有可能出现了内存泄漏。注意:DATA, CODE, SHR, SWAP, VIRT, RES 都是使用页面大小(Intel架构上为4KB)来衡量。只读数据段也包含在CODE的大小中,因而有时候CODE比实现的段要大。
SWAP (‘p’键) 已经进行交换的进程内存映像大小。这个列有时很让人疑惑:逻辑上,你可能期望这个列显示你的程序实际上是完全进行交换,还是部分交换了,交换了多少。但是事实上不是。即使”Swap used” 列显示为0,你仍然可以很吃惊地发现所有进程的SWAP列都大于0。到底是为什么呢?这是由于 top 命令使用如下的计算公式:

                VIRT = SWAP + RES or equal
                SWAP = VIRT - RES

前面说过,VIRT 包含了进程的地址空间里面的所有东西:内存中的,已经进行交换的,尚未从磁盘读取的。RES 代表了进程占用的全部内存大小。所以,这里的SWAP代表了已经进行交换的全部数据,以及尚未从磁盘读取的数据。不要被SWAP这个名字迷惑了,它代表的不只是已经交换的数据。

要显示以上的列,在交互模式下按 ‘f’ 键,然后再按相应的键。按一下显示指定的列,再按一下隐藏该列。要确定当前显示的是哪些列,只需看第一行的字母(在”Current Fields”的右边)。大写字母表示显示了该列,小写表示隐藏。你选好以后,按回车即可。

排序使用了类似的方法。按 ‘O’ (大写),然后再按相应的键。即使记不住那些按键也没关系,top 会显示出来。新的排序键将标上星号,相应的字母会变成大写,很直观。选好以后,记得按回车。

E.多视图比单个视图更好吗?

在不同的情况下,有时候我们想监视不同的系统属性。例如,你想同时监控CPU的百分比和CPU被所有任务消耗的时间。在另一段时间,你想监控常驻内存和所有任务的总页面故障。快速按‘F’键然后切换界面?我想这也太不明智了吧。

为什么不试试多视图窗口模式呢?按‘A’(大写)切换到多窗口界面。默认的,你将会看到4个不同的系列的字段组。每个字段组有默认的标签/名称:

第一字段组: Def

第二字段组: Job

第三字段组: Mem

第四字段组: Usr

第一字段组就是你在单一视图窗口所常见的组,而其余的组会被隐藏。内置多视图窗口模式,所有可用的窗口通过按‘a’或者‘w’循环。注意,切换到其他窗口时会改变活动窗口(也称为当前窗口)。假如你不确定哪一个是活动窗口的话,只需要看一下top展示的第一行(在当前时间字段的左边)。另一个改变活动窗口的方法是通过按‘G’紧跟着输入数字(1到4)。

活动窗口是针对用户输入的,因此在开始干活之前确定选好了你偏好的界面。然后,你可以在单一窗口模式下爱干嘛干嘛。在这种情况你一般想自定义字段展示,那么你只需要按‘f’然后开始自定义。

假如你认为第四字段组太多的话,你只需要切换到字段组然后按‘-’隐藏。请注意,即使你隐藏了当前的字段组,那并不以意味着你同时改变了活动组。再次按‘-’的话,当前组就可见了。

如果你想操作多视图窗口模式,再次按‘A’键。那样也将使得活动组成为了单一视图窗口模式的新的字段组。

F. “我的Linux主机上怎么会只有很少的空闲内存?”

有同样的问题? 不管你在主板上增加多少内存,你都会很快发现空闲内存减少的非常迅速. 空闲内存算错了? 不!

在回答这个之前, 先查看一下top命令顶部显示的内存概要 (有可能你需要按 ‘m’来显示出来). 在这里,你可以看到两个区域: 缓冲(buffers)和缓存(cached)。 “缓冲(Buffers)” 代表有多少内存用来缓存磁盘块 ”缓存(Cached)” 有一点类似 “缓冲(Buffers)”, 只是仅仅从文件读取缓存页面. 想透彻了解这部分,建议读一下Linux内核的书比如Robert M.Love写的《Linux Kernel Development》。

这足够了解缓冲(buffers)和缓存(cached)代表系统缓存. 他们会根据linux内核机制动态增加或减少。

除去被缓存的消耗,程序和代码同样要占据RAM. 所以,最终空闲内存显示的是RAM中不被缓存和程序/代码占用的部分 一般来说,你也可以考虑缓存区域为另一部分“空闲”RAM,如果程序需要更多内存它会减少

从进程的角度来看,你可能想知道哪个区域代表真实的内存消耗,VIRT(virtual memory usage )区域? 当然不是! 回顾一下,这个区域代表了进程地址空间里一切,包括相关的库。阅读top命令的源代码和proc.txt (在内核代码树中的Documentation/filesystem 文件夹内), 我的结论是RSS字段是进程内存消耗的最好的描述.我说“最好的”是因为你可以考虑它是近似而不是所有时间100%准确。

G.使用数个保存的配置

希望保存多个不同的配置文件,以便于轻松的切换预配置视图?只需要创建一个 Top 二进制文件的软连接到你喜欢的名字:

# ln -s /usr/bin/top /usr/bin/top-a

然后运行新的“top-a”。调整完毕后键入‘W’保存配置,它将被保存到 ~/.top-arc(格式为你的 Top 别名+rc)。

这样,运行原来的 Top 可以使用之前的视图,而 top-a 则使用第二个,依次类推。

H.总结

有很多窍门使用top会更加高效。关键是知道你真正需要的是什么和可能的对Linux低级别原理的一般理解。统计并不总是正确,但至少有助于总体衡量。所有这些数字收集自 /proc,因此首先确保它已挂载!

参考:

  • Understanding The Linux Kernel,第二版。
  • 内核源代码树里的/filesystems/proc.txt文档。
  • Linux 内核源代码。

相关文章

高效使用Top,首发于 博客 - 伯乐在线

相关 [top] 推荐:

高效使用Top

- - 博客 - 伯乐在线
英文原文: Using Top More Efficiently,编译: oschina. 对桌面用户来说,监视系统资源使用是一项重要的工作. 通过这项工作,我们可以找到系统瓶颈所在,针对性的进行系统优化,识别内存泄露等. 问题是,我们应该用什么软件,以及如果针对我们的需求使用它. 在众多备选的监测工具中,多数人使用“top”(procps 包的一部分).

2010 年 Cydia 程序 Top 10

- yan - 爱范儿 · Beats of Bits
MacStories 评选出了 2010 年度 Cydia 商店上的 Top 10 ,这次入选的程序,都是今年内发布的,涵盖 iPhone 和 iPad 平台. “把 iOS 设备发挥到极致”是越狱开发者的初衷,如果你手上的设备越狱了,就一定要看看这些奇妙的程序. FullScren for Safari 自然是 iPhone 自带浏览器的全屏工具,它把浏览器的顶栏和底部按钮给隐藏起来.

2010年度MSN签名Top 10

- gloomy - 爱体验 iTeeyan.COM
近日,微软中国MSN签名频道票选出了国内MSN签名Top 10. 这是自2007年以来,类似活动的第4次举办. 微软中国MSN签名频道是这样描述2010年的签名Top 10的:“在刚刚过去的2010年中,也许Messenger是伴随你每个工作日的工具. 短短的一句话,让它成为了我们内心世界的真实映照:过去的一年中,我们用签名档记下了能丰胸的奶粉;过去的一年中,我们的签名档声讨了嚣张的李刚;过去的一年中,我们的签名档上挂满了”艰难的决定”;过去的一年中,我们的签名档用俏皮的语言说出了我爱的就是她……2010年飘过,不管神马浮云,我们都会怀念它.

Vision Mobile:2001-2010 手机市场 Top 5

- Shanshan - 爱范儿 · Beats of Bits
自从 iPhone 和 Android 问世以来,手机市场便进入了一轮新的变革. 过去一些看似无法撼动的手机行业王者,在新的市场竞争中不断丧失领地,一些曾经 PC 行业的公司则以更加迅捷的反应加入到这场移动互联网的巨变之中. Vision Mobile 盘点了过去 10 年间位居前五位的手机制造厂商,让我们得以更加直观的了解这场变革.

2011年08月09日 糗事 TOP 10

- FlyFire - 糗事百科
世界上最悲催的事都叫我遇到了,多么狗血的生活. 05年谈了个对象,我们00年认识的. 07年到订婚了,结果他父母背着他跟我提要求,叫我给他家买套房,最好是复式楼,要么我家给他们家一套房,然后叫我跟我爸爸断绝关系(我是单亲家庭,我爸爸现在单身,他们怕我爸爸以后没有钱拖累我们),然后不要在本地工作,因为本地工资太少,去外地工作,工资不要花,给他妈寄过去.

2011年07月19日 糗事 TOP 10

- zgjie - 糗事百科
配种糗事,只想说那个种兔太敬业了……. 笑料百科  改编自糗事#1144606  . 武汉南京看海神马的都OUT了,今夏来青岛看草原吧. 腾讯说新还珠同时段收视第一,网友这么评论. 家有贱猫一只,喜欢放饮水机里的水,求助. 坑爹的“意外惊喜”,我还寻思垃圾桶能有个什么惊喜. 我同学看了几集新还珠后,实在忍不了了,关了电视,恶狠狠的说,衷心希望皇后和容嬷嬷弄死那两个…….

2011年07月10日 糗事 TOP 10

- . - 糗事百科
然后自我安慰说:肯定他们没想到我是女的,所以觉得意外了吧,多玩玩就熟了. 后来我才发现气氛不对不是这个原因. KTV在前台有那种点播的表白有没有. 我唱歌唱着唱着,MV下面滚动出一行小字:. “533房的XXX(我在游戏中的ID). 我们一起弄装备,一起下副本的日子真的很快乐. 看到这里,我还觉得很感动,刚想问问是谁和我告白呢.

2011年08月11日 糗事 TOP 10

- 尘世客 - 糗事百科
都说驾校是杀手培训基地这下我信了  . 背景:小时候家住牧区,家里养了头母牛,刚下完仔就败血症死了————格机格机————小牛仔叫“蛋蛋”,我每天负责买鲜奶回来喂它,持续了半年,然后就发现个问题,我做什么它总是跟这我,有一天去上学,快迟到了,就一路小跑到教室,发现老师已经先到了,脸红的走到座位上,忽然我石化了,蛋蛋怎么在我身后,还没等我反应过来GC来了,蛋蛋直接卧在我课桌旁边了.

2011年07月02日 糗事 TOP 10

- Xiaoyu - 每日鲜果精选
前些天,去幼儿园接儿子,听说一件令人气愤的事,他们班有个小朋友吃饭时把同桌孩子碗里菜都折腾一遍,自己爱吃的抢了,不吃的倒别人碗里,并且,这种事情不是第一次发生了,当时就感觉这孩子有些缺家教. 今天上糗百,终于知道孩子为什么这样了,孩子他妈把这事贴糗百上,还夸自己孩子可爱. 请先自己学会做人再教孩子,如果自己都没荣辱观,别要孩子,孩子很无辜,被你教成这样,她以后路还长,如果父母再不长进,她的未来让人担忧.

2011年07月03日 糗事 TOP 10

- Henry - 糗事百科
CNT ,光看不发掉RP,求口腔溃疡早点好. 复旦  空调  师妹  毕业  . 这个 工大的同学都懂的~ 有图有真相. 爷爷是参加过援朝的退伍军人,身体特硬朗. 老爷子平时喜好养个花、赶个集什么的. 有一次他去赶集,迎面飞过一辆摩托车,直接把老人挂倒在地上. 车主连忙跳了下来,只见爷爷躺在地上一动不动,于是车主慌了,拿出手机要拨120.