2.0.概述
本章概述了系统级的Linux性能工具。这些工具是你追踪性能问题时的第一道防线。
它们能展示整个系统的性能情况和哪些部分表现不好。
1.理解系统级性能的基本指标,包括CPU的使用情况。
2.明白哪些工具可以检索这些系统级性能指标。
2.1CPU性能统计信息
为了不多次(每种工具一次)解释统计信息的含义,我们在描述所有工具之前对这些信息进行一次性说明。
2.1.1 运行队列统计
如果进程是可运行的,同时又在等待使用处理器,这些进程就构成了运行队列。运行队列越长,处于等待状态的进程就越多。
性能工具通常会给出可运行的进程个数和等待I/O的阻塞进程个数。另一种常见的系统统计是平均负载。
系统的负载是指正在运行和可运行的进程总数。
比如,如果正在运行的进程为两个,而可运行的进程为三个,那么系统负载就是5。
平均负载是给定时间内的负载量。
一般情况下,取平均负载的时间为1分钟、5分钟和15分钟。这能让你观察到负载是如何随时间变化的。
2.1.2上下文切换
大部分现代处理器一次只能运行一个进程或线程。
虽然有些处理器(比如超线程处理器)实际上可以同时运行多个进程,但是Linux会把它们看作多个单线程处理器。
如果要制造出给定单处理器同时运行多个任务的假象,Linux内核就要不断地在不同的进程间切换。
这种不同进程间的切换称为上下文切换,因为当其发生时,CPU要保存旧进程的所有上下文信息,并取出新进程的所有上下文信息。
上下文中包含了Linux跟踪新进程的大量信息,其中包括:进程正在执行的指令,分配给进程的内存,进程打开的文件等。
这些上下文切换涉及大量信息的移动,因此,上下文切换的开销可以是相当大的。尽量减少上下文切换的次数是个好主意。
要避免上下文切换,重要的一点是了解它们是如何发生的。
首先,上下文切换可以是内核调度的结果。
为了保证公平地给每个进程分配处理器时间,内核周期性地中断正在运行的进程,
在适当的情况下,内核调度器会决定开始另一个进程,而不是让当前进程继续执行。
每次这种周期性中断或定时发生时,你的系统都可能进行上下文切换。
每秒定时中断的次数与架构和内核版本有关。
一个检查中断频率的简单方法是用/proc/interrupts文件,它可以确定已知时长内发生的中断次数。如清单2.1所示。
在清单2.1中,我们要求内核给出定时器启动的次数,等待10秒后,再次请求。
这就是说,在这台机器上定时器启动频率为(24070093-24060043)中断/(10秒)或者约1000次中断/秒。
如果你的上下文切换明显多于定时器中断,那么这些切换极有可能是由I/O请求或其他长时间运行的系统调用(如休眠)造成的。
当应用请求的操作不能立即完成时,内核启动该操作,保存请求进程,并尝试切换到另一个已就绪进程。这能让处理器尽量保持忙状态。
2.1.3 中断
此外,处理器还周期性地从硬件设备接收中断。当设备有事件需要内核处理时,它通常就会触发这些中断。
比如,如果磁盘控制器刚刚完成从驱动器取数据块的操作,并准备好提供给内核,那么磁盘控制器就会触发一个中断。
对内核收到的每个中断,如果已经有相应的已注册的中断处理程序,就运行该程序,否则将忽略这个中断。
这些中断处理程序在系统中具有很高的运行优先级,并且通常执行速度也很快。
有时,中断处理程序有工作要做,但是又不需要高优先级,因此它可以启动“下半部”(bottom half),也就是所谓的软中断处理程序。
如果有很多中断,内核会花大量的时间服务这些中断。查看/proc/interrupts 文件可以显示出哪些CPU上触发了哪些中断。
2.1.4 CPU使用率
CPU使用率是个简单的概念。在任何给定的时间,CPU可以执行以下七件事情中的一个:
(1)CPU可以是空闲的,这意味着处理器实际上没有做任何工作,并且等待有任务可以执行。
(2)CPU可以运行用户代码,即指定的“用户”时间。
(3)CPU可以执行Linux内核中的应用程序代码,这就是“系统”时间。
(4)CPU可以执行“比较友好”的或者优先级被设置为低于一般进程的用户代码。
(5)CPU可以处于iowait状态,即系统正在等待I/O(如磁盘或网络)完成。
(6)CPU可以处于irq状态,即它正在用高优先级代码处理硬件中断。
(7)CPU可以处于softirq模式,即系统正在执行同样由中断触发的内核代码,只不过其运行于较低优先级(下半部代码)。
大多数性能工具将这些数值表示为占CPU总时间的百分比。
这些时间的范围从0%到100%,但全部三项加起来等于100%。
一个具有高“系统”百分比的系统表明其大部分时间都消耗在了内核上。像oprofile一样的工具可以帮助确定时间都消耗在了哪里。
具有高“用户”时间的系统则将其大部分时间都用来运行应用程序。
下一章展示在上述情况下,如何用性能工具追踪问题。
如果系统在应该工作的时候花费了大量的时间处于iowait状态,那它很可能在等待来自设备的I/O。导致速度变慢的原因可能是磁盘、网卡或其他设备。