Linux - 系统性能监控

重点讨论一些有助于监视系统整体性能的工具。当理解了工作负荷的系统整体性能特征之后,还可以使用这组工具标识出哪些特定进程是整体工作负荷的性能瓶颈。在许多情况下,系统监视工具有助于推动系统调优工作,使得关键的性能瓶颈得到极大减少或消除;另一些情况下,这些工具只是准确识别出为了改进工作负荷整体性能和吞吐率,有哪些应用或进程需要调优、重新配置,或者在极端情况下进行算法修改。

本章将着重分析许多可以为下列内容提供有用信息的工具:

  • 整体系统CPU利用率。
  • 内存利用率。
  • 磁盘I/O的利用率和延迟。
  • 网络利用率。

1、CPU利用率

在对系统的方法化分析中,首要且最基本的工具之一常常是对系统的CPU利用率进行简单测量。Linux以及大多数基于UNIX的操作系统都提供了一条命令来显示系统的平均负荷(load average)。

$ uptime
17:37:30 up 3 days, 17:06,  7 users,  load average: 1.13, 1.23, 1.15

具体地讲,平均负荷值代表了在1min、5min和15min内可以运行的任务平均数量。可运行的任务包括当前正在运行的任务以及虽然可以运行但正在等待某个处理器空闲的任务。本例中的系统只有一个CPU,它可以通过查看/proc/cpu的内容来确定。

$ cat /proc/cpu
processor               : 0
vendor_id               : GenuineIntel
cpu family              : 6
model                        : 8
model name                  : Pentium III (Coppermine)
stepping                 : 6
cpu MHz                  : 647.195
cache size              : 256 KB
fdiv_bug             : no
hlt_bug          : no
f00f_bug         : no
coma_bug         : no
fpu              : yes
fpu_exception   : yes
cpuid level     : 2
wp               : yes
flags            : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 mmx fxsr sse
bogomips         : 1291.05

在本例中,对于单处理器只存在一项,因此平均情况下,处理器要执行的工作会稍多于它的处理能力。在较高层次上,这意味着机器需要执行的工作多于它的处理能力。

注意:若在双CPU的机器上uptime命令显示的负荷平均值小于2.00的话,这表明处理器仍拥有额外的空闲周期。在4个CPU的机器上如果负荷平均值小于4.00的话也表明同样的情况,如此等等。然而,负荷平均值单独并不能说明全部问题。

为了更深入地探究处理器的使用情况,下面介绍的3种工具可以提供许多关于CPU利用情况的不同理解:vmstat、iostat和top。这些工具各自关注系统监视的不同方面,但都可获得关于处理器当前使用情况的不同视图。

vmstat

vmstat是一个实时性能监视工具。该工具提供了有助于发现系统异常活动的数据,例如会降低系统性能的过多页面错误或上下文切换次数。这些数据的显示频率可由用户指定。vmstat输出样本如下所示:

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r   b   swpd  free   buff  cache   si   so    bi    bo   in    cs  us sy id wa
18  8    0 5626196   3008 122788    0    0 330403   454 2575  4090 91  8  1  0
18 15    0 5625132   3008 122828    0    0 328767   322 2544  4264 91  8  0  0
17 12    0 5622004   3008 122828    0    0 327956   130 2406  3998 92  8  0  0
22  2    0 5621644   3008 122828    0    0 327892   689 2445  4077 92  8  0  0
23  5    0 5621616   3008 122868    0    0 323171   407 2339  4037 92  8  1  0
21 14    0 5621868   3008 122868    0    0 323663    23 2418  4160 91  9  0  0
22 10    0 5625216   3008 122868    0    0 328828   153 2934  4518 90  9  1  0

vmstat提供以下信息:

  • procs部分提供了在生成报告时正在运行的进程数目(r)以及被阻塞的进程数目(b)。可以利用这些信息来检查运行中以及阻塞进程的数目是否与预期值相符。如果与预期不符的话,可以检查:应用和内核的参数、系统调度器和I/O调度器、进程在可用处理器之间的分布等。
  • memory部分提供了换出内存(swpd)、空闲内存(free)、I/O数据结构的缓冲区缓存(buff),以及从磁盘读取文件的内存缓存(cache)的容量,单位为KB。swpd的取值反映了kswapd的活动情况。
  • swap部分提供了从磁盘上换入的内存容量(si)以及换出到磁盘上的内存量(so),单位为KB/s。so反映了当数据被换出至交换区时kswapd的活动情况,而si则反映了当页面被换回到物理内存时发生页面错误的情况。
  • io部分提供了从设备读入的块数(bi)以及写出到设备上的块数(bo),单位为KB/s。当运行I/O密集的应用时,应特别注意这两个部分的值。
  • system部分提供了每秒的中断数目(in)和上下文切换数目(cs)。
  • cpu部分提供了用户(us)、系统(sy)、真正空闲(id)以及等待I/O完成(wa)在CPU总时间中所占的百分比。CPU利用率也许是最常用的量度。若wa值过大,则应该检查I/O子系统,例如,可以断定需要更多的I/O控制器和磁盘以便减少I/O等待时间。

对于I/O活动密集的工作负荷,可以通过监视bi和bo来获取传输速率,监视in来获取中断速率。通过监视swpd、si和so可以查看系统是否正在进行交换活动。如果发生交换,则可以检查交换速率。最常见的量度或许是CPU利用率以及对us、sy、id和wa的监视。若wa取值很大,就需要检查I/O子系统。可能会得出结论:需要添加更多的I/O控制器和磁盘以减少I/O等待时间。

与uptime类似,如果在没有选项的情况下运行vmstat工具,会提供系统的单个快照。如果运行uptime之后再执行vmstat,则可以获得关于系统繁忙程度的快照以及关于处理器针对用户、系统、空闲以及等待I/O 的时间百分比。另外,vmstat还对可运行进程的数目加以即时计数。注意uptime提供了可运行进程数目在3个时间范围(1min、5min和15min)内的另一种视图。因此,如果uptime给出的平均负荷值在任何时间范围内都大于1,则vmstat报告的可运行任务数量也应该接近1。

vmstat能够以重复的时间间隔定期提供信息,因此可通过以下命令获得动态的系统视图。

$ vmstat 5 10

上述命令的含义是每5s输出vmstat信息,共执行10次。另外,若根据uptime的输出结果,平均负荷值在过去的1/5/10min内一直为1,则该命令的输出结果通常应该在每个输出行均显示一项可运行的任务。在vmstat的输出信息中出现峰值为5、7甚至20的情况并不奇怪。因为负荷平均值是一种计算平均值而不是即时快照。这两个视图对于系统性能分析工作而言各自有其优点。

在另一个场景中,假定负荷平均值超过1,甚至可能比已建立的基线平均高出一个百分点。另外,vmstat显示总有一两个进程是可运行的,但在一段扩展的时间范围内用户时间的百分比将近100%。可能需要其他工具例如ps(1)或top(1)来发现有哪个或哪些进程正在占用着100%的CPU时间。ps(1)提供了所有当前存在的进程列表,或基于命令选项给出选定的进程子集。top(1)(或gtop(1))为最活跃的进程提供了持续更新的视图,其中最活跃的进程可定义为当前占用CPU时间最多的进程。这些数据可能有助于识别出在系统中没有执行有效工作的失控进程。如果vmstat(1)已报告这些进程主要在用户空间中运行,则系统管理员可能希望将调试器(例如gdb(1))连接至该进程,并使用断点、跟踪执行或其他调试方法来理解该应用当前执行的工作。如果vmstat已报告大部分时间都作为“系统”时间而消耗,则可以使用其他工具例如strace(1)来确定正在执行哪些系统调用;若vmstat(1)报告指出相当大比例的时间都用于等待I/O操作完成,则可以使用sar(1)等工具来查看正在使用中的设备,并可能提供一些诸如哪些应用或文件系统处于使用中、系统是否正在执行交换或页面调度等信息。

vmstat(1)给出了一些关于系统当前状态的简单信息。本节主要讨论与CPU利用率有关的内容。但vmstat(1)也提供了关于内存利用情况、基本的交换活动以及I/O活动等信息。本章后面各节详细分析这些内容。

top与gtop工具

top和gtop工具非常有助于对导致生成vmstat或uptime所显示的高层信息的任务和进程加以理解。它们可以显示哪些进程是活跃的以及哪些进程消耗的处理时间或内存最多。

top命令对于所有正在运行的进程和系统载荷提供不断更新的概览信息,包括CPU负荷、内存使用以及每个进程的内存使用情况,具体如下面的快照内容所述。注意top也提供了负荷平均值的快照,这非常类似于uptime(1)的做法;然而,top也提供了关于已被创建但当前正在休眠的进程数量以及正在运行的进程数量的分类汇总信息。“休眠”任务是那些处于被阻塞并等待某项活动的任务,例如用户对键盘的一次按键、来自管道或socket的数据、来自另一台主机(例如,等待别人发出内容请求的Web服务器)的请求等。top(1)还单独显示了每个处理器的负荷平均值,这有助于识别在调度任务过程中的任何不均衡性。默认状态下,top的输出被经常地刷新,且把任务基于CPU占用时间的百分比排序。当然也可能存在着其他排序选项,例如CPU累加消耗量或者内存消耗百分比。

4:52pm  up  5:08,  3 users,  load average: 2.77, 5.81, 3.15
37 processes: 36 sleeping, 1 running, 0 zombie, 0 stopped
CPU0 states:  5.1% user, 53.1% system,  0.0% nice, 41.1% idle
CPU1 states:  5.0% user, 52.4% system,  0.0% nice, 41.4% idle
Mem:   511480K av,   43036K used,  468444K free,       0K shrd,    2196K
Swap:  263992K av,       0K used,  263992K free                 21432K

  PID USER   PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM  TIME COMMAND
 1026 root    2   0   488  488   372  S    1.1  0.0   0:00 chat_s
 7490 root   11   0  1012 1012   816  R    0.5  0.1   0:00 top
    3 root   19  19     0    0     0  SWN  0.3  0.0   0:00 ksoftirqd_C
    4 root   19  19     0    0     0  SWN  0.1  0.0   0:00 ksoftirqd_C
    1 root    9   0   536  536   468  S    0.0  0.1   0:04 init
    2 root    9   0     0    0     0  SW   0.0  0.0   0:00 keventd
    5 root    9   0     0    0     0  SW   0.0  0.0   0:00 kswapd
    6 root    9   0     0    0     0  SW   0.0  0.0   0:00 bdflush
    7 root    9   0     0    0     0  SW   0.0  0.0   0:00 kupdated
    9 root    9   0     0    0     0  SW   0.0  0.0   0:00 scsi_eh_0
   10 root    9   0     0    0     0  SW   0.0  0.0   0:00 khubd
  331 root    9   0   844  844   712  S    0.0  0.1   0:00 syslogd
  341 root    9   0  1236 1236   464  S    0.0  0.2   0:00 klogd
  356 rpc     9   0   628  628   536  S    0.0  0.1   0:00 portmap

 top的输出结果中包括以下信息。

  • 第1行显示系统正常运行时间,包括当前时间、系统自从上次重启后已运行的时间长度、当前用户数量,以及3个用于表示在先前的1min、5min和15min内准备运行的平均处理器数目的平均负荷值。
  • 第2行给出进程的统计信息,包括在top输出结果的上次更新之际正在运行的进程总数。这一行还显示睡眠中的进程、运行中的进程、僵尸进程以及已停止进程的数目。
  • 第3行和第4行显示各个CPU的统计信息,包括用户进程、系统进程、niced进程以及空闲进程所占用的CPU时间百分比。
  • 第5行提供了内存统计信息,包括内存总量、已用内存量、空闲内存量、不同进程共享的内存量,以及用作缓冲区的内存量。
  • 第6行显示了虚存或交换活动的统计信息,包括交换空间总量、已用的交换空间大小、空闲的交换空间大小以及缓存的交换空间大小。

其余各行显示了具体进程的统计信息。一些更有用的top参数如下所示:

  • d  输出数据的更新延迟。
  • p  只显示指定进程的信息。最多可指定20个进程。
  • S  显示进程及其子进程所占用时间的汇总信息,还给出进程的停工时间。
  • I  不报告空闲进程的信息。
  • H  显示进程的所有线程信息。
  • N  生成报告的次数。

top还提供了一种动态模式修改所报告的信息。按下F键可以激活动态模式。再按下J键,就可以添加一个新列来显示某个当前执行的进程最近使用的CPU时间。这种额外信息对于理解SMP系统中的进程特别有用。

sar

sar是sysstat工具包的组成部分。它收集并报告操作系统中广泛的系统活动,包括CPU利用率、上下文切换和中断速率、页换入和页换出速率、共享内存使用情况、缓冲区使用情况以及网络使用情况。sar(1)工具很有用,它不断地收集系统活动信息并将其记录到一组日志文件中,从而有可能在报告性能衰退事件之前以及在该事件之后评估性能问题。sar常常用于确定事件的时间,也可用于标识特定的系统行为变化。sar可以使用更短的时间间隔或固定数目的时间间隔来输出信息,这非常类似于vmstat。基于数量和时间间隔参数的取值,sar工具以指定的时间间隔(以秒为单位)执行指定次数的信息输出操作。另外,sar可以为所收集的许多数据点提供平均信息。以下示例提供了某个4路SMP系统的统计信息,并每隔5s采集一次数据。

1. CPU利用率

11:09:13   CPU  %user  %nice  %system %iowait  %idle
11:09:18   all   0.00   0.00     4.70   52.45  42.85
11:09:18     0   0.00   0.00     5.80   57.00  37.20
11:09:18     1   0.00   0.00     4.80   49.40  45.80
11:09:18     2   0.00   0.00     6.00   62.20  31.80
11:09:18     3   0.00   0.00     2.40   41.12  56.49
11:09:23   all   0.00   0.00     3.75   47.30  48.95
11:09:23     0   0.00   0.00     5.39   37.33  57.29
11:09:23     1   0.00   0.00     2.80   41.80  55.40
11:09:23     2   0.00   0.00     5.40   41.60  53.00
11:09:23     3   0.00   0.00     1.40   68.60  30.00
. . .
Average:   all   0.00   0.00     4.22   16.40  79.38
Average:     0   0.00   0.00     8.32   24.33  67.35
Average:     1   0.00   0.00     2.12   14.35  83.53
Average:     2   0.01   0.00     4.16   12.07  83.76
Average:     3   0.00   0.00     2.29   14.85  82.86

网络和磁盘服务进程是耗用CPU的系统组件之一。当操作系统生成I/O活动时,相应的设备子系统会作出响应,并使用硬件中断信号来指示I/O请求已完成。操作系统对这些中断进行计数。输出结果有助于可视化呈现网络和磁盘I/O活动的速率。sar(1)提供了这种输入。利用性能基线也许可以对系统中断速率进行跟踪,这将是操作系统开销的另一个来源或者系统性能潜在变化的指示器。“-I SUM”选项可以生成如下信息,包括每秒的中断总次数。“-I ALL”选项可以为每个中断源提供类似信息(未显示)。

2. 中断速率

10:53:53         INTR    intr/s
10:53:58          sum   4477.60
10:54:03          sum   6422.80
10:54:08          sum   6407.20
10:54:13          sum   6111.40
10:54:18          sum   6095.40
10:54:23          sum   6104.81
10:54:28          sum   6149.80
. . .
Average:          sum   4416.53

在SMP机器上,可以通过sar -A命令获得基于CPU的中断分布视图(以下示例摘录自完整的输出结果)。注意系统的IRQ取值为0、1、2、9、12、14、17、18、21、23、24和25。由于页宽度的限制,中断9、12、14和17的信息已省略显示。

3. 中断分布

10:53:53  CPU  i000/s i001/s i002/s ... i018/s  i021/s i023/s i024/s  i025/s
10:53:58    0 1000.20   0.00   0.00 ...  0.40    0.00    0.00   3.00    0.00
10:53:58    1    0.00   0.00   0.00 ...  0.00    0.00    0.00   0.00 2320.00
10:53:58    2    0.00   0.00   0.00 ...  0.00 1156.00    0.00   0.00    0.00
10:53:58    3    0.00   0.00   0.00 ...  0.00    0.00    0.00   0.00    0.00
Average:    0  999.94   0.00   0.00 ...  1.20  590.99    0.00   3.73    0.00
Average:    1    0.00   0.00   0.00 ...  0.00    0.00    0.00   0.00  926.61
Average:    2    0.00   0.00   0.00 ...  0.00  466.51    0.00   0.00 1427.48
Average:    3    0.00   0.00   0.00 ...  0.00    0.00    0.00   0.00    0.00

对中断分布的研究可能揭示出中断处理机制中的不平衡性。下一步需要对调度器进行分析。解决该问题的一种方法是通过为特定设备的中断(或IRQ)设置与某个特定CPU或一组CPU相关的亲合度,将IRQ处理绑定到特定的某个处理器或许多处理器上。例如,如果0x0001被回显到/proc/irq/ID(其中ID对应于一个设备),则只有CPU 0才处理该设备的IRQ;如果0x000f被回显到/proc/irq/ID,则CPU 0~CPU 3将负责处理该设备的IRQ。对于某些工作负荷而言,这种技术可以减少在繁重使用的特定处理器上发生的竞争现象。这项技术可以更高效地处理I/O中断,从而相应地提高I/O性能。

2、内存利用率

工作负荷有可能会耗尽所有可用的内存。Linux提供了对物理内存进行合理、高效的访问并可以访问潜在的海量虚存的技术。虚存通常稍多于操作系统实际拥有的内存容量,以便将较少使用的数据卸载到磁盘存储器上,同时又呈现出系统拥有大量物理内存的假象。糟糕的是,卸载内存的开销可能会比应用延迟高出数十甚至上百倍。如果被换出到磁盘上的内存空间是错误的内存页,或者如果应用程序的当前内存印迹大于物理内存容量的话,那么这些过高的延迟会极大地影响应用的响应时间。

许多性能问题都是由于内存不足而引起操作系统的交换。因此,有必要利用一些工具来监视内存的使用情况,例如,每个进程或线程的内核内存占用量,以及内核数据结构的内存使用机制及其数量和大小。与CPU利用情况一样,理解操作系统和各个进程的行为对于跟踪内存短缺所引起的任何性能问题至关重要。

/proc/meminfo与/proc/slabinfo

Linux 在/proc文件系统中提供了可以监视系统内存资源整体利用情况的工具,即/proc/meminfo和/proc/slabinfo。这两个文件可以捕获物理内存的状态。/proc/meminfo的部分显示结果如下所示。

MemTotal:      8282420 kB
MemFree:       7942396 kB
Buffers:         46992 kB
Cached:         191936 kB
SwapCached:          0 kB
HighTotal:     7470784 kB
HighFree:      7232384 kB
LowTotal:       811636 kB
LowFree:        710012 kB
SwapTotal:      618492 kB
SwapFree:       618492 kB
Mapped:          36008 kB
Slab:            36652 kB

参数如下所示:

  • MemTotal显示了物理内存总量,而MemFree显示了未用内存的总量。
  • Buffers对应于I/O操作的缓冲区cache,Cached表示从磁盘上读取文件时所用的内存大小。
  • SwapCached表示已被换出到交换空间中的内存缓存大小。
  • SwapTotal表示用于交换用途的磁盘内存大小。如果基于IA32的系统拥有1GB以上的物理内存,则HighTotal为非零值。
  • HighTotal对应高于860MB的物理内存。
  • LowTotal是内核使用的内存。Mapped对应于被内存映射的文件大小。
  • Slab表示为内核数据结构分配的内存。通过定期捕获/proc/meminfo文件的信息,可以建立起内存使用的模式。在简单脚本和图形工具的帮助下,还能够对该模式加以可视化地展现。

要理解内核内存使用情况,可以查看/proc/slabinfo文件。其部分显示结果如下所示。

  • tcp_bind_bucket       56    224       32    2    2    1
  • tcp_open_request      16     58       64    1    1    1
  • inet_peer_cache          0      0        64    0    0    1
  • secpath_cache            0      0     32    0    0    1
  • flow_cache                0      0     64    0    0    1

第1列显示出内核数据结构的名称。更具体地,总共存在着224个tcp_bind_bucket对象,其中有56个是活跃的。每个数据结构占用32B。存在着两个页面至少拥有一个活跃对象,总共存在着两个已分配页面。另外,对于每个slab结构都分配一个页面。这些信息突出强调了值得更多关注的特定数据结构,例如数量或长度取值更大的数据结构。因此,通过一起捕获meminfo和slabinfo信息,能够理解操作系统中哪些组件当前消耗的内存最多。如果LowFree或HighFree的取值相对较小(或小于平常值),可能表明操作系统中存在着比平时更多的内存请求,这可能导致整体性能或应用响应速度的降低。

ps

要获知特定进程中的内存使用情况,可以使用ps工具来获取每个进程的内存占用情况。

$ ps aux
USER PID %CPU %MEM   VSZ  RSS TTY STAT START TIME COMMAND
root   1  0.0  0.0  1528  528 ?   S    15:24 0:00 init [2]
root   2  0.0  0.0     0    0 ?   SN   15:24 0:00 [ksoftirqd/0]
root   3  0.0  0.0     0    0 ?   S<   15:24 0:00 [events/0]
root   4  0.0  0.0     0    0 ?   S<   15:24 0:00 [khelper]
root   5  0.0  0.0     0    0 ?   S<   15:24 0:00 [kacpid]
root  48  0.0  0.0     0    0 ?   S<   15:24 0:00 [kblockd/0]
root  63  0.0  0.0     0    0 ?   S    15:24 0:00 [pdflush]
root  64  0.0  0.0     0    0 ?   S    15:24 0:00 [pdflush

ps aux的输出结果显示了每个进程消耗系统内存的总体百分比,以及该进程的虚存印迹(VSZ)和当前使用的物理内存量(RSS)。也可以使用top(1)通过交互方式对进程列表进行排序,以便查看哪些进程当前消耗的内存最多,以及内存使用情况如何随着系统的运行而变化。

当标识出需要关注的进程后,可以查看这些进程的虚址空间布局,从而获知进程当前使用内存的具体分配情况。/proc/pid/maps包含了进程地址空间的所有映射及其大小,其中pid是通过ps(1)或top(1)命令获得的特定进程ID。每个映射显示了被分配的地址范围、页面的许可权限,以及与该地址范围相关的后备存储器(backing store)(如果存在的话)的位置。/proc/pid/maps本质上并不是一种性能工具;然而,它提供了关于内存分配状况的信息。例如,出于性能分析的目的,可以确认在虚址空间中的1GB和2GB之间是否分配了特定数量的共享内存。可以根据前述的映射图来检查其使用情况。

以下是关于进程ID 3162的输出结果。

$ cat /proc/3162/maps
08048000-08056000 r-xp 00000000 03:05 33015  /usr/lib/gnome-applets/battstat-applet-2
08056000-08058000 rw-p 0000d000 03:05 33015  /usr/lib/gnome-applets/battstat-applet-2
08058000-08163000 rw-p 08058000 00:00 0
40000000-40016000 r-xp 00000000 03:02 40006   /lib/ld-2.3.2.so
40016000-40017000 rw-p 00015000 03:02 40006   /lib/ld-2.3.2.so
40017000-40018000 rw-p 40017000 00:00 0
40018000-4001a000 r-xp 00000000 03:05 578493  /usr/X11R6/lib/X11/locale/lib/common/xlcDef.so.2
4001a000-4001b000 rw-p 00001000 03:05 578493  /usr/X11R6/lib/X11/locale/lib/common/xlcDef.so.2
4001b000-4001d000 r-xp 00000000 03:05 128867  /usr/lib/gconv/ISO8859-1.so
4001d000-4001e000 rw-p 00001000 03:05 128867  /usr/lib/gconv/ISO8859-1.so
4001f000-40023000 r-xp 00000000 03:05 514375  /usr/lib/gtk-2.0/2.4.0/loaders/libpixbufloader-png.so
40023000-40024000 rw-p 00003000 03:05 514375  /usr/lib/gtk-2.0/2.4.0/loaders/libpixbufloader-png.so
40025000-40031000 r-xp 00000000 03:05 337881   /usr/lib/libpanel-applet-2.so.0.0.19
40031000-40032000 rw-p 0000c000 03:05 337881   /usr/lib/libpanel-applet-2.so.0.0.19
40032000-400d2000 r-xp 00000000 03:05 337625   /usr/lib/libgnomeui-2.so.0.600.1
400d2000-400d6000 rw-p 0009f000 03:05 337625   /usr/lib/libgnomeui-2.so.0.600.1
400d6000-400d7000 rw-p 400d6000 00:00 0
400d7000-400df000 r-xp 00000000 03:05 53       /usr/X11R6/lib/libSM.so.6.0
400df000-400e0000 rw-p 00007000 03:05 53       /usr/X11R6/lib/libSM.so.6.0
400e0000-400f4000 r-xp 00000000 03:05 51       /usr/X11R6/lib/libICE.so.6.3
400f4000-400f5000 rw-p 00013000 03:05 51       /usr/X11R6/lib/libICE.so.6.3

vmstat

前面“CPU利用率”一节中介绍过vmstat,vmstat的主要目的是监视内存可用性和交换活动,还可以提供I/O活动的概况。vmstat可协助发现异常的系统活动,例如会导致操作系统性能下降的过多的页面错误或上下文切换操作。vmstat的输出样本如下所示。

procs ---------memory-------- ---swap-- -----io---- --system-- ----cpu-----
r   b   swpd   free   buff  cache  si   so    bi    bo  in    cs us sy id wa
18  8      0 5626196   3008 122788  0   0  330403  454 2575  4090 91  8  1  0
18 15      0 5625132   3008 122828  0   0  328767  322 2544  4264 91  8  0  0
17 12      0 5622004   3008 122828  0   0  327956  130 2406  3998 92  8  0  0
22  2      0 5621644   3008 122828  0   0  327892  689 2445  4077 92  8  0  0
23  5      0 5621616   3008 122868  0   0  323171  407 2339  4037 92  8  1  0
21 14      0 5621868   3008 122868  0   0  323663   23 2418  4160 91  9  0  0
22 10      0 5625216   3008 122868  0   0  328828  153 2934  4518 90  9  1  0

Vmstat可以报告以下与内存相关的数据:

  • memory部分的单位为KB,显示被换出内存容量(swpd)、空闲内存容量(free)、I/O数据结构的缓冲区缓存容量(buff),以及从磁盘读取文件时所用的内存缓存容量(cache)。
  • swap部分显示从磁盘上换入的内存量(si)以及换出到磁盘上的内存量(so),单位为KB/s。
  • io部分显示从设备上读入的块数(bi)以及写出到设备上的块数(bo),单位为KB/s。

对于I/O操作密集的工作负荷,可以监视bi和bo来获取传输速率,监视in来获取中断速率。可以通过监视swpd、si和so来查看操作系统是否正在执行交换活动,还可以再检查交换速率。最常见的量度也许是CPU利用率以及对us、sy、id和wa的监视。如果wa取值很大,则需要检查I/O子系统,结论有可能是需要更多的I/O控制器和磁盘以便减少I/O等待时间。

3、I/O利用率

尽管整体的处理器速度、内存大小以及I/O执行速度在不断提高,但I/O操作的吞吐率和延迟性能仍然要比等价的内存访问操作低多个数量级。另外,由于许多工作负荷都拥有重要的I/O组件,I/O处理很容易成为整体吞吐率和应用整体响应时间的重要瓶颈。针对I/O操作密集的应用,性能分析人员必须通过工具来获取关于I/O子系统操作的信息。

磁盘I/O的性能经常基于吞吐率和延迟来评估。磁盘驱动器对大型顺序传输的处理常常远优于小型随机传输操作。对大型顺序传输操作可以进行优化例如预读技术或延迟写技术,存储系统还能够尽量减少磁头移动并执行全磁道写操作。然而,许多应用都需要访问存储介质中位于毫无关联且经常难以预测的地址上的数据。因此,各种工作负荷的I/O模式常常是顺序I/O和随机I/O的混合体,并且执行各种尺寸的块传输操作。

要理解软件瓶颈及相关的性能影响,在两个主要因素需要考虑,即各种具体I/O请求的整体I/O吞吐率和延迟。理想情况下,系统希望对读写介质的数据传输率加以优化。但是,由于单个请求的延迟与处理器速度相比是极长的时间,应用实质上会等待I/O处理。例如,假定某个应用读取一块数据,其中提供了关于如何访问下一块数据的信息,等等。如果系统或应用无法对这种模式进行优化,则性能被限制为I/O子系统的组合延迟。该问题的一种通用解决方案是同时执行许多与此类似的操作。多任务处理,即大量任务并行运行的能力,允许应用或操作系统同时调度许多高延迟的I/O请求,即使当每个应用可能花费大量时间阻塞在单个请求上。结果,I/O子系统的整体效率或者I/O总吞吐率可能会接近底层I/O子系统的能力。另外,尽管对系统整体吞吐率加以优化始终是操作系统和具体应用的目标,但以终端用户响应时间为代价来达成该目标通常是不可接受的权衡抉择。

数据传输请求的输入模式会对下层I/O子系统的延迟产生严重影响。例如,若磁盘I/O请求交替地访问位于磁盘介质起始处和结束处的一个I/O块,则磁盘臂可能需要进行相对缓慢的调整以便将磁头定位到选定的磁盘块上。这种类型的访问显然会减慢对给定设备的所有访问,从而会减少在一段时间内可以完成的I/O操作次数。另外,这种异常的访问模式有可能不只是减少每个逻辑驱动器的设备数目,而且还会降低整体的I/O传输速率。

多任务处理的另一种解决方案是确保来自应用和操作系统的数据请求能够很好地分布于系统上的磁盘上。将I/O请求分布到多个磁盘上会对并行度产生影响,而并行性可以进一步减少磁盘驱动器延迟的性能影响。将应用数据重新分布到大量磁盘设备常常需要深入理解工作负荷以及该工作负荷的数据访问模式。

尽管系统监视工具并不提供对特定应用执行的所有I/O操作都进行跟踪的能力,但有些性能监视工具允许性能分析人员监视系统处理的I/O操作总数、每个逻辑磁盘驱动器的I/O操作数目,以及整体的I/O传输率。下面几节主要讨论iostat(1)和sar(1)两种工具。可以使用这些性能监视工具来理解I/O瓶颈位于何处、哪些磁盘或互连结构未被充分利用,以及从系统角度来显示的延迟大小(相对于应用的角度)。

在分析特定工具之前,应记住存在着许多可以提高I/O性能的技术。这些技术包括纯硬件相关的解决方案(例如使用每分钟具有更高转速的磁盘驱动器,从而提供了更低的I/O延迟、更大的磁盘cache容量或I/O控制器cache容量)。这些技术也包括改进读写操作的数据传输率,以及提高I/O总线速度或I/O互连结构的速度,这两者都可以提高数据传输率并减少I/O延迟。一些磁盘驱动器和磁盘存储子系统还提供了多端口的逻辑或物理磁盘,从而允许单个磁盘发出的并行I/O操作,这也提高了潜在的I/O吞吐率。另外,硬件和软件RAID(Redundant Array of Independent Disks)被设计为通过在多个磁盘驱动器上对数据进行分条处理来提高访问并行性。

下面讨论的工具可以提供有助于设计软硬件解决方案以及数据布局改进的数据。

iostat

iostat命令监视系统的I/O活动,检查物理磁盘就平均传输率而言处于活跃状态之中的时间长度。该命令生成的报告可用于修改系统配置以便更好地平衡物理磁盘之间的I/O负荷。iostat(1)还提供了有助于直接与I/O活动进行比较的CPU利用率。如果对显示时间间隔未作规定的话,则iostat显示系统自从上次启动以来的I/O信息;否则,第一组输出显示系统自从启动以来的全部活动信息,而后续的输出内容只显示活动变化信息。以下显示信息对应于将文件从/dev/sdo7复制到/dev/sds7,从/dev/sdp7复制到/dev/sdt7,从/dev/sdr7复制到/dev/sdu7的操作执行结果。

avg-cpu:  %user   %nice    %sys %iowait   %idle
          0.21    0.00    0.80    2.07   96.92

Device:  tps Blk_read/s Blk_wrtn/s   Blk_read   Blk_wrtn
sdx     0.00       0.00      0.00         32          0
sdw     0.00       0.00      0.00         32          0
sdv     0.00       0.00      0.00         32          0
sdu     2.49       0.05   1443.46       2778   79552392
sdt     4.94       0.10   2871.73       5322    158268008
sds     4.95       0.10   2860.91       5330    157671720
sdr    30.20    1518.55      0.42   83690898      23288
sdq    60.25    2902.76      0.92  159978258      50896
sdp     0.00       0.01      0.00        378         24
sdo    59.49    2883.87      0.90  158937034      49520

iostat报告的CPU利用信息类似于top工具所提供的内容。它将CPU时间划分成用户、nice、系统、I/O等待以及系统空闲等5个部分,之后给出磁盘利用情况的报告。磁头信息后跟随着多行磁盘统计信息,其中每行报告一个已配置的逻辑磁盘的活动情况。tps列表示发至逻辑磁盘的I/O请求数,但没有给出I/O请求的大小。Blk_read/s和Blk_wrtn/s表示读写该逻辑驱动器的数据量,以每秒的块数为单位,但也未给出块大小设置。Blk_read和Blk_wrtn分别对应于读写该逻辑驱动器的数据量,以每秒的块数为单位,但没有指定块大小。

选项-k以千字节为单位显示统计数据,选项-p可以获取每个分区的统计数据,选项-x可以获得诸如平均等待时间和平均服务时间等信息。在这些取值中,当数据从sdo7被复制到sds7时,sdo的Blk_read数非常接近于sds的Blk_wrtn数。另外,读速率稍高于写速率。这个报告可以突出显示磁盘I/O瓶颈(如果存在的话),并有助于数据库设计人员为获取更高的访问并行性而对数据进行布局。

sar

sysstat软件包中包含sar工具。sar收集并报告操作系统中的大量系统活动,包括I/O操作、CPU利用情况、上下文切换和中断速率、页换入和页换出的速率,以及共享内存、缓冲区和网络的使用情况。基于数量和时间间隔参数的取值,sar在以秒为单位的指定时间间隔内执行指定次数的输出信息操作。例如命令sar -b 3 12表示每隔3s报告磁盘使用情况,总共运行12秒。另外,在数据采集结束后,给出了统计平均数据。sar是一个具有丰富选项的工具。本节其余部分将讨论该工具的几个特性。

sar显示I/O统计数据的方式类似于iostat,可以提供I/O操作的总次数(tps),并将其进一步分为读操作(rtps)和写操作(wtps);还给出读写操作速率(bread/s和bwrtn/s)。以下数据每隔2s采集一次,总共运行18s。在数据采集结束后,计算出这5个域的平均值,但并未给出具体逻辑驱动器的操作。

12:59:15       tps     rtps     wtps   bread/s   bwrtn/s
12:59:17     37.50    37.50     0.00        396.00      0.00
12:59:19     66.50    66.50     0.00  16140.00      0.00
12:59:21    268.50   268.50     0.00 66560.00      0.00
12:59:23    333.50   261.50    72.00  64548.00   9620.00
12:59:25    153.50    40.50   113.00   9728.00  27984.00
12:59:27    133.00     5.00   128.00   1024.00  31744.00
12:59:29    119.50     7.50   112.00   1536.00  27776.00
12:59:31    133.00     5.00   128.00   1024.00  31744.00

Average:    155.63    86.50    69.13  20119.50  16108.50

sar提供了关于单个处理器以及整个系统的CPU利用率数据。这个特性在多处理器环境中尤其有用。如果某些处理器执行的工作多于其他处理器,则显示结果会清楚地表明这一点。然后就可以检查处理器的这种使用不均衡性是来自应用还是来自内核调度器。以下数据每隔5s从一个4路的SMP系统采集获得。

11:09:13   CPU  %user  %nice   %system   %iowait  %idle
11:09:18   all   0.00   0.00      4.70     52.45  42.85
11:09:18     0   0.00   0.00      5.80     57.00  37.20
11:09:18     1   0.00   0.00      4.80     49.40  45.80
11:09:18     2   0.00   0.00      6.00     62.20  31.80
11:09:18     3   0.00   0.00      2.40     41.12  56.49
11:09:23   all   0.00   0.00      3.75     47.30  48.95
11:09:23     0   0.00   0.00      5.39     37.33  57.29
11:09:23     1   0.00   0.00      2.80     41.80  55.40
11:09:23     2   0.00   0.00      5.40     41.60  53.00
11:09:23     3   0.00   0.00      1.40     68.60  30.00
. . .
Average:   all   0.00   0.00      4.22     16.40  79.38
Average:     0   0.00   0.00      8.32     24.33  67.35
Average:     1   0.00   0.00      2.12     14.35  83.53
Average:     2   0.01   0.00      4.16     12.07  83.76
Average:     3   0.00   0.00      2.29     14.85  82.86

sar还提供了处理器的中断信息。

10:53:53  CPU  i000/s  i001/s  i002/s  i003/s  i004/s  i005/s  i006/s  i007/s
10:53:58    0 1000.20    0.00    0.00    0.40    0.00    0.00    3.00    0.00
10:53:58    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00 2320.00
10:53:58    2    0.00    0.00    0.00    0.00 1156.00    0.00    0.00    0.00
10:53:58    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

Average:    0  999.94    0.00    0.00    1.20  590.99    0.00    3.73    0.00
Average:    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00  926.61
Average:    2    0.00    0.00    0.00    0.00  466.51    0.00    0.00 1427.48
Average:    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

对中断分布的研究揭示了中断处理的不均衡性。解决这个问题的一种方法是将IRQ处理亲合到某个特定处理器或大量处理器上。例如,如果0x0001被回显至/proc/irq/ID(其中ID对应于某个设备),则只有CPU 0才处理该设备的IRQ。如果0x000f被回显至/proc/irq/ID,则CPU 0~CPU 3将被用于处理该设备的IRQ。对于某些工作负荷而言,这种技术可以减少在繁重使用的特定处理器上出现的竞争现象。该技术可以更高效地处理I/O中断,从而相应地提高I/O性能。

4、网络利用率

Linux不仅提供了其他主要操作系统也拥有的许多强大的网络能力,并且还通过引入伪装等额外特性而更胜一筹。Linux内核不但支持多种网络互连协议例如 TCP/IP、IPX (Internetwork Packet Exchange)和AppleTalk DDP等,还支持诸如报文转发、防火墙操作、代理、伪装(masquerading)、隧道以及别名(aliasing)等特性。

Linux中提供了许多有助于评估各种Linux网络性能的监视工具,其中一些监视工具也可用于解决网络问题以及监视性能。Linux内核为用户提供了大量的网络系统信息,这有助于监视网络的健康状态并检测在配置、运行期间以及性能方面出现的问题。

本节只分析在大多数Linux主要发行版本中提供的一些网络工具,包括netstat、nfsstat、tcpdump、ethtool、snmp、ifport、ifconfig、route、arp、ping、traceroute、host以及nslookup等。

系统和网络管理员每天都会使用其中的某些工具。诸如ping、route、arp、traceroute、ethtool及tcpdump之类的工具常用于判定网络问题。这些工具描述如下:

ping ipaddress/hostname命令可以显示计算机是否正在运行以及网络连接是否正常。该命令使用互联网控制消息协议(Internet Control Message Protocol,ICMP)中的Echo功能。该命令通过网络将一个小型报文发至指定的IP地址。如果可以收到该报文的应答消息,则表明这条计算机网络连接是存活的。该命令还可以显示出在源计算机和目的计算机之间存在着多少个中间跳数。

route命令可以显示路由表内容,在路由表中增删路由,以及清空所有的路由信息。

如果ping命令不起作用,即网络连接没有激活,那么可以使用arp命令来确定问题根源。该命令的-a选项可以确定硬件地址是否正确地关联到适当的系统上,其他可用的选项包括清空arp缓存、向arp缓存中添加信息等。

IRRTtoolset(Internet Routing Register toolset)提供了自动完成路由器配置、路由策略分析以及维护的工具,使得网络工程师能够更加便捷、有效地使用路由信息。

ifconfig可以确定主机的介质访问控制地址。如果网络上存在着另一台具有相同IP地址的主机,则该主机的介质访问控制地址可能已存在于本机的arp缓存中。在这种情况下,可以使用arp命令来删除缓存中保存的地址并将正确的地址添加到arp缓存中。

traceroute可以跟踪报文的某条路由路径。当报文在网络中传输时,该命令能够测量报文在每一跳(路由器)之间传输所用的时间,并标识出每一跳的地址。

ethtool可以查询并修改以太网设备的设置参数。每个设备都被分配一个标识编号,例如对于系统中的n个以太网设备,其编号为eth0、eth1…ethn。ethtool工具使用这种设备名称来查询/修改设置信息。

tcpdump对网络报文进行嗅探,能够捕获计算机在网络上可见的所有报文。该工具可用于网络监视、协议调试以及数据获取等功能。该命令将NIC设置为杂收(promiscuous)模式以便捕获所有流经物理线路的报文。该命令提供了大量关于输出结果的过滤选项,可以只显示需要关注的报文类型。但其缺点是缓冲区可能会发生溢出。在高带宽网络上执行tcpdump操作还有可能会丢弃报文,即tcpdump的处理速度无法匹配报文的传输速率。

ethereal是另一种类似于tcpdump的网络嗅探工具,可以读取tcpdump所捕获的文件。

host工具用于从域名系统(Domain Name System)中获取指定IP地址的主机名。该工具远比nslookup更灵活,并且适于在shell脚本中使用。

Linux上提供的网络安全工具包括snort(一种网络入侵检测系统)、dsniff(一套强大的网络审计和渗透测试工具)以及SAINT(Security Administrator's Integrated Network Tool)等。

网络统计信息

Net-tools软件包中提供的netstat工具可以显示大量与网络子系统相关的信息。

Netstat是监视Linux服务器上网络连接的最常用工具之一。该工具可以显示每种网络协议例如TCP和UDP的活跃socket列表,还提供了关于网络路由的信息以及网络接口的累积统计数据,包括输入输出报文数量以及报文冲突次数。随后的netstat输出信息显示了大量网络协议统计数据和路由信息,例如互联网协议(IP)、传输控制协议(TCP)和用户数据报协议(UDP)。基于这些统计信息,可以判定收到的报文数目是否高于或低于预期值。该工具可以方便地用于研究内核版本之间的性能差异。

如果没有任何参数的话,netstat可以枚举出已有的网络socket及其连接情况,并且能够显示所有协议系列(包括UNIX域套接字)的信息。以下是输出样本中的典型数据行。

$ netstat

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address     Foreign Address     State
tcp        0      0           *:32768              *:*                               LISTEN
tcp        0      0           *:smux               *:*                               LISTEN
tcp        0      0           *:9099               *:*                               LISTEN
tcp        0      0           *:sunrpc         *:*                               LISTEN
tcp        0      0           *:x11                 *:*                               LISTEN
tcp        0      0           *:http               *:*                               LISTEN
tcp        0      0           *:ftp                 *:*                               LISTEN
tcp        0      0           *:ssh                 *:*                               LISTEN
tcp        0      0           *:telnet         *:*                               LISTEN
tcp        0      0           nethostA:smtp    *:*                              LISTEN
tcp        0      0           nethostA:32974   nethostB:ssh            ESTABLISHED
tcp        0      0           nethostA:32996   nethostB:ssh            ESTABLISHED
tcp        0      0           nethostA:33002   64.233.161.99:http     ESTABLISHED
tcp        0      0           nethostA:33005   nethostB:ftp            ESTABLISHED
udp        0      0           *:32768              *:*
udp        0      0           *:snmp               *:*
udp        0      0           *:sunrpc         *:*

Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     2012     /dev/gpmctl
unix  2      [ ACC ]     STREAM     LISTENING     159792 /tmp/ksocket-nivedita/kdeinit-:0
unix  2      [ ACC ]     STREAM     LISTENING     2210   /tmp/.X11-unix/X0
unix  2      [ ACC ]     STREAM     LISTENING     79840  /tmp/.ICE-unix/dcop15789-1077867386

第1列显示了socket的协议系列,它通常是tcp(transport control protocol,传输控制协议)、udp(user datagram protocol,用户数据报协议)或unix(UNIX domain socket,UNIX域套接字);第2列和第3列显示了在socket接收和发送队列中当前存在的数据字节数;后面各列显示了本地和远程地址及端口信息;最后一列显示了socket当前的协议状态。

如果netstat命令未携带标志-n的话,则IP地址通常转换成主机名(nethostA、nethostB)。

如果只要显示特定地址系列的内容,可以在命令中提供相应的标志。例如, netstat –tcp或-t只显示当前的TCP socket。关于各个地址系列的完整标志列表参见netstat的man命令帮助。

星号(*)表示通配符,在指代本地地址时通常是监听所有本地接口的监听进程。当该socket向远程主机发起连接并进入已建立(established)状态时,会显示出远程主机地址和端口信息。在上述显示例子中可以看到当前存在的ssh、http和ftp连接。

接口信息

Netstat给出的接口信息与ifconfig命令所显示的内容相同。该信息是接口所提供的统计信息列表。这些信息包括最大传输单元(maximum transmission unit、MTU),以及接收和发送报文中传输成功的、通过某种方式出错的、丢弃的或溢出的报文数。

$ netstat -i

Kernel Interface table
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR   TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0   1500 0     21941      0     0      0   11998        0     0      0 BMRU
lo    16436 0       795      0     0      0     795         0     0      0 LRU

TCP/IP协议统计数据

Linux内核支持将RFC 2012中规定的统计计数器作为简单网络管理协议(Simple Network Management Protocol,SNMP)的管理信息库(Management Information Base,MIB)的组成部分。它还实现了大量与Linux相关并且捕获网络协议事件(主要是TCP)的计数器。

netstat工具显示了存在于内核中的大多数计数器,但并未涵盖全部计数器。要查看被计数事件的完整列表,可以浏览/proc/net/snmp和/proc/net/netstat文件的内容。前者包含了RFC 2012中定义的计数器,后者包含了与Linux相关的扩展MIB。以下是由netstat -s命令生成的SNMP计数器的样本列表。

$ netstat -s

Ip:
    662968 total packets received
    0 forwarded
    0 incoming packets discarded
    659592 incoming packets delivered
    162297 requests sent out
Tcp:
    5721 active connections openings
    39 passive connection openings
    0 failed connection attempts
    0 connection resets received
    1 connections established
    136759 segments received
    152791 segments send out
    20660 segments retransmited
    3 bad segments received.
    1165 resets sent
Udp:
    14031 packets received
    15 packets to unknown port received.
    0 packet receive errors
    7519 packets sent

另外,网络通信涉及到繁重的中断处理。因此,通过与netstat工具相结合,可以使用vmstat来捕获中断数目,使用sar来确定中断处理操作的散布情况。

nfsstat

网络文件系统(Network File System,NFS)可以将远程机器的文件系统与本地文件系统融合起来,即NFS使用与本地相同的读写接口来远程访问数据。nfsstat是一个打印NFS内核统计信息的简单工具,可打印出工作负荷中NFS的API调用数量。在以下示例中,服务器运行一个I/O工作负荷。来自nfsstat的输出信息显示的读写操作次数,可用于调试目的。也可根据读写操作的次数来进一步理解性能问题。

Server nfs v3:
null       getattr    setattr    lookup     access     readlink
0       0% 8       0% 0       0% 6          0% 43      0% 0       0%

read       write      create     mkdir      symlink    mknod
262242 44% 328004  55% 2       0% 0     0% 0       0% 0       0%

remove     rmdir      rename     link       readdir    readdirplus
3       0% 0       0% 0       0%   0           0% 0       0% 0      0%

fsstat     fsinfo     pathconf   commit
1       0% 1       0% 0       0% 2586    0%

参考:《Linux服务器性能调整》
作者: [美] SanderaK.John
出版社: 清华大学出版社


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值