跳至主要内容

LPIC-3 Exam 306.1 度量资源使用量(Measure resource usage)



LPIC-3 Exam 306.1 度量资源使用量(Measure resource usage)

EN: http://www.ibm.com/developerworks/linux/tutorials/l-lpic3306/section2.html
CN: http://www.ibm.com/developerworks/cn/education/linux/l-lpic3306/section2.html
著: Sean A. Walberg, Senior Network Engineer 网络工程师, 自由职业

================================================================================
306.1 度量资源使用量(Measure resource usage)
================================================================================
本节讨论 Senior Level Linux Professional(LPIC-3)考试 301 的 306.1 主题的内容。
这个主题的权值为 4。

在本节中,学习如何:

  * 度量CPU使用量(Measure CPU usage)
  * 度量内存使用量(Measure memory usage)
  * 度量磁盘I/O(Measure disk I/O)
  * 度量网络I/O(Measure network I/O)
  * 度量防火墙和路由吞吐量(Measure firewalling and routing throughput)
  * 映射客户机带宽使用量(Map client bandwidth usage)

计算机依赖于硬件资源:中央处理器(CPU)、内存、磁盘和网络。通过度量这些资源,可以了解
计算机目前的工作状态以及在哪些方面可能出现问题。观察这些度量值在一段时间(比如几个月)
内的变化,就可以获得一些有意义的历史信息。常常可以推断出这些指标未来的数值,这有助于
预测资源会在什么时候耗尽。还可以开发系统的数学模型,使用历史信息检验这个模型,这有助于
更精确地预测未来的使用量。

为了完成一个任务,服务器总是需要使用多种硬件资源。一个任务可能需要通过磁盘访问获取数据,
访问内存来存储数据,通过CPU处理数据。如果一种资源不足,性能就会受损。在从磁盘读取信息之前,
CPU无法处理信息;如果内存满了,就无法存储信息。这些概念是相互关联的。如果内存满了,操作系统
会把其他内存的内容交换到磁盘上。还会从内存中划分出缓冲区,缓冲区用来加快磁盘活动的速度。


(1) 理解资源

要想让度量发挥作用,就必须理解要度量的资源。
然后,就可以收集关于系统的有用信息:当前信息、历史信息或预测信息。


(1.1) CPU

计算机的 CPU 执行应用程序需要的所有计算,它会向磁盘和其他外设发出命令,并负责运行
操作系统内核。CPU 每次只运行一个任务,无论这个任务是运行内核还是应用程序。一种称为
中断的硬件信号可以中断当前任务。中断可以由外部事件触发,比如收到一个网络数据包;也
可以由内部事件触发,比如系统时钟(在 Linux 中称为 tick)。当发生中断时,当前运行的
进程暂停,并运行一个例程来决定系统下面应该做什么。

当当前运行的进程用完分配给它的时间时,内核可以使用一个称为上下文切换(context switch) 
的过程切换到另一个进程。在用完分配给进程的时间之前,如果它发出任何 I/O 命令(比如读取磁盘),
那么可以提前切换到另一个进程。CPU 的处理速度比磁盘快得多,所以在等待磁盘请求返回数据时,
CPU 可以运行其他任务。

在讨论Linux系统的CPU时,应该关注几个指标。第一个指标是CPU的空闲时间与工作时间之间的
百分比(实际上,CPU总是在做某些事情 — 所以,如果没有任务等待执行,就认为CPU是空闲的)。
当空闲百分比为零时,CPU的运行时间就达到最大。

CPU时间的非空闲部分划分为系统时间和用户时间:
  * 系统时间 是指花费在运行内核上的时间,
  * 用户时间是指用来执行用户所请求的工作的时间。

空闲时间划分为:
  * 内核由于无事可做而空闲的时间
  * 以及由于等待 I/O 而空闲的时间。

********************************************************************************
Linux中常用的监控CPU整体性能的工具有:(需要安装sysstat套件)
********************************************************************************
mpstat:mpstat 不但能查看所有CPU的平均信息,还能查看指定CPU的信息。
vmstat:只能查看所有CPU的平均信息;查看cpu队列信息;
iostat: 只能查看所有CPU的平均信息。
sar:   与mpstat一样,不但能查看CPU的平均信息,还能查看指定CPU的信息。
top:   显示的信息同ps接近,但是top可以了解到CPU消耗,可以根据用户指定的时间来更新显示。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

精确地度量这些指标很困难,因为这要求 CPU 花费所有时间来判断它正在做的事情!
内核大约每秒检查当前状态(系统时间、用户时间、I/O 等待时间和空闲时间)100 次,
并使用这些度量值计算百分比。

Linux用来衡量CPU使用率的另一个指标是平均负载。这个指标并不与CPU使用率直接关联;
它代表过去一分钟、5 分钟和 15 分钟内内核运行队列中基于指数加权的平均任务数量。
后面会进一步研究这个指标。

关于内核要考虑的其他指标有中断负载和上下文切换数。对于这些指标没有上限,
但是执行的中断和上下文切换越多,CPU 用来执行用户工作的时间就越少。


(1.2) 内存

系统有两种内存:真实内存和交换空间:
  * 真实内存 是指主板上安装的 RAM 条。
  * 交换空间 是当系统试图分配超出物理内存量的 RAM 时使用的临时空间。

系统会根据需要使用交换空间,在这种情况下,RAM的页面被交换到磁盘上,从而释放出
真实内存空间供当前分配使用。当再次需要使用交换出去的数据时,会把它们交换回来。

RAM 可以由应用程序或系统使用,或者未被使用。

系统以两种方式使用RAM:
  * 作为原始磁盘块的缓冲区(输入或输出)
  * 和作为文件缓存。

缓冲区和缓存的大小是动态的,所以如果需要的话,可以把内存让给应用程序。这就是大多数人
觉得他们的 Linux 系统似乎没有空闲内存的原因:系统把未使用的内存分配给缓冲区和缓存了。

交换内存在磁盘上。大量的交换操作会减慢系统速度,这是系统内存不足的迹象之一。


(1.3) 磁盘

磁盘是长期存储数据的设备,比如硬盘、U 盘或磁带(统称为块设备)。
惟一的例外是 RAM 磁盘,这是 RAM 中的一个区域,但是表现为块设备。
当系统关闭时,RAM 磁盘上的数据会丢失。

最常用的磁盘类型是硬盘,所以本教程对磁盘的讨论主要关注这种介质。

用来描述磁盘的度量值有两种:空间和速度。
Two categories of measurements are used to describe disk: space and speed. 

磁盘上的空闲空间是指磁盘上可供使用的字节数。
磁盘上的开销(overhead)包括由文件系统使用的空间或由于其他原因不可用的空间。
请记住,大多数生产商用 GB 表示磁盘的大小,1 GB 是 1,000,000,000 字节;
但是操作系统使用以 2 为底的指数,1 GB 是 1,073,741,824 字节;
这会导致磁盘的实际空间只有标称空间的 93%。这个差距并不大,
但是如果没有考虑到这一点,对磁盘空间的计算就不正确。

磁盘的第二个指标是速度,也就是磁盘返回数据的速度。
当 CPU 发出请求时,必须执行几个步骤,数据才能返回给 CPU:
 1. 内核把请求放到一个队列中,请求在队列中等待发送到磁盘(等待时间)。
 2. 命令被发送到磁盘控制器。
 3. 磁盘把磁头移动到所需的块上(寻道时间)。
 4. 磁头从磁盘读取数据。
 5. 数据返回给 CPU。

度量这些步骤的方式各不相同,有时候根本不度量某些步骤。
服务时间包括(encompasses)最后三个步骤,这个指标表示在发出请求之后多长时间能够满足请求。
等待时间(wait time)表示整个过程,包括请求在队列中排队的时间和服务时间。
(service time = 3 + 4 + 5 wait time = 1 + 2 + service time)

内核执行的优化措施之一是,在第一步中对队列中的请求进行重新排列和合并,
(目标为)尽可能减少磁盘寻道数量。这称为 elevator,有多种不同的实现算法(algorithms)。
One bit of optimization the kernel performs is to reorder and merge requests 
in the queue from step 1 to minimize the number of disk seeks. This is called 
an elevator, and several different algorithms have been used over the years.

********************************************************************************
Ref: http://www.ibm.com/developerworks/linux/tutorials/l-lpic3306/section2.html

When a new request is added to a request queue, the generic block layer invokes 
the I/O scheduler to determine that exact position of the new element in the queue. 
当一个新的请求被添加到请求队列时,一个通用的块层调用I/O调度以确定该新单元在队列中的确切位置。

The I/O scheduler tries to keep the request queue sorted sector by sector. 
I/O调度试图令请求队列以磁盘扇区族的顺序来储存。

If the requests to be processed are taken sequentially from the list, the amount of disk seeking 
is significantly reduced because the disk head moves in a linear way from the inner track to 
the outer one (or vice versa) instead of jumping randomly from one track to another. 
如果要处理的请求都按这样的排列顺序,那么磁盘的寻道数量将显着减少,因为磁头将按线性的方式,
从内部向外部的轨道移动(或反之亦然),而不是随机跳跃,从一个轨道移动到另一个地方。

This heuristic is reminiscent of the algorithm used by elevators when 
dealing with requests coming from different floors to go up or down. 
这让人联想到电梯在处理来自不同楼层的请求而决定要向上或向下时所使用的算法,并得到启发

The elevator moves in one direction; when the last booked floor is reached in one direction, 
the elevator changes direction and starts moving in the other direction. 
电梯在一个方向移动,当在一个方向到达最后预定的楼层时,电梯就改变方向并开始在其他方向移动。

For this reason, I/O schedulers are also called elevators.
出于这个原因,I/O调度也被称为电梯调度。
********************************************************************************


(1.4) 网络

Linux 在网络方面常常扮演两种角色:
  * 客户机(与服务器上的应用程序相互发送数据包)
  * 和路由器(或防火墙或桥接器)。

在一个接口上接收数据包,在另一个接口上发出数据包(可能先进行某种过滤或检查)。

网络状态常常用每秒比特数(或千比特、兆比特、吉比特)和每秒数据包数来度量。
度量每秒数据包数的意义往往不太大,因为计算机针对每个数据包有固定的开销量,
所以数据包越小,吞吐量越差。

不要误以为网卡的速度(比如 100Mbit/sec 或吉比特)就是机器预期的数据传输速度。
有几个外部因素会影响数据传输速度,包括延迟和连接的远程端,还包括服务器上的设置。


(1.5) 队列

队列与其他资源很不一样,但是在监视性能时常常用到列队,因此必须加以考虑。
队列 是请求等待处理的地方。

内核在许多方面使用队列,比如运行队列(包含要运行的进程的列表)、磁盘队列、网络队列和硬件队列。
在一般情况下,队列是一个内存区域,内核使用它跟踪特定的任务集。
但也可以是硬件组件上的一段内存,由硬件管理。

队列在两个方面影响性能调优:

首先,如果队列中有过多的工作,新的工作就会丢失。
例如,如果过多的数据包到达一个网络接口,一些数据包就被丢弃(用网络术语来说,这导致 tail drop)。

第二,如果频繁使用队列(或使用得不够),另一个组件可能达不到所需的性能。
如果运行队列中的进程数量常常很高,就可能意味着 CPU 过载。



(2) 度量性能

有几个工具可以用来度量 Linux 系统的性能。其中一些工具直接度量 CPU、磁盘、内存和网络,
其他工具显示队列使用量、进程创建量和错误数等指标。一些工具显示即时值,一些工具显示
一段时间的平均值。理解度量的方式与理解度量的目标同样重要。


(2.1) vmstat

vmstat是一种很有帮助的工具,可以实时地显示最常用的性能指标。
关于vmstat应该注意的最重要的一点是:它首先显示自系统启动以来的平均值,一般应该忽略这些数据。
在命令行上指定重复时间(以秒为单位),就可以让 vmstat 使用当前数据重复地报告信息。
清单 1 给出 vmstat 5 的输出。

清单 1. vmstat 5 的输出 
--------------------------------------------------------------------------------
# vmstat 5
procs ----------memory--------- --swap-- -----io----  --system--  -----cpu-----
 r  b   swpd  free  buff  cache  si  so    bi    bo     in   cs   us sy id wa st
 0  3  17780 10304 18108 586076   0   0   2779   332     1    1    3  4 76 17  0
 1  2  17780 10088 19796 556172   0   0   7803  3940  2257 4093   25 28 14 34  0
 0  2  17780  9568 19848 577496   0   0  18060  1217  1610  910    0  3 48 49  0
 0  0  17780 51696 20804 582396   0   0   9237  3490  1736  839    0  3 55 41  0
--------------------------------------------------------------------------------

清单 1 显示每 5 秒度量一次的 vmstat 命令的输出。

第一行的值是自系统启动以来的平均值,所以应该忽略它。

前两列是进程数。r 下面的数值是进行度量时运行队列中的进程数。运行队列中的进程正在等待 CPU。
下一列是因I/O操作阻塞的进程数,这意味着在I/O操作返回数据之前这些进程处于睡眠状态,而且不能中断它们。

memory 下面的列是关于系统内存的即时度量值,数据以 KB(1024 字节)为单位。
swpd 是已经交换到磁盘的内存量。free 是应用程序、缓冲区和缓存都没有使用的空闲内存量。
如果这个数值很低,也不要吃惊(关于实际的空闲内存的更多信息,请参见后面对 free 的讨论)。
buff 和 cache 分别表示分配给缓冲区和缓存的内存量。缓冲区存储原始磁盘块,缓存存储文件。

前两类度量值是即时度量值。有可能出现这样的情况:在一段短时间内,所有空闲内存都被消耗了,
但是在下一次度量之前释放了。因此,在输出中没有反映出来。其他值是取样时间段内的平均值。

swap 是每秒从磁盘交换回(si)和交换到磁盘(so)的平均内存量;数据以 KB 为单位。

io 是每秒对所有块设备读和写的磁盘块数量。

system 类别中的度量值是每秒中断数(in)和每秒上下文切换数(cs)。
中断来自设备(比如网卡通知内核一个数据包正在等待处理)和系统计时器。
在某些内核中,系统计时器每秒触发 1,000 次,所以这个数值可能很高。

最后一类度量值显示 CPU 的状态,数据显示为总 CPU 时间的百分比。这 5 个值的总和应该是 100。
us 是在取样时间段内 CPU 花在用户任务上的平均时间,
sy 是 CPU 花在系统任务上的平均时间。
id 是 CPU 的空闲时间,
wa 是 CPU 等待 I/O 的时间。   (清单1 中的数据来自一个出现严重 I/O 瓶颈的系统,
可以看到34-49%的CPU时间花在等待从磁盘返回数据上)
最后一个值 st(steal 时间)适用于运行系统管理程序(hypervisor)和虚拟机的服务器。
它是指系统管理程序在本来应该运行虚拟机的时间内执行其他任务的时间百分比。

********************************************************************************
注意:关于最后CPU的最后一列述据st时间,在Host主机不会出现,只在Guest主机才出现。
********************************************************************************

在 清单 1 中可以看出,vmstat 提供了关于各种性能指标的大量信息。
如果系统发生了什么问题,vmstat 是寻找问题原因的好工具。

vmstat 还可以显示关于每个磁盘设备的使用情况的信息,这可以进一步细化清单1中的swap和io度量值。
-d 参数报告一些磁盘统计数据,包括每个磁盘的读写总数。
清单2 给出 vmstat -d 5 的部分输出(去掉了未使用的设备)。

清单 2. 使用 vmstat 显示磁盘使用情况
--------------------------------------------------------------------------------
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
hda   186212  28646 3721794  737428 246503 4549745 38981340 8456728    0   2583
hdd   181471  27062 3582080  789856 246450 4549829 38981624 8855516    0   2652
--------------------------------------------------------------------------------

每个磁盘的信息显示在单独的一行上,而且输出分为读和写。读和写进一步分为发出的请求总数、
在磁盘 elevator 中合并的请求数、读或写的扇区数和总服务时间。这些数值都是累积值,
所以在下一次重新引导之前会一直增加,而在不使用 -d 选项时显示的是平均值。

清单2中的最后一组度量值(在IO下面)显示磁盘当前的I/O操作数和自启动以来在I/O上花费的总秒数。

在清单 2 中,两个磁盘的读操作数据很相似,写操作数据几乎相同。这两个磁盘组成一个软件镜像,
所以这种表现是正常的。还可以使用清单 2 中的信息识别缓慢的磁盘或者使用量比较大的磁盘。


(2.2) iostat

与清单2 中的 vmstat -d 示例密切相关的是 iostat。这个命令提供每个磁盘设备的使用情况细节。
与 vmstat -d 相比,iostat 能够提供更多的细节。与 vmstat 一样,可以向 iostat 传递一个表示
刷新时间间隔的数值。同样,它首先输出自系统启动以来的值,因此常常忽略这些数据。
单 3 给出 iostat 的输出,时间间隔为 5 秒。

清单 3. iostat 命令的输出
--------------------------------------------------------------------------------
$ iostat 5
Linux 26.20-1.3002.fc6xen (bob.ertw.com)       02/08/2008

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.85    0.13    0.35    0.75    0.01   97.90

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
hda               1.86        15.24       13351    4740568   41539964
hdd               1.85        14.69       133.51    4570088   41540256
--------------------------------------------------------------------------------

在每个度量间隔的输出中,
第一部分显示 CPU 使用情况,vmstat 也显示这些信息。但是,这里显示两位小数形式。

输出的第二部分显示系统上的所有块设备
(要想限制显示的设备数量,可以在命令行上传递设备的名称,比如 iostat 5 hda sda)。

第一列 tps 表示在 elevator 合并请求之后的每秒传输数。没有指定传输的大小。
后面 4 列以 512 字节的块为单位,分别表示每秒读的块数、每秒写的块数、读的总块数和写的总块数。
如果希望看到以 KB 或 MB 为单位的值,应该分别指定 -k 或 -m 选项。

如果需要的话,可以通过指定 -p 选项显示分区级(partitions)的详细数据。例如:

# iostat -p sda -k
--------------------------------------------------------------------------------
Linux 3.2.0-24-generic (hung.moon.com) 06/07/2012 _x86_64_ (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           6.48    0.08    1.44    0.74    0.00   91.26

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               4.92        43.64        84.40    1753447    3391173
sda1              0.01         0.04         0.00       1785         25
sda2              0.27         0.59         2.39      23816      96188
sda3              1.93        32.96         9.71    1324241     390300
sda4              2.68        10.03        72.29     402941    2904660

--------------------------------------------------------------------------------

可以使用 -x 参数获得更详细的信息,见清单 4。清单 4 还把输出限制为一个驱动器。
为了适应页面的宽度,调整了输出的格式。

清单 4. iostat 的部分输出 
--------------------------------------------------------------------------------
# iostat -x 5 hda
..... CPU information removed ...
Device:         rrqm/s   wrqm/s    r/s   w/s    rsec/s   wsec/s 
hda           16669.31     1.49 756.93  1.49 139287.13    27.72   

             avgrq-sz   avgqu-sz   await  svctm   %util
                18369       1.58     208   1.28   96.83
--------------------------------------------------------------------------------

前六个值是每秒读和写的数量。
rrqm/s 和 wrqm/s 是合并的读写请求数。
r/s 和 w/s 表示发送到磁盘的读写数。
因此,合并的磁盘请求百分比是 16669 / (16669 + 757) = 95%。
rsec/s 和 wsec/s 显示读写速率(每秒扇区数)。

后面四列显示磁盘队列和时间的相关信息。
avgrq-sz 是发送到设备的平均请求大小(扇区数)。
avgqu-sz 是在度量间隔内磁盘队列的平均长度。
await 是平均等待时间(毫秒数),这表示从请求发送给内核到返回的平均时间。
svctm 是平均服务时间(毫秒数),这是请求离开队列并发送给磁盘到返回的时间。 

最后一个值 %util 是系统在这个设备上执行 I/O 的时间百分比,这也称为饱和度(saturation)。
清单 4 报告的 96.83% 表明在这段时间内这个磁盘几乎达到了容量极限。


(2.3) mpstat

mpstat 报告关于 CPU(或多处理器机器上的所有 CPU)的详细信息。
其中许多信息也可以通过某种形式的 iostat 和 vmstat 命令获得,但是 mpstat 为所有处理器单独提供数据。
清单 5 显示 mpstat 的输出,度量时间间隔为 5 秒。与 iostat 和 vmstat 不同,不应该忽略第一行数据。

清单 5. 用 mpstat 显示 CPU 信息 
--------------------------------------------------------------------------------
# mpstat -P 0 5
Linux 2.620-1.3002.fc6xen (bob.ertw.com)       02/09/2008

09:45:23 PM  CPU   %user   %nice    %sys %iowait   %irq  %soft  %steal   %idle   intr/s
09:45:25 PM    0   77.61   21.89    0.00    0.00   0.50   0.00    0.00    0.00   155.22
09:45:27 PM    0   68.16   30.85    1.00    0.00   0.00   0.00    0.00    0.00   154.73
--------------------------------------------------------------------------------

指定 -P 0 表示应该显示第一个 CPU(编号从 0 开始)。
还可以指定 -P ALL,从而单独显示所有 CPU 的数据。mpstat 返回的字段如下:
  * %user: 在用户任务上花费的时间的百分比,但是不包括 nice 任务
  * %nice: 在 nice(低优先级)用户任务上花费的时间的百分比
  * %sys: 在内核任务上花费的时间的百分比
  * %iowait: 等待 I/O 的空闲时间的百分比
  * %irq: 处理硬件中断的时间的百分比
  * %soft: 处理软件中断的时间的百分比
  * %steal: 系统管理程序从虚拟机偷取的时间的百分比
  * intr/s: 每秒的平均中断数

********************************************************************************
新版用 -I {SUM|CPU|SCPU|ALL} 来报告 intr/s 数据 (Report interrupts statistics)
# mpstat -I SUM
07:22:29 PM  CPU    intr/s
07:22:29 PM  all   1639.71
********************************************************************************


(2.4) pstree

在考察资源使用情况时,了解哪些进程生成了其他进程会很有帮助。
了解这些情况的一种方法是使用 ps -ef 的输出并使用父进程的 id,直至找到 PID 1(init)。
还可以使用 ps -efjH,这个命令会把输出排序为父-子树,并包含 CPU 时间使用数据。

pstree 实用程序以更图形化的格式显示进程树,还把相同进程的多个实例合并为一行。
清单 6 显示 pstree 的输出(传递 Postfix 守护进程的 PID)。

清单 6. pstree 的输出
--------------------------------------------------------------------------------
[root@sergeant ~]# pstree 7988
master─┬─anvil
       ├─cleanup
       ├─local
       ├─pickup
       ├─proxymap
       ├─qmgr
       ├─2*[smtpd]
       └─2*[trivial-rewrite]
--------------------------------------------------------------------------------

master 进程生成了其他几个进程,比如 anvil、cleanup 和 local。
最后两行输出的格式是 N*[something],其中的 something 是进程的名称,N 是采用这个名称的子进程的数量。
如果除了方括号([])之外 something 还包围在花括号({})中,N 就表示运行的线程数
(ps 在一般情况下不显示线程数,除非使用 -L 选项)。

# pstree 1188; #(补充笔注: 一个pstree命令的示列)
--------------------------------------------------------------------------------
lightdm─┬─Xorg
        ├─lightdm─┬─gnome-session─┬─bluetooth-apple───2*[{bluetooth-apple}]
        │         │               ├─deja-dup-monito───2*[{deja-dup-monito}]
        │         │               ├─evolution-alarm───2*[{evolution-alarm}]
        │         │               ├─gdu-notificatio───2*[{gdu-notificatio}]
        │         │               ├─gnome-fallback-───2*[{gnome-fallback-}]
        │         │               ├─gnome-panel───2*[{gnome-panel}]
        │         │               ├─gnome-screensav───2*[{gnome-screensav}]
        │         │               ├─gnome-settings-───2*[{gnome-settings-}]
        │         │               ├─metacity───3*[{metacity}]
        │         │               ├─nautilus───2*[{nautilus}]
        │         │               ├─nm-applet───2*[{nm-applet}]
        │         │               ├─notification-da───2*[{notification-da}]
        │         │               ├─polkit-gnome-au───2*[{polkit-gnome-au}]
        │         │               ├─ssh-agent
        │         │               ├─telepathy-indic───2*[{telepathy-indic}]
        │         │               ├─update-notifier───3*[{update-notifier}]
        │         │               ├─zeitgeist-datah───{zeitgeist-datah}
        │         │               └─3*[{gnome-session}]
        │         └─{lightdm}
        └─2*[{lightdm}]
--------------------------------------------------------------------------------

# ps -efjH; #(补充笔注: 一个 ps 命令的示列);
--------------------------------------------------------------------------------
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
root         2     0     0     0  0 14:10 ?        00:00:00 [kthreadd]
root         3     2     0     0  0 14:10 ?        00:00:00   [migration/0]
root         4     2     0     0  0 14:10 ?        00:00:00   [ksoftirqd/0]
root         5     2     0     0  0 14:10 ?        00:00:00   [watchdog/0]
root         6     2     0     0  0 14:10 ?        00:00:00   [events/0]
root         7     2     0     0  0 14:10 ?        00:00:00   [cpuset]
root         8     2     0     0  0 14:10 ?        00:00:00   [khelper]
root         9     2     0     0  0 14:10 ?        00:00:00   [netns]
root        10     2     0     0  0 14:10 ?        00:00:00   [async/mgr]
root        11     2     0     0  0 14:10 ?        00:00:00   [pm]
root        12     2     0     0  0 14:10 ?        00:00:00   [sync_supers]
root        13     2     0     0  0 14:10 ?        00:00:00   [bdi-default]
root        14     2     0     0  0 14:10 ?        00:00:00   [kintegrityd/0]
root        15     2     0     0  0 14:10 ?        00:00:00   [kblockd/0]
root        16     2     0     0  0 14:10 ?        00:00:00   [kacpid]
root        17     2     0     0  0 14:10 ?        00:00:00   [kacpi_notify]
root        18     2     0     0  0 14:10 ?        00:00:00   [kacpi_hotplug]
root        19     2     0     0  0 14:10 ?        00:00:00   [ata/0]
root        20     2     0     0  0 14:10 ?        00:00:00   [ata_aux]
root        21     2     0     0  0 14:10 ?        00:00:00   [ksuspend_usbd]
root        22     2     0     0  0 14:10 ?        00:00:00   [khubd]
root        23     2     0     0  0 14:10 ?        00:00:00   [kseriod]
root        25     2     0     0  0 14:10 ?        00:00:00   [khungtaskd]
root        26     2     0     0  0 14:10 ?        00:00:00   [kswapd0]
root        27     2     0     0  0 14:10 ?        00:00:00   [ksmd]
root        28     2     0     0  0 14:10 ?        00:00:00   [aio/0]
root        29     2     0     0  0 14:10 ?        00:00:00   [crypto/0]
root        35     2     0     0  0 14:10 ?        00:00:00   [kpsmoused]
root        36     2     0     0  0 14:10 ?        00:00:00   [usbhid_resumer]
root        66     2     0     0  0 14:10 ?        00:00:00   [kstriped]
root       180     2     0     0  0 14:10 ?        00:00:00   [scsi_eh_0]
root       183     2     0     0  0 14:10 ?        00:00:00   [scsi_eh_1]
root       205     2     0     0  0 14:10 ?        00:00:00   [scsi_eh_2]
root       261     2     0     0  0 14:10 ?        00:00:00   [kdmflush]
root       268     2     0     0  0 14:10 ?        00:00:00   [kdmflush]
root       280     2     0     0  0 14:10 ?        00:00:00   [jbd2/dm-0-8]
root       281     2     0     0  0 14:10 ?        00:00:00   [ext4-dio-unwrit]
root       318     2     0     0  0 14:10 ?        00:00:03   [kauditd]
root       691     2     0     0  0 14:11 ?        00:00:00   [jbd2/sda1-8]
root       692     2     0     0  0 14:11 ?        00:00:00   [ext4-dio-unwrit]
root      1261     2     0     0  0 14:11 ?        00:00:00   [rpciod/0]
root      3552     2     0     0  0 19:30 ?        00:00:00   [flush-253:0]
root         1     0     1     1  0 14:10 ?        00:00:02 /sbin/init
root       367     1   367   367  0 14:11 ?        00:00:00   /sbin/udevd -d
root       818   367   367   367  0 14:11 ?        00:00:00     /sbin/udevd -d
root       823   367   367   367  0 14:11 ?        00:00:00     /sbin/udevd -d
root      1161     1  1158   736  0 14:11 ?        00:00:00   /sbin/rsyslogd -c 4
rpc       1206     1  1206  1206  0 14:11 ?        00:00:00   rpcbind
rpcuser   1224     1  1224  1224  0 14:11 ?        00:00:00   rpc.statd
root      1268     1  1268  1268  0 14:11 ?        00:00:00   rpc.idmapd
dbus      1297     1  1297  1297  0 14:11 ?        00:00:00   dbus-daemon --system
root      1309     1  1309  1309  0 14:11 ?        00:00:00   cupsd -C /etc/cups/cupsd.conf
root      1334     1  1334  1334  0 14:11 ?        00:00:00   /usr/sbin/acpid
68        1343     1  1343  1343  0 14:11 ?        00:00:00   hald
root      1344  1343  1343  1343  0 14:11 ?        00:00:00     hald-runner
root      1401     1  1401  1401  0 14:12 ?        00:00:02   automount --pid-file /var/run/autofs.pid
root      1419     1  1419  1419  0 14:12 ?        00:00:00   /usr/sbin/sshd
root      1533  1419  1533  1533  0 14:13 ?        00:00:00     sshd: root@pts/0 
root      1538  1533  1538  1538  0 14:13 pts/0    00:00:00       -bash
root      2875  1538  2875  1538  0 15:54 pts/0    00:00:00         su -
root      2876  2875  2876  1538  0 15:54 pts/0    00:00:00           -bash
root      3580  2876  3580  1538  0 19:43 pts/0    00:00:00             ps -efjH
root      1435     1  1435  1435  0 14:12 ?        00:00:01   sendmail: accepting connections
root      1454     1  1454  1454  0 14:12 ?        00:00:00   /usr/sbin/abrtd
root      1462     1  1462  1462  0 14:12 ?        00:00:00   crond
root      1473     1  1473  1473  0 14:12 ?        00:00:00   /usr/sbin/atd
root      1488     1  1488  1488  0 14:12 tty1     00:00:00   /sbin/mingetty /dev/tty1
root      1490     1  1490  1490  0 14:12 tty2     00:00:00   /sbin/mingetty /dev/tty2
root      1492     1  1492  1492  0 14:12 tty3     00:00:00   /sbin/mingetty /dev/tty3
root      1494     1  1494  1494  0 14:12 tty4     00:00:00   /sbin/mingetty /dev/tty4
root      1496     1  1496  1496  0 14:12 tty5     00:00:00   /sbin/mingetty /dev/tty5
root      1498     1  1498  1498  0 14:12 tty6     00:00:00   /sbin/mingetty /dev/tty6
root      1516     1  1516  1516  0 14:12 ?        00:00:00   auditd
--------------------------------------------------------------------------------


(2.5) w、uptime 和 top

这些实用程序是研究系统问题时首先使用的实用程序。清单 7 给出 w 命令的输出。

清单 7. w 命令的输出
--------------------------------------------------------------------------------
# w
 12:14:15 up 33 days, 15:09,  2 users,  load average: 0.06, 0.12, 0.09
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty2     -                17Jan08 18days  0.29s  0.04s login -- root     
root     pts/0    bob              Sat22    0.00s  0.57s  0.56s -bash
--------------------------------------------------------------------------------

w 输出的第一行提供大量信息。第一部分 “12:14:15 up 33 days, 15:09” 是当前时间和
运行时间(33 天 15 小时 9 分钟)。第二部分 “2 users” 是已经登录的用户数。
最后一部分是平均负载,包括 1 分钟、5 分钟和 15 分钟的平均值。

平均负载是给定的时间段内运行队列中进程数的加权平均值。
平均负载越高,就表示有更多的进程在争夺 CPU。
平均负载并未按照 CPU 数量进行归一化,这意味着平均负载与 CPU 数量不相关。

要想理解平均负载,就必须理解它的加权方式。
平均负载每 5 秒更新一次,越陈旧的信息在计算中的作用越小。
如果运行队列中的进程数从 0 提高到 1,那么下一分钟的 1 分钟平均负载并不是一条直线,
而是一条曲线,这条曲线先快速上升,然后在 60 秒标志之前逐渐下降。
关于平均负载计算方法的详细信息,参见 参考资料。

对平均负载进行加权计算的目的是,避免度量期间实际负载的变化影响数据的稳定性;
但是数值更多地反映当前状态,尤其是 1 分钟平均值。

第一行后面是已经登录的用户的列表,数据包括他们的登录时间、位置和 CPU 使用信息。
第一个用户 root 是从 tty2(一个本地控制台)登录的,他已经空闲了 18 天。
第二个用户也是 root,但是他是通过网络登录的,当前在 shell 中。
JCPU 和 PCPU 列表示这个用户已经使用的 CPU 时间;
第一列包含过去的作业,而 PCPU 是用户当前使用的进程的 CPU 时间。

uptime 的输出与 w 输出的第一行完全相同,但是没有关于用户的信息。
在实践中,w 更有帮助,因为它提供关于用户的信息,而且这个命令更简短。

另一个常用的命令是 top,它显示不断更新的消耗资源最多的进程列表(按照内存或 CPU 使用量排序),
还显示其他一些性能指标。图 1 显示 top 的屏幕图。

图 1. top 
IMG:IBM-LPIC-301-306.1-top.jpg

--------------------------------------------------------------------------------
top - 19:57:59 up 12:06,  2 users,  load average: 0.02, 0.09, 0.18
Tasks: 187 total,   2 running, 184 sleeping,   0 stopped,   1 zombie
Cpu(s):  6.1%us,  1.3%sy,  0.1%ni, 91.7%id,  0.7%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   1918192k total,  1574612k used,   343580k free,    21060k buffers
Swap:  8000508k total,    64368k used,  7936140k free,   333020k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1232 root      20   0  313m  78m  10m R   38  4.2  18:40.39 Xorg
 2489 jason     20   0  602m  22m  10m S   19  1.2   0:37.21 gnome-terminal
12959 root      20   0 17332 1356  952 R   19  0.1   0:00.07 top
    1 root      20   0 24448 1968 1092 S    0  0.1   0:00.58 init
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd
    3 root      20   0     0    0    0 S    0  0.0   0:01.03 ksoftirqd/0
    6 root      RT   0     0    0    0 S    0  0.0   0:00.00 migration/0
    7 root      RT   0     0    0    0 S    0  0.0   0:00.08 watchdog/0
    8 root      RT   0     0    0    0 S    0  0.0   0:00.00 migration/1
   10 root      20   0     0    0    0 S    0  0.0   0:00.68 ksoftirqd/1
   12 root      RT   0     0    0    0 S    0  0.0   0:00.10 watchdog/1
   13 root       0 -20     0    0    0 S    0  0.0   0:00.00 cpuset
   14 root       0 -20     0    0    0 S    0  0.0   0:00.00 khelper
   15 root      20   0     0    0    0 S    0  0.0   0:00.00 kdevtmpfs
--------------------------------------------------------------------------------

第一行与 uptime 的输出相同,比如运行时间和平均负载。

第二行是进程数。
Running 是运行队列中的进程数;
sleeping 是正在等待唤醒的进程数。
stopped 是已经暂停的进程(可能由于正在跟踪或调试这些进程)。
zombie 是已经退出的进程,但是父进程还没有确认它们已经死亡。

第三行显示 CPU 使用信息,依次显示用户、系统、niced、空闲、I/O 等待、硬件中断、软件中断和 steal 时间。
这些数值是前一个度量间隔(默认为 3 秒)中的时间百分比。

最后两行显示内存统计数据。首先是关于真实内存的信息;在 图 1 中, 
可以看到这个系统有 961,780K 的 RAM(已经扣除了内核占用的部分)。
除了 6,728K 之外所有内存都被使用了,其中缓冲区大约为 30MB,缓存为 456M(缓存显示在第二行末尾)。
第二行显示交换空间的情况:这个系统有差不多 3G 的交换空间,其中只使用了 144K。

屏幕上其余的数据是当前运行的进程的信息。top 会显示尽可能多的进程,直至填满窗口。
每个进程单独占一行,这个列表会在每次度量时更新,把使用 CPU 时间最多的任务列在最上面。
显示的列如下:
  * PID:进程的进程 id
  * USER:进程的有效用户名(如果程序使用 setuid(2) 改变用户,就会显示新用户)
  * PR:任务的优先级,内核使用优先级决定哪个进程应该首先使用 CPU
  * NI:任务的 nice 级别,系统管理员通过设置 nice 级别影响哪些进程应该首先使用 CPU
  * VIRT:进程的虚拟映像的大小,这是使用的 RAM 空间(常驻大小)和交换空间中的数据量(交换大小)的总和
  * RES:进程的常驻大小,也就是进程使用的真实 RAM 数量
  * SHR:应用程序共享的内存量,比如 SysV 共享内存或动态库(*.so)
  * S:状态,比如 sleeping、running 或 zombie
  * %CPU:前一个度量时间段内使用的 CPU 百分比
  * %MEM:前一次度量时使用的 RAM 的百分比(不包括交换空间)
  * TIME+:进程使用的时间,格式为 minutes:seconds:hundredths
  * COMMAND:正在运行的命令的名称

可以通过 top 快速了解哪些进程使用的 CPU 时间最多,还可以全面了解系统的 CPU 和内存使用情况。
在 top 中按 M,就可以让 top 按内存使用量排序(按c可显示长命令格式)。

************************************************************************
奇怪的现象
VIRT = RES + SWAP,这意味着 SWAP = VIRT - RES。看一下 PID 13435,可以看到
VIRT 是 164m,RES 是 76m,这意味着 SWAP 必须是 88m。但是,屏幕顶部的交换
统计数据表明,只使用了 144K 的交换空间!在 top 中使用 f 键,启用更多字段
(比如 swap),就可以证实这一情况。
在交换过程中,不仅仅把页面交换到磁盘。应用程序的二进制代码和库不需要一直
放在内存中。内核可以把一些内存页面标为不需要的;但是因为二进制代码已经保
存在磁盘上的一个已知位置,所以不需要使用交换文件。这部分内存仍然算作已经
交换,因为代码不再常驻在这里了。另外,应用程序可以把内存映射到一个磁盘文件。
因为应用程序的总大小(VIRT)包含映射的内存,但是这个部分不是常驻的(RES),
它被算作已经交换了。
************************************************************************


(2.6)  free

看过 top 的输出之后,就应该讨论 free 了。
清单 8 显示 free 的输出,这里使用 -m 选项以 MB 为单位报告所有值。

清单 8. 使用 free 命令 
--------------------------------------------------------------------------------
# free -m
             total       used       free     shared    buffers     cached
Mem:           939        904         34          0        107        310
-/+ buffers/cache:        486        452
Swap:         2847          0       2847
--------------------------------------------------------------------------------

free 显示几方面的内存使用信息。第一行显示与 top 相同的信息。
第二行显示在不考虑缓冲区和缓存的情况下已使用的内存和空闲内存。
在清单 8 中,有 452M 的内存是空闲的,可供应用程序使用;
这部分内存包括空闲内存(34M)、缓冲区(107M)和缓存(310M)。
最后一行显示与 top 相同的交换统计数据。


(2.7) 显示网络统计数据 bwm 和 iftop

获取网络统计数据的过程不如获取 CPU、内存和磁盘统计数据那么直接。
主要方法是读取 /proc/net/dev 中的数据。
这个文件记录每个接口的网络传输量,采用数据包数和字节数两种统计方法。
如果希望看到传输速度,就必须自己计算:两个度量值之间的差除以度量间隔。
也可以使用 bwm 等工具自动收集和显示总带宽。图 2 显示 bwm 的输出。

图 2. 使用 bwm 命令
IMG: IBM-LPIC-301-306.1-bwm.jpg

bwm 显示各方面的接口使用情况。图 2 每半秒更新一次即时速率,还显示 30 秒平均带宽、
最大带宽和字节数。在图 2 中可以看到,eth0以大约20K/sec的速率接收通信流,通信流来自 vif0.0。
如果不想查看每秒字节数,可以按 u 键在比特数、数据包数和错误数之间切换。

********************************************************************************
bwm-ng - Bandwidth Monitor NG(Next Generation), 
a live bandwidth monitor for network and disk io.
********************************************************************************
apt-get install bwm-ng;
bwm-ng -t 3000; #displays and gathers stats every 3sec(default 500msec):
--------------------------------------------------------------------------------
bwm-ng v0.6 (probing every 10.000s), press 'h' for help
  input: /proc/net/dev type: rate
  -         iface                   Rx                   Tx                Total
  ==============================================================================
             ppp0:           0.00 KB/s            0.00 KB/s            0.00 KB/s
               lo:           0.00 KB/s            0.00 KB/s            0.00 KB/s
         vboxnet0:           0.00 KB/s            0.00 KB/s            0.00 KB/s
             eth0:           0.00 KB/s            0.00 KB/s            0.00 KB/s
  ------------------------------------------------------------------------------
            total:           0.00 KB/s            0.00 KB/s            0.00 KB/s
--------------------------------------------------------------------------------
Rx 接收带宽
Tx 送出带宽
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

如果需要更详细地了解负责通信流的主机,就需要使用 iftop。它通过与 top 相似的界面
提供关于网络通信的信息。内核并不直接提供这些信息,所以 iftop 使用 pcap 库检查
网络上传输的数据包,这需要root特权。图 3 显示 iftop 的输出(连接到 eth2 设备)。

图 3. iftop -i eth2 的输出 
IMG: IBM-LPIC-301-306.1-iftop.jpg

iftop -n -N -p -B -P -i ppp0; (如下是我的一个示例,其中刻度非原始数据,仅作示范)
--------------------------------------------------------------------------------
               1.56kB         3.12kB         4.69kB         6.25kB   7.81kB
└──────────────┴──────────────┴──────────────┴──────────────┴──────────────
218.103.241.1:51447     => 210.0.234.100:80            0B    448B    112B
█████████               <=                             0B   10.7kB  2.67kB
218.103.241.1:41530     => 202.125.90.99:80            0B    826B    206B
█████                   <=                             0B   1.39kB   356B
218.103.241.1:44665     => 210.0.234.72:80           334B    537B    134B
██                      <=                           436B    637B    159B
218.103.241.1:43642     => 66.220.146.94:80            0B    107B     27B
                        <=                             0B    456B    114B
218.103.241.1:54425     => 202.79.210.121:80           0B    264B     66B
                        <=                            26B    173B     43B
218.103.241.1:41371     => 46.137.244.123:80           0B    188B    144B
                        <=                             0B    223B    277B
218.103.241.1:50813     => 202.125.90.13:80            0B     89B     22B
                        <=                             0B    251B     63B
218.103.241.1:39705     => 138.108.7.20:80           437B    183B     46B
                        <=                           235B    105B     26B
218.103.241.1:59776     => 122.248.246.4:80          276B    121B     30B
                        <=                           374B    161B     40B
218.103.241.1:41541     => 202.125.90.99:80            0B    122B     31B
                        <=                             0B    128B     32B
218.103.241.1:50810     => 202.125.90.13:80            0B     79B     20B
                        <=                             0B    168B     42B
218.103.241.1:47590     => 219.76.10.40:80            26B    178B    167B
                        <=                           150B     60B     52B
───────────────────────────────────────────────────────────────────────────
TX:             cum:    145kB   peak:   18.rates:   1.97kB  4.89kB  3.62kB
RX:                     456kB           65.9kB      2.41kB  16.0kB  11.4kB
TOTAL:                  601kB           79.4kB      4.38kB  20.9kB  15.0kBKilled
--------------------------------------------------------------------------------

iftop 显示网络上最活跃的会话。在默认情况下,每个会话有两行输出:
    一行显示发送信息,
    另一行显示接收信息。

看一下从 mybox 到 pub1.kernel.org 的第一个会话:
    第一行显示从 mybox 发送出的通信流,
    第二行显示 mybox 接收的通信流。
    右边的数值分别表示前 2 秒、10 秒和 40 秒内的平均流量。
    还可以看到覆盖主机名的黑色条,这是10秒平均值的图形化表示(刻度显示在屏幕顶部)。

仔细看一下图 3:
  * 第一个传输可能是下载操作,因为接收的流量很大
    (在前 10 秒内平均速率大约是每秒 0.5 MB),而上传量很小。
  * 第二个会话的发送和接收量大致相同,速率稳定在大约 75-78k/sec。
    这是通过 les.net(我的 VoIP 提供商)的 G.711 语音呼叫。
  * 第三个会话显示 128K 的下载速率,上传速率很小:这是一个因特网广播流。

选择连接的接口很重要。图 3 使用防火墙上的一个外部接口,这个接口可以看到通过 IP masquerading 
传递之后的所有数据包。这会丢失内部地址。使用另一个接口(比如一个内部接口)可以保留这一信息。


(2.8) sar

sar 是一个很大的主题(参见 参考资料)。sar 每 10 分钟对几十个指标进行一次度量,
并提供获取度量值的方法。可以使用前面讨论的工具判断目前发生的情况;而 sar 可以
显示本周发生的情况。注意,sar 只保留最近 7 天的数据。

配置数据收集过程需要在根的 crontab 中添加两行。清单 9 显示 sar 的典型 crontab 配置。

清单 9. sar 数据收集的根 crontab 配置 
--------------------------------------------------------------------------------
# Collect measurements at 10-minute intervals
0,10,20,30,40,50   * * * *   /usr/lib/sa/sa1 -d 1 1
# Create daily reports and purge old files
0                  0 * * *   /usr/lib/sa/sa2 -A
--------------------------------------------------------------------------------
第一行每 10 分钟执行一次 sa1 来收集数据;这个命令通过运行 sadc 进行实际的数据收集。
这个作业是自包含的:它知道向哪个文件写入数据,不需要配置。第二行在午夜调用 sa2,
这会清空旧的数据文件并把当前的数据收集到一个可读的文本文件中。
********************************************************************************
注意,在Ubuntu/Debian中,sar的上述相关命令文件在/usr/lib/sysstat/目录之下:
/usr/lib/sysstat/debian-sa1 #shell script;
/usr/lib/sysstat/sa1 #shell script;
/usr/lib/sysstat/sa2 #shell script;
/usr/lib/sysstat/sadc #binary command;
注意:脚本sa1调用sadc命令,但在Ubuntu/Debian系统版本中的sadc不支持 -d 选项。
********************************************************************************

在依靠sar的数据判断系统状态之前,有必要检查系统运行sar的方式。一些系统禁止收集磁盘
统计数据;为了纠正这个问题,必须在对sa1的调用中添加 -d 选项(清单9已经添加了这个选项)。
收集了一些数据之后,现在可以不带任何选项运行sar,这会显示当天的CPU使用情况。清单10给出部分输出。

清单 10. sar 的输出示例 
--------------------------------------------------------------------------------                    
[root@bob cron.d]# sar | head
Linux 3.2.0-24-generic (hung.moon.com) 06/07/2012 _x86_64_ (2 CPU)
03:35:27 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
03:39:24 PM     all      1.83      0.00      0.93      0.21      0.00     97.02
03:40:01 PM     all      0.98      0.00      0.71      0.41      0.00     97.90
03:50:01 PM     all     14.20      0.00      2.02      0.90      0.00     82.88
Average:        all     10.26      0.00      1.67      0.69      0.00     87.38
--------------------------------------------------------------------------------

您现在应该已经熟悉清单10中的数值:它们就是top、vmstat和mpstat显示的各种CPU统计数据。
通过使用 表3 中的命令行参数,可以显示更多信息。

表 3. sar 的选项(选项/示例/说明)
--------------------------------------------------------------------------------
-A  sar -A 显示所有数据。除非打算把结果保存到一个文本文件中,否则不太可能需要
使用这个选项。如果需要这个选项,这个进程会在夜间在执行 sa2 期间运行。
-b  sar -b 显示发送到块设备和从块设备读取的事务数和块数,与 iostat 的输出很相似。
-B  sar -B 显示换页(交换)统计数据,比如 vmstat 报告的那些数据。
-d  sar -d 显示磁盘活动,与 iostat -x 的输出很相似,包括等待时间、服务时间和队列长度。
-n  sar -n DEV 在使用DEV时,显示接口活动(与bwm相似);
    sar -n NFS 在使用NFS关键字时,显示NFS客户机统计数据;
    sar -n NFSD 使用NFSD关键字获取NFS服务器守护进程统计数据;
    sar -n EDEV EDEV关键字显示来自网卡的错误信息;
-q  sar -q 显示关于运行队列、进程列表总大小和平均负载的信息,比如vmstat和uptime报告的数据。
-r  sar -r 显示关于内存、交换空间、缓存和缓冲区使用情况的信息(与 free 相似)。
-f  sar -f /var/log/sa/sa11 从另一个文件读取信息。文件根据日期命名。
-s  sar -s 08:59:00 从给定时间之后的第一次度量开始显示信息。如果指定 09:00:00,
那么第一次度量发生在 09:10,所以应该在所需的时间中减去 1 分钟。
-e  sar -e 10:01:00 指定显示度量的截止时间。应该在所需的时间中加 1 分钟以确保包含最后一次度量。
--------------------------------------------------------------------------------
还可以组合使用多个参数,从而获得多个报告或另一个带有指定时间段的文件。


(2.9) df

硬盘是一种有限的资源。如果一个分区的空间用光了,就会出现问题。df 命令可以显示磁盘空间状态。
清单 11 显示 df -h 的输出,这个命令采用一种更友好的输出格式。

清单 11. 用 df -h 检查磁盘空间使用情况 
--------------------------------------------------------------------------------
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_centos6-lv_root
                       15G  1.3G   13G  10% /
tmpfs                 250M     0  250M   0% /dev/shm
/dev/sda1             485M   29M  432M   7% /boot
--------------------------------------------------------------------------------

清单 11 显示在根上有一个文件系统,大小为 15G,有 13G 的空闲空间。
/boot 分区是 485M,有 432M 的空闲空间。
tmpfs 是一个特殊的文件系统,不对应任何设备。
如果一个分区满了,就没有可用空间,使用率为 100%。



发表评论

此博客中的热门博文

关于 nscd,nslcd 和 sssd 套件的综述

关于 nscd,nslcd 和 sssd 套件的综述

旧式libnss_ldap和pam_ldap的库文件:
/lib/x86_64-linux-gnu/libnss_ldap-2.13.so
/lib/x86_64-linux-gnu/security/pam_ldap.so

新式libnss_ldapd和libpam_ldapd(即nslcd)的库文件:
/lib/x86_64-linux-gnu/libnss_ldap.so.2
/lib/x86_64-linux-gnu/security/pam_ldap.so

套件sssd自带的libnss_sss和pam_sss库文件:
/lib/libnss_sss.so.2
/lib/security/pam_sss.so


********************************************************************************
注意:不要混淆了 nscd 和 nslcd(local LDAP name service daemon)两个完全不同的服务
********************************************************************************
nslcd(即nss-pam-ldapd)本身包括了一个瘦身版本的 PAM 模块和一个瘦身版本的 NSS 模块,
但您依然可以单独构建这三个部分(NSS 模块,PAM 模块和 nslcd server),这意味着您
依然还可以使用 pam_ldap 套件和使用来自 nss-pam-slapd 套件的NSS模块,但目前此套件
不能与nss_ldap套件在同一个系统中同时并行使用。

nslcd 套件的正式名称是 Daemon for NSS and PAM lookups using LDAP(nss-pam-ldapd),
它最初由PADL软件公司的Luke Howard开发,作为 nss_ldap 的分支,名为 nss-ldapd 套件。
2006年,West Consulting 的  Arthur de Jong 将这个库分成 NSS 部分和 server 部分并
重写了大部分代码。当 OpenLDAP 的 nssov 模块的 Howard Chu…

Linux命令:LVM快照Snapshot备份

常用Linux命令使用技巧:LVM快照Snapshot备份



快照(snapshot)是LVM所提供的一个非常有用的特性。它的原理是复制 Origin 原始卷的
元数据(metadata)来创建一个逻辑卷,并没有复制物理卷上的任何数据, 因此它的创建
过程是实时瞬间完成的。快照是特殊类型的逻辑卷,它含有创建时刻所指定的原始逻辑卷
的完整数据,您可以操作快照而无需担心数据的变更令备份失效.

LVM 快照利用一种称为“写时复制(COW - Copy-On-Write)”的技术来跟踪和维持其数据
的一致性。它的原理比较简单,就是跟踪原始卷上块的改变, 在这些数据被改变之前将
其复制到快照自己的预留空间里(顾名思义称为写时复制)。 当对快照进行读取的时候,
被修改的数据从快照的预留空间中读取,未修改的数据则重定向到原始卷上去读取,因此
在快照的文件系统与设备之间多了一层COW设备。

利用快照您可以冻结一个正在使用中的逻辑卷,然后制作一份冻结时刻的备份,由于这个
备份是具有一致性的,因此非常的适合于用来备份实时系统。例如,您的运行中的数据库
可能即使在备份时刻也是不允许暂停服务的,那么就可以考虑使用LVM的快照模式,然后
再针对此快照来进行文件系统级别或者块设备级别的数据备份。


# lsmod | grep dm;#使用snapshot需要內核模塊dm-snapshot;
# modprobe dm-snapshot;#如有需要,必須先加載此模塊;


# lvs;# 先查看一下目前LV的大小;
------------------------------------------------------------------------------
  LV       VG         Attr   LSize Origin Snap%  Move Log Copy%  Convert
  LogVol00 VolGroup00 -wi-ao 6.88G                                    
  LogVol01 VolGroup00 -wi-ao 1.00G                                    
  LogVol02 VolGroup00 -wi-ao 4.00G�����������������…

如何处理“文件系统超级区块(superblock)大于物理区块数”

(请留意:本文探讨仅及BIOS/MBR架构磁盘及文件系统,其内容或许不适用于UEFI/GPT架构)

在数据中心的运维工作中,可能经常需要将数据从一个硬盘或分区,迁移到另一个硬盘或分区。使用dd命令复制磁盘/分区数据时,则常常遇到原磁盘/分区与目标磁盘/分区大小不一的情况。

如果是从较小的磁盘/分区,复制数据到较大的磁盘/分区,那么可以在dd命令复制完成之后,再用resize2fs命令扩展文件系统的分区表容量,使文件系统的分区表与物理磁盘吻合一致。但是,如果从较大的磁盘/分区复制数据到较小的磁盘/分区,则会遇到很困难很麻烦的情况。

例如,要将数据从一个无分区的原始硬盘(裸设备)复制到一个大小相同但有分区的硬盘上时,或者,要从BIOSRAID/FakeRAID磁盘卷(Volum)迁移数据到SoftwareRAID阵列分区上时,即使原磁盘和目标磁盘的物理容量一样,也会遇到“文件系统超级区块大于物理区块”的问题。

这是因为建立分区本身需要占用部分磁盘空间,因此分区的容量总是小于原始磁盘设备的容量,所以创建于分区(Partition)或SoftwareRAID阵列上的文件系统(Filesystem)的容量大小,与直接创建于原始硬盘或BIOSRAID/FakeRAID磁盘卷上的文件系统的容量大小有细微的差别。

当出现“文件系统超级区块(superblock)大于物理区块数”这种情况时,Linux系统的某些命令,例如resize2fs命令,会认为该文件系统已经损坏,需要进行FSCK修复,因此提示执行e2fsck。如果运气不好,e2fsck不能够顺利修复损坏区块,那么就不能用resize2fs调整超级区块数目,必须重写超级区块,即重新初始化超级区块信息。


本文通过演示案例,重现笔者在运维工作中曾经遭遇到的麻烦,尝试探究其起因并寻求解决方案。为此笔者在一台VirtualBox虚拟主机中建立两个容量同为8G的虚拟磁盘:/dev/sdb和/dev/sdc。

如下是这两个磁盘设备的物理信息:

# dmesg |egrep "sdb|sdc" |grep blocks:
sd 3:0:0:0: [sdb] 16777216 512-byte logical blocks: (8.58 GB/8.00 GiB)
sd 4:0:0:0: [sdc] 16777216 51…