该清单中的示例输出与清单 8-1 中表现的线程相对应。请注意,单线程进程的 TID 与 PID 相同;这是主线程。对于多线程进程 12534,线程 12534 也是主线程。
注意:通常情况下,您不会像对待进程那样与单个线程交互。你需要对多线程步伐的编写方式了如指掌,才能同时对一个线程采取行动,即便云云,这样做也未必是个好主意。
线程会在资源监控方面造成混乱,由于多线程进程中的单个线程可以同时消耗资源。例如,top 默认不表现线程,需要按 H 键才能打开。对于即将看到的大多数资源监控工具,你都需要做一些额外的工作来打开线程表现。
8.5 资源监控简介
现在我们将讨论资源监控的一些主题,包罗处理器(CPU)时间、内存和磁盘 I/O。我们将检查全系统范围以及每个进程的利用率。
为了提高性能,很多人都会接触 Linux 内核的内部运作。然而,大多数 Linux 系统在发行版的默认设置下性能良好,你可能要耗费数天时间来调整机器的性能,却得不到有意义的结果,尤其是如果你不知道要注意什么的话。因此,在使用本章的工具举行实验时,与其思量性能,不如看看内核在进程间分配资源时的运行情况。
8.5.1 测量 CPU 时间
要监督一个或多个特定进程的运行时间,请使用 top 的 -p 选项,语法如下
$ top -p pid1 [-p pid2 ...]
复制代码
要想知道一条下令在其生命周期内占用了多少 CPU 时间,可以使用 time。不幸的是,这里有一些混乱,由于大多数 shell 都有一个内置的 time 下令,但并不提供大量的统计数据,而 /usr/bin/time 中有一个系统实用步伐。你可能会先碰到内置的 bash shell,以是试试用 ls 下令运行 time:
$ time ls
real 0m0.442s
user 0m0.052s
sys 0m0.091s
复制代码
用户时间(user)是 CPU 运行步伐自身代码所耗费的秒数。系统时间(sys 或 system)是内核执行进程工作(例如读取文件和目录)所耗费的时间。最后,实际时间(real)(也称运行时间)是进程从开始到结束运行所耗费的总时间,包罗 CPU 执行其他使命所耗费的时间。通常情况下,这个数字对性能测量并无太大帮助,但从已用时间中减去用户和系统时间,可以大致了解进程等待系统和外部资源的时间。例如,等待网络服务器相应请求的时间会表现在已用时间中,但不会表现在用户或系统时间中。
参考资料
在该顶部输出中,PR(优先级)列列出了内核当前进程的操持优先级。数字越大,表示如果其他进程需要 CPU 时间,内核越不可能调度该进程。不过,内核并不会仅凭操持优先级就决定是否给进程分配 CPU 时间,内核还可能在步伐执行过程中根据进程消耗的 CPU 时间改变优先级。
紧挨着优先级列的是 NI(nice value)列,它为内核调度步伐提供了提示。当你试图影响内核的决定时,你所关心的就是这一点。内核会将友好值与当前优先级相加,以确定进程的下一个时隙。当你将 nice 值设置得更高时,你就会对其他进程更 “友好”,由于内核会优先处理它们。
默认情况下,“友好 ”值为 0。现在,假设你正在背景运行一项大型计算,不想让交互会话陷入困境。要让该进程排在其他进程之后,只在其他使命无事可做时运行,可以使用 renice 下令(其中 pid 是要更改的进程的 ID)将 nice 值改为 20:
$ renice 20 pid
复制代码
如果你是超级用户,可以将 nice 值设置为负数,但这样做险些总是个坏主意,由于系统进程可能得不到足够的 CPU 时间。事实上,你可能并不需要过多修改 nice 值,由于许多 Linux 系统只有一个用户,而且该用户并不执行太多实际计算。(当一台机器上有许多用户时,nice 值要重要得多)。
8.5.3 使用负载匀称值衡量 CPU 性能
CPU 团体性能是比力容易衡量的指标之一。负载匀称值是当前准备运行的进程的匀称数量。也就是说,它是对任何给定时间内能够使用 CPU 的进程数量的估计,包罗正在运行的进程和等待使用 CPU 的进程。在思量匀称负载时,请记住系统中的大多数进程通常都在等待输入(例如来自键盘、鼠标或网络的输入),这意味着它们还没有准备好运行,不应该对匀称负载产生任何影响。只有实际运行的进程才会影响匀称负载。
使用 uptime
除了内核运行的时间外,uptime 下令还会告诉你三个负载匀称值:
$ uptime
... up 91 days, ... load average: 0.08, 0.03, 0.01
当所需内存页根本不在主内存中时,就会发生主要页面故障,这意味着内核必须从磁盘或其他慢速存储机制中加载它。大量的主要页面故障会导致系统瘫痪,由于内核必须做大量的工作来提供页面,从而剥夺了正常进程运行的时机。
有些重大页面故障是不可避免的,比如第一次运行步伐时从磁盘加载代码时出现的页面故障。最大的问题发生在内存开始耗尽时,这会迫使内核开始将工作内存页交换到磁盘,以便为新页腾出空间,并可能导致崩溃。
你可以使用 ps、top 和 time 下令深入查看单个进程的页面故障。你需要使用系统版本的 time (/usr/bin/time),而不是 shell 内置的。下面是 time 下令表现页面故障的一个简单示例(cal 下令的输出无关紧急,因此我们将其重定向到 /dev/null,将其丢弃):