`
shinepaopao
  • 浏览: 145819 次
社区版块
存档分类
最新评论

Linux下高效使用Top

阅读更多

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

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

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

下面是一些挑战:

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

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

1
$ top -b

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

1
2
3
4
5
6
7
8
9
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 限制重复数量。所以,如果你希望获得一次性结果,键入:

1
$ top -b -n 1

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

1
2
3
$ 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的进程,你需要键入:

1
$ top -p 4360,4358

1
$ top -p 4360 -p 4358

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

1
$ top -u johndoe

OR

1
$ top -u 500

1
$ 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 能够帮助你:

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

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

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

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

同时试一下:

1
$ 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 命令使用如下的计算公式:

 

1
2
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 二进制文件的软连接到你喜欢的名字:

1
# 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 内核源代码。

英文原文:Using Top More Efficiently

4
4
分享到:
评论
2 楼 gfdice 2014-02-25  
有些错别字改改,表格重新排版下就更好了 
1 楼 zhangzhenjj 2013-09-15  
挺给力  

相关推荐

    Linux 系统top源码包

    Linux系统中的`top`命令是系统管理员和开发者用于实时监控系统资源使用情况的重要工具,它提供了动态视图,展示CPU利用率、内存使用、进程状态等关键信息。`top`源码包的分析可以帮助我们深入了解其内部工作原理,...

    linux下top命令的使用.docx

    ### Linux 下 `top` 命令的使用详解 `top` 命令是 Linux 系统中非常重要的实时监控工具之一,主要用于查看和监控系统资源使用情况,特别是 CPU 和内存的使用情况。虽然大多数程序员都熟悉 `top` 命令的基本使用,但...

    linux top命令详解

    在Linux操作系统中,`top`命令是一个实时动态显示系统状态的工具,它是系统管理员监控系统资源使用情况的重要手段。本文将深入解析`top`命令的使用,包括其基本功能、参数选项以及如何解读其输出结果。 `top`命令...

    linux top的源码

    嵌入式系统开发者可以借鉴`top`的源码来设计自己的轻量级系统监控工具,因为`top`源码提供了一个很好的范例,展示了如何高效地从内核获取数据并在有限的硬件资源下实现实时显示。 总的来说,通过阅读`top`命令的...

    linux-让多核CPU达到指定的CPU使用率脚本

    - `top`和`htop`命令可用于实时查看CPU使用率,`mpstat`显示每个CPU核心的使用情况,`vmstat`提供系统整体的统计信息。 6. **安全与效率**: - 过度提升CPU使用率可能导致系统响应变慢,影响用户体验。脚本应...

    Linux 下的verilog

    在Linux环境下使用Verilog,开发者可以利用开源工具链进行设计流程,从编写代码到仿真、综合、布局布线,直至生成可编程设备配置文件。 在Linux下进行Verilog开发,首先需要安装一个支持Verilog的集成开发环境(IDE...

    ACPI&超线程,linux下的使用

    总结来说,ACPI和超线程在Linux环境下,为系统提供了更高效的能源管理及更高的计算能力。正确理解和使用这些技术,可以显著提升服务器或工作站的性能,同时在便携式设备上实现更好的电池寿命管理。通过上述方法,...

    linux查看cpu使用情况(top)命令.pdf

    Linux操作系统中,监控CPU使用情况的一个常用命令是`top`。`top`命令是一个实时的、动态的进程查看工具,能够展示系统当前的CPU、内存使用情况,以及其他关键性能指标。与`ps`命令不同,`top`命令会持续更新显示的...

    Linux下应用程序到底使用了多少内存

    本文将深入探讨Linux下应用程序的内存使用情况,并解析`top`命令和`free`命令提供的内存信息。 首先,当我们通过`top`命令查看内存使用情况时,要注意它显示的内存占用并不完全代表应用程序实际消耗的内存。这是...

    LinuxTop命令解析.pdf

    熟悉并熟练使用`top`命令对于Linux系统管理员来说至关重要,它能帮助快速定位和解决问题,确保系统的稳定和高效运行。同时,结合其他系统监控工具,如`ps`、`iostat`和`vmstat`,可以提供更全面的系统分析。

    Linux下使用python调用top命令获得CPU利用率

    本文将详细介绍如何使用Python调用Linux的`top`命令来获取CPU利用率。`top`命令是一个实时的系统监视工具,它可以显示系统中各个进程的资源消耗情况,包括CPU、内存等。 在Python中,我们可以利用内置的`os`模块来...

    linux系统使用简介

    熟练掌握这些基础命令对于高效使用Linux至关重要。 2. **文件系统与路径** Linux采用层次型的文件系统结构,根目录用"/"表示。文件和目录的权限管理采用读、写、执行三类权限,通过`chmod`命令进行调整。理解文件...

    Linux下用户和进程的管理

    在Linux中,可以通过`ps`命令查看当前系统中的进程状态,`kill`或`pkill`命令用于结束特定的进程,`top`或`htop`提供实时的进程监控。了解如何管理和控制进程对于系统性能优化和问题排查至关重要。 通过这个实验,...

    嵌入式Linux内存使用与性能优化

    例如,/proc/meminfo提供实时内存状态,vmstat报告虚拟内存统计,top和htop展示进程资源使用情况,strace追踪系统调用,可以帮助定位内存问题。 综上所述,优化嵌入式Linux内存使用与性能需要深入理解内存模型、...

    UNIX/LINUX及其使用环境

    2. **基础命令**:学习并熟练使用诸如`ls`(列出目录内容)、`who`(查看在线用户)、`w`(显示当前用户信息)、`pwd`(显示当前工作目录)、`ps`(查看进程状态)、`pstree`(以树形结构显示进程关系)、`top`...

    The Linux Kernel Primer A Top Down Approach for x86 and PowerPC Architectures.rar

    《Linux内核实战指南——基于x86和PowerPC架构的自顶向下方法》是一部深入讲解Linux内核的著作,适用于对操作系统有浓厚兴趣的读者,尤其是那些希望了解和研究Linux内核工作原理的开发者和系统管理员。这本书采用了...

    java监控linux cpu使用率

    在Java中,我们可以利用`Runtime`类或`ProcessBuilder`类来执行Linux命令,如`top`或`vmstat`,然后解析输出以获取CPU使用率。但是,这种方法可能会受到shell环境的影响,且不够高效。更常见的是使用Java的`java....

    Linux百科全书(很实用的Linux使用资料)

    9. **监控与性能优化**:学会使用工具如`top`、`htop`、`iotop`、`glances`来监控系统资源,进行性能分析和优化。 10. **开源社区与资源**:Linux的开源特性意味着有大量的在线资源,如Stack Overflow、GitHub、...

    Linux.zip linux使用说明ppt

    5. **系统维护**:使用df和du检查磁盘空间,top或htop监控系统资源使用情况,crontab设置定时任务。 **学习Linux的重要性** 学习Linux不仅对系统管理员至关重要,对于程序员、网络工程师以及任何需要在服务器上...

Global site tag (gtag.js) - Google Analytics