对桌面用户来说,监视系统资源使用是一项重要的工作。通过这项工作,我们可以找到系统瓶颈所在,针对性的进行系统优化,识别内存泄露等。问题是,我们应该用什么软件,以及如果针对我们的需求使用它。
在众多备选的监测工具中,多数人使用“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。
?