linux 工具集锦


per http://hi.baidu.com/springwu/blog/item/b75f1e4a60819f3a09f7efd9.html

很多命令也是显示Linux性能指标的方法,它报告了许多信息,理解这些信息有一定难度。在此粗略的记录一下。

一、vmstat

procs     -----------memory----------        -------swap--   -----io----  -- -system----     ----cpu----

 r  b       swpd   free   buff  cache              si   so          bi    bo       in    cs              us sy id wa

 1  0      139784  67252  52312 797020    2    5           51    55      758  441           13  5 81  1

(1)进程(procs)信息有两列。r列是可运行进程的数量,b列是阻塞进程的数量。

      r列表示运行和等待CPU时间片的进程数,如果这个数长期大于系统CPU的个数,说明CPU不足,需要增加CPU。

      b列等待资源的进程数,比如正在等待I/O,或内存交换

(2)memory信息有四列。swpd 已用的交换空间数量,free空闲RAM数量,buff缓冲使用的RAM数量

     swpd列表示切换到内存交换区的内存数量(以K为单位)。如果swpd的值不为0,或者比较大,只要si、so的值长期为0,这种情况下一般不用担心,不会影响系统性能。 

(3)swap。交换涉及分页读取或写入磁盘的进程所消耗的所有内存。而Linux所做的是,以小块方式按照需要对磁盘空间进行分页操作

             涉及两列:si 从磁盘分页到内存数量,so从内存到磁盘数量

             ? si列表示由磁盘调入内存,也就是内存进入内存交换区的数量(没理解)。 
             ? so列表示由内存调入磁盘,也就是内存交换区进入内存的数量(没理解)。 

             通常si so 的值都为0,如果si,si 长期不为0,则表示内存不足,需要增加系统内存 

(4)IO.磁盘读写是否忙碌。bi 从磁盘读入块。bo  写入磁盘块。

? Bi列表示从块设备读入数据的总量(即读磁盘)(每秒kb)。 
? Bo列表示写入到块设备的数据总量(即写磁盘)(每秒kb) 
这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大,则表示系统磁盘IO有问题,应该考虑提高磁盘的读写性能。

 

(5)system,提供Linux内核进程管理的繁忙度。in系统中断,cs进程上下文切换

? in列表示在某一时间间隔中观测到的每秒设备中断数。 
? cs列表示每秒产生的上下文切换次数。 
上面这2个值越大,会看到由内核消耗的CPU时间会越多。 

(6)CPU,战时cpu状态的百分比。us,用户模式,sy内核模式,id空间,wa等待IO

? us列显示了用户进程消耗的CPU 时间百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,就需要考虑优化程序或算法。 
? sy列显示了内核进程消耗的CPU时间百分比。Sy的值较高时,说明内核消耗的CPU资源很多。 
根据经验,us+sy的参考值为80%,如果us+sy大于 80%说明可能存在CPU资源不足。 
? id 列显示了CPU处在空闲状态的时间百分比。 
? wa列显示了IO等待所占用的CPU时间百分比。wa值越高,说明IO等待越严重,根据经验,wa的参考值为20%,如果wa超过20%,说明IO等待严重,引起IO等待的原因可能是磁盘大量随机读写造成的,也可能是磁盘或者磁盘控制器的带宽瓶颈造成的(主要是块操作)。 
综上所述,在对CPU的评估中,需要重点注意的是procs项r列的值和CPU项中us、sy和id列的值。 

参考http://itspring.iteye.com/blog/1057300

vmstat 监控 I/O磁盘

jason@client-3:~$ vmstat -d

disk- ------------reads------------ ------------writes----------- -----IO------

       total merged sectors      ms  total merged sectors      ms    cur    sec

jason@client-3:~$ vmstat -d 2 3 |grep sda

sda    18680    333  807472  398308  11092  13471  196840  486740      0    115

sda    18680    333  807472  398308  11097  13487  197008  486740      0    115

sda    18680    333  807472  398308  11097  13487  197008  486740      0    115


 二、sar 工具

 检查CPU性能的第二个工具是sar,sar功能很强大,可以对系统的每个方面进行单独的统计,但是使用sar命令会增加系统开销,不过这些开销是可以评估的,对系统的统计结果不会有很大影响。 

jason@client-3:~$ sar -u 3 5

Linux 2.6.32-32-generic (client-3) 2011年07月06日 _i686_(2 CPU)

18时09分49秒     CPU     %user     %nice   %system   %iowait    %steal     %idle

18时09分52秒     all      1.29      0.16      2.42      0.16      0.00     95.97

18时09分55秒     all      0.82      0.00      1.65      0.00      0.00     97.53

平均时间:     all      2.12      0.03      2.38      0.03      0.00     95.43

对上面每项的输出解释如下: 

(1)%user列显示了用户进程消耗的CPU时间百分比。

(2)%nice列显示了正常运行进程所消耗的CPU时间百分比。

(3)%system列显示出了系统进程消耗CPU时间的百分比。

(4)%iowait列显示出了  IO等待所占用的CPU时间百分比。

(5)%steal列显示了在内存相当紧张的环境下pagein强制对不同的页面进行steal操作。

     %steal 虚拟CPU消耗的时间(http://www.huanxiangwu.com/en/433/linux-cpu-monitor)

     % 管理维护另一个虚拟处理器时,虚拟CPU无意识等待时间百分比(http://www.51testing.com/?271416/viewspace-149128.html)

(6)%idel列现出了CPU处于空闲状态的百分比

最后还有average平均值,需要注意的一点是:第一行的统计信息中包含了sar本身的统计消耗,所以%user列的值会偏高一点,不过,这不会对统计结果产生多大影响

在一个多CPU的系统中,如果程序使用了单线程,会出现这么一个现象,CPU的整体使用率不高,但是系统应用却响应缓慢,这可能是由于程序使用单线程的原因,单线程只使用一个CPU,导致这个CPU占用率为100%,无法处理其它请求,而其它的CPU却闲置,这就导致 了整体CPU使用率不高,而应用缓慢 现象的发生 。 
针对这个问题,可以对系统的每个CPU分开查询,统计每个CPU的使用情况: 

jason@client-3:~$ sar -P 0 3 5

Linux 2.6.32-32-generic (client-3) 2011年07月06日 _i686_(2 CPU)

18时16分05秒     CPU     %user     %nice   %system   %iowait    %steal     %idle

18时16分08秒       0      4.00      0.00      1.33      0.33      0.00     94.33

18时16分11秒       0      5.98      0.00      4.65      0.00      0.00     89.37

18时16分14秒       0      1.34      0.00      1.67      0.00      0.00     96.99

18时16分17秒       0      1.67      0.00      0.67      0.00      0.00     97.67

18时16分20秒       0      2.00      0.00      1.33      0.00      0.00     96.67

平均时间:       0      3.00      0.00      1.93      0.07      0.00     95.00

这个输出是对系统的第一颗CPU的信息统计,需要注意的是,sar对CPU统计是从0开始的。

sar 监控内存

jason@client-3:~$ sar -r 2 3 

Linux 2.6.32-32-generic (client-3) 2011年07月06日 _i686_(2 CPU)

18时35分30秒 kbmemfree kbmemused  %memused kbbuffers      kbcached    kbcommit   %commit

18时35分32秒   1125816    902216          44.49             26648        385656       2136800     35.46

18时35分34秒   1125816    902216           44.49             26648        385656       2136800     35.46

18时35分36秒   1125692    902340           44.49             26656       385656         2137224     35.46

平均时间:        1125775        902257          44.49             26651        385656       2136941     35.46

 (1)kbmemfree表示空间物理内存大小
 (2)kbmemeused表示已使用的物理内存大小
 (3)%memused已使用内存占总内存的百分比
 (4) kbbuffers和kbcached分别表示Buffer Cache和Page Cache的大小
 (5)kbcommit和%commit分别表示应用程序当前使用的内存大小和使用百分比。 

 sar 比free 更直观的给出了百分比,从 %commit看出当前内存资源充足。

 

4.4 通过sar –n组合显示系统的网络运行状态 
sar提供四种不同的选项来显示网络统计信息,通过“-n”选项可以指定4个不同类型的开关:DEV、EDEV、SOCK和FULL。DEV显示网络接口信息,EDEV显示关于网络错误的统计数据,SOCK显示套接字信息,FULL显示所有三个开关。请看下面的一个输出: 

jason@client-3:~$  sar -n DEV 2 3 

Linux 2.6.32-32-generic (client-3) 2011年07月06日 _i686_(2 CPU)

19时19分55秒     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s

19时19分57秒        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00

19时19分57秒      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

19时19分57秒     wlan0      1.00      1.50      0.46      0.11      0.00      0.00      0.00

19时19分57秒  vboxnet0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

19时19分57秒      pan0      0.00      0.00      0.00      0.00      0.00      0.00      0.00

? IFACE表示网络接口设备。 
? rxpck/s表示每秒钟接收的数据包大小。 
? txpck/s表示每秒钟发送的数据包大小。 
? rxkB/s表示每秒钟接收的字节数。 
? txkB/s表示每秒钟发送的字节数。 
? rxcmp/s表示每秒钟接收的压缩数据包。 
? txcmp/s表示每秒钟发送的压缩数据包。 
? rxmcst/s表示每秒钟接收的多播数据包。 

通过“sar –n”的输出,可以清楚的显示网络接口发送、接收数据的统计信息。此外还可以通过“sar -n EDEV 2 3”来统计网络错误信息等。 

iostat工具

查看磁盘

jason@client-3:~$ iostat -d 2 3

Linux 2.6.32-32-generic (client-3) 2011年07月06日 _i686_(2 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn

sda               8.03       214.25        53.93     808176     203440

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn

sda               0.00         0.00         0.00          0          0

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn

sda               0.00         0.00         0.00          0          0

(1)Blk_read/s表示每秒读取的数据块数

(2)Blk_wrtn/s每秒写入的数据块数

(3)Blk_read读取的所有块数

(4)Blk_witn写入的所有块数

这里需要注意的一点是:上面输出的第一项是系统从启动以来到统计时的所有传输信息,从第二次输出的数据才代表在检测的时间段内系统的传输值。 
可以通过Blk_read/s和Blk_wrtn/s的值对磁盘的读写性能有一个基本的了解,如果Blk_wrtn/s值很大,表示磁盘的写操作很频繁,可以考虑优化磁盘或者优化程序,如果Blk_read/s值很大,表示磁盘直接读取操作很多,可以将读取的数据放入内存中进行操作。对于这两个选项的值没有一个固定的大小,根据系统应用的不同,会有不同的值,但是有一个规则还是可以遵循的:长期的、超大的数据读写,肯定是不正常的,这种情况一定会影响系统性能。 
“iostat –x”组合还提供了对每个磁盘的单独统计,如果不指定磁盘,默认是对所有磁盘进行统计,请看下面的一个输出: 

 jason@client-3:~$ iostat  -x /dev/sda 2 3

Linux 2.6.32-32-generic (client-3) 2011年07月06日 _i686_(2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           5.40    0.18    2.68    1.71    0.00   90.02

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util

sda               0.08     3.49    4.60    2.95   198.55    51.56    33.15     0.22   28.89   3.79   2.86

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           4.41    0.49    1.72    0.00    0.00   93.38

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util

sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle

           7.32    0.00    4.39    0.00    0.00   88.29

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util

sda               0.00     0.00    0.00    1.50     0.00    12.00     8.00     0.00    0.00   0.00   0.00

这个输出基本与“sar –d”相同,需要说明的几个选项的含义为: 
? rrqm/s表示每秒进行merged的读操作数目。 
? wrqm/s表示每秒进行 merge 的写操作数目。 
? r/s表示每秒完成读I/O设备的次数。 
? w/s表示每秒完成写I/O设备的次数。 
? rsec/s表示每秒读取的扇区数。 

? wsec/s表示每秒写入的扇区数。 

3.3 vmstat –d组合 
通过“vmstat –d”组合也可以查看磁盘的统计数据。,情况下面的一个输出:

摘自 童剑--系统性能分析和优化

1、性能分析的目的

找出系统性能瓶颈,硬件瓶颈,软件瓶颈,提供性能优化方案,升级硬件,改进系统结构,达到合理的硬件和软件配置,使系统资源使用达到平衡

       但遗憾的是解决一个性能瓶颈,往往又会出现另外的瓶颈或者其他问题,所以性能优化更加切实的目标是做到在一定范围内使系统的各项资源使用趋向合理和保持一定的平衡。

     系统运行良好的时候恰恰也是各项资源达到了一个平衡体,任何一项资源的过渡使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓。比如CPU过渡使用会造成大量进程等待CPU资源,系统响应变慢,等待会造成进程数增加,进程增加又会造成内存使用增加,内存耗尽又会造成虚拟内存使用,使用虚拟内存又会造成磁盘IO增加和CPU开销增加(用于进程切换、缺页处理的CPU开销)

2、性能分析相关的硬件资源

CPU,内存,I/O存储系统,带宽

CPU

1)是否使用SMP

2)单颗CPU的性能对依赖CPU的某些应用的影响很严重,比如数据库的查询处理

内存

1)物理内存

      物理内存不够时会使用交换内存

2)交换内存

   使用交换内存会带来磁盘IO和CPU的开销增加

存储系统

1)SCSI磁盘

2)ATA/SATA磁盘

3)RAID磁盘阵列(RAID0, RAID1, RAID5, RAID0+1)

4)一些经验

   小文件读写的性能瓶颈是磁盘的寻址(随机读写性能更差),评估的标准是tps

   大文件读写的性能瓶颈是带宽,评估的标准是持续的读写速度

   Linux可以利用空闲内存作文件系统访问的cache,因此系统内存越大存储系统的性能也越好

vmstat是一个很全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的IO、中断、上下问切换、CPU使用等。系统性能分析工具中,我使用最多的是这个,除了 sysstat 工具包外,这个工具能查看的系统资源最多。

 3 磁盘I/O性能评估 

在对磁盘I/O性能做评估之前,必须知道的几个方面是: 
? 熟悉RAID存储方式,可以根据应用的不同,选择不同的RAID方式,例如,如果一个应用经常有大量的读操作,可以选择RAID5方式构建磁盘阵列存储数据,如果应用有大量的、频繁的写操作,可以选择raid0存取方式,如果应用对数据安全要求很高,同时对读写也有要求的话,可以考虑raid01存取方式等等。 
? 尽可能用内存的读写代替直接磁盘I/O,使频繁访问的文件或数据放入内存中进行操作处理,因为内存读写操作比直接磁盘读写的效率要高千倍。 
? 将经常进行读写的文件与长期不变的文件独立出来,分别放置到不同的磁盘设备上。 
? 对于写操作频繁的数据,可以考虑使用裸设备代替文件系统。这里简要讲述下文件系统与裸设备的对比: 
使用裸设备的优点有: 
? 数据可以直接读写,不需要经过操作系统级的缓存,节省了内存资源,避免了内存资源争用。 
? 避免了文件系统级的维护开销,比如文件系统需要维护超级块、I-node等。 
? 避免了操作系统的cache预读功能,减少了I/O请求。 
使用裸设备的缺点是: 
? 数据管理、空间管理不灵活,需要很专业的人来操作。 

其实裸设备的优点就是文件系统的缺点,反之也是如此,这就需要我们做出合理的规划和衡量,根据应用的需求,做出对应的策略。 

上面主要讲解了对磁盘I/O的性能评估,其实衡量磁盘I/O好坏是多方面的,有应用程序本身的,也有硬件设计上的,还有系统自身配置的问题等,要解决I /O的瓶颈,关键是要提高I/O子系统的执行效率。例如,首要要从应用程序上对磁盘读写进行优化,能够放到内存执行的操作,尽量不要放到磁盘,同时对磁盘存储方式进行合理规划,选择适合自己的RAID存取方式,最后,在系统级别上,可以选择适合自身应用的文件系统,必要时使用裸设备提高读写性能。

下面接着介绍对磁盘IO的评估标准。 

 

4 网络性能评估 
网络性能的好坏直接影响应用程序对外提供服务的稳定性和可靠性,监控网络性能,可以从以下几个方面进行管理和优化。 
4.1 通过ping命令检测网络的连通性 

如果发现网络反应 缓慢,或者连接中断,可以通过ping来测试网络的连通情况,请看下面的一个输出 

jason@client-3:~$ ping 192.168.1.2

PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.

64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.045 ms

64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.035 ms

64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.035 ms

--- 192.168.1.2 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 1998ms

rtt min/avg/max/mdev = 0.035/0.038/0.045/0.006 ms

在这个输出中,time值显示了两台主机之间的网络延时情况,如果此值很大,则表示网络的延时很大,单位为毫秒。在这个输出的最后,是对上面输出信息的一个总结,packet loss表示网络的丢包率,此值越小,表示网络的质量越高。 

4.2 通过netstat –i组合检测网络接口状况 
netstat命令提供了网络接口的详细信息,请看下面的输出: 

jason@client-3:~$ 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         0      0      0 0             0      0      0      0 BMU

lo        16436 0        54      0      0 0            54      0      0      0 LRU

wlan0      1500 0     13478      0      0 0         14558      0      0      0 BMRU

(1)iface表示网络设备的接口名称
(2)MTU 表是最大传输单元,单位字节
(3)RX-OK/TX-OK表示准确无误的接收/发送了多少包
(4)RX-ERR/TX-ERR表示接收/发送数据包时产生了多少错误
(5)RX-DRP/TX-DRP表示接收/发送数据包时丢弃了多少数据包。
(6)RX-OVR/TX-OVR表示由于误差而遗失了多少数据包
(7)Flg表示接口标记,其中:
    a.L:表示接口是个回环设备
    b.B表示设置了广播地址
    c.M表示接收所有的数据包
    d.R表示接口处于活动状态
    e.O表示该接口上禁止arp
    f.P表示一个点到点的连接

正常情况下,RX-ERR/TX-ERR、RX-DRP/TX-DRP和RX-OVR/TX-OVR的值都应该为0,如果这几个选项的值不为0,并且很大,那么网络质量肯定有问题,网络传输性能也一定会下降。 

当网络传输存在问题是,可以检测网卡设备是否存在故障,如果可能,可以升级为千兆网卡或者光纤网络,还可以检查网络部署环境是否合理。 

4.3 通过netstat –r组合检测系统的路由表信息 

在网络不通,或者网络异常时,首先想到的就是检查系统的路由表信息,“netstat –r”的输出结果与route命令的输出完全相同,请看下面的一个实例: 

jason@client-3:~$ netstat -r

内核 IP 路由表

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface

192.168.1.0     *               255.255.255.0   U         0 0          0 wlan0

link-local      *               255.255.0.0     U         0 0          0 wlan0

default         192.168.1.1     0.0.0.0         UG        0 0          0 wlan0

default项表示系统的默认路由,对应的网络接口为wlan。 
4.4 通过sar –n组合显示系统的网络运行状态  见上方sar 命令
本节通过几个常用的网络命令介绍了对网络性能的评估,事实上,网络问题是简单而且容易处理的,只要我们根据上面给出的命令,一般都能迅速定位问题。解决问题的方法一般是增加网络带宽,或者优化网络部署环境。 
除了上面介绍的几个命令外,排查网络问题经常用到的命令还有traceroute,主要用于跟踪数据包的传输路径,还有nslookup命令,主要用于判断DNS解析信息。

工具介绍 -vmstat

jason@client-3:~$ vmstat 1 5

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa

 0  1 321200 825928  18836 664588   11   34   147   103  954 2025 24 11 61  3

 1  0 321112 825952  18844 664720    0    0     4    16 2830 3520 12  3 84  0

 3  0 321108 825736  18844 664692    0    0     0     0 2521 3694 16  7 77  0

 0  0 321088 825504  18844 664708    0    0     0     0 2938 4375 29  9 62  0

 0  0 321088 825364  18844 664688    0    0     0     0 2953 4278 16  8 76  0


vmstat 是一个很全面的性能分析工具,可以观察到系统的进程

状态、内存使用、虚拟内存使用、磁盘的 IO 、中断、上下问切

换、 CPU 使用等。系统性能分析工具中,我使用最多的是这个

,除了 sysstat 工具包外,这个工具能查看的系统资源最多。

对于 Linux 的性能分析, 100% 理解 vmstat 输出内容的

含义,那你对系统性能分析的能力就算是基本掌握了。

我这里主要说明一下这个命令显示出的部分数据代表的含义,和

它反映出系统相关资源的状况。输出内容共有 6 类,分别说明

如下。

工具介绍 -vmstat

• Vmstat 的输出格式如下 (CentOS 3.3)

工具介绍 -vmstat

• Procs

– r:

运行的和等待 (CPU 时间片 ) 运行的进程

数,这个值也可以判断是否需要增加

CPU( 长期大于 1)

– b:

处于不可中断状态的进程数,常见的情况

是由 IO 引起的

工具介绍 -vmstat

• Memory

– swpd: 切换到交换内存上的内存 ( 默认以 KB 为单位 )

• 如果 swpd 的值不为 0 ,或者还比较大,比如超过 100M 了

,但是 si, so 的值长期为 0 ,这种情况我们可以不用担心,

不会影响系统性能。

– free: 空闲的物理内存

– buff: 作为 buffer cache 的内存,对块设备的读写进行缓

– cache: 作为 page cache 的内存 , 文件系统的 cache

• 如果 cache 的值大的时候,说明 cache 住的文件数多,如果

频繁访问到的文件都能被 cache 住,那么磁盘的读 IO bi 会非

常小。

工具介绍 -vmstat

• Swap

– si: 交换内存使用,由磁盘调入内存

– so: 交换内存使用,由内存调入磁盘

内存够用的时候,这 2 个值都是 0 ,如果这 2 个值长期大

于 0 时,系统性能会受到影响。磁盘 IO 和 CPU 资源都

会被消耗。

我发现有些朋友看到空闲内存 (free) 很少或接近于 0 时,

就认为内存不够用了,实际上不能光看这一点的,还要

结合 si,so ,如果 free 很少,但是 si,so 也很少 ( 大多时

候是 0) ,那么不用担心,系统性能这时不会受到影响的

工具介绍 -vmstat

• Io

– bi: 从块设备读入的数据总量 ( 读磁盘 )

(KB/s) ,

– bo: 写入到块设备的数据总理 ( 写磁盘 ) (KB/s)

随机磁盘读写的时候,这 2 个 值越大(如超出

1M ),能看到 CPU 在 IO 等待的值也会越大

工具介绍 -vmstat

• System

– in: 每秒产生的中断次数

– cs: 每秒产生的上下文切换次数

上面这 2 个值越大,会看到由内核消耗的

CPU 时间会越多

工具介绍 -vmstat

• Cpu

– us: 用户进程消耗的 CPU 时间百分比

• us 的值比较高时,说明用户进程消耗的 CPU 时间多,但是如

果长期超过 50% 的使用,那么我们就该考虑优化程序算法或

者进行加速了 ( 比如 PHP/Perl)

– sy: 内核进程消耗的 CPU 时间百分比

• sy 的值高时,说明系统内核消耗的 CPU 资源多,这并不是良

性的表现,我们应该检查原因。

– wa: IO 等待消耗的 CPU 时间百分比

• wa 的值高时,说明 IO 等待比较严重,这可能是由于磁盘大量

作随机访问造成,也有可能是磁盘的带宽出现瓶颈 ( 块操作 ) 。

– id: CPU 处在空闲状态时间百分比

工具介绍 -vmstat

• 情景分析

这个 vmstat 的输出那些信息值得关注?

– Procs r: 运行的进程比较多,系统很繁忙

– Io bo: 磁盘写的数据量稍大,如果是大文件的写

, 10M 以内基本不用担心,如果是小文件写 2M

以内基本正常

– Cpu us: 持续大于 50 ,服务高峰期可以接受

– Cpu wa: 稍微有些高

– Cpu id: 持续小于 50 ,服务高峰期可以接受

工具介绍 -top

• 用 top 看到的内存的说明 (Mem 的第 2 行 )

– actv

active 活跃的内存页,正在映射给进程使用

– in_d

inactive_dirty 非活跃的内存页,并且内存数据

被修改,需要写回磁盘

– in_c

inactive_clean 非活跃的内存页,干净的数据,

可以被重新分配使用

工具介绍 -top

• 问题?

in_d 和 in_c 以及 cache, buffer 的内存

有何不同?

我的理解:

actv, in_d, in_c 是 VM 中对内存的管理组

织形式, buffer 是块设备读写缓冲, cache

是文件系统缓存

工具介绍 -top

• 用 top 看到的进程所处的几种状态 (STAT 列 ) 。

D 不可中断休眠,通常是 IO 操作所处的状态

R 正在执行的或者处在等待执行的进程队列中

S 休眠中

T 暂停刮起的(比如 Ctrl+Z ),也可能是被 strace 命令调用中

的状态

Z 僵尸进程,进程执行完成,但由于其父进程没有销毁该进程,而

被 init 进程接管进行销毁。

W 没有使用物理内存,所占用的物理内存被切换到交换内存

< 高优先级的进程

N 低优先级

有时候一个进程会有多个状态的标志,比如 SWN , SW

工具介绍 -top

• 情景分析

前面两次 top 的输出那些信息值得关注?

– 图 1)

• Load average: 系统负载有降低的趋势,但仍然较高

• Running: 有 3 个进程正在运行,正常,因为系统有 4 颗

CPU

• Cpu user: 接近 200% 了,有些大,服务高峰时可以接

• Cpu idle: 小于 200% 了,需要注意

– 图 2)

– Cpu iowait: 接近 200% 了,很大

工具介绍 -free

free 命令显示系统内存的使用状况(物理内存

和交换内存)

通过这个命令我们可以看到系统进程实际使用的

物理内存, buffer 和 cache 使用的物理内存

工具介绍 -free

• free 命令输出的第二行 (Mem)

这行分别显示了物理内存的总量 (total) 、已使用的

(used) 、空闲的 (free) 、共享的

(shared) 、 buffer 、 cache 的内存。

工具介绍 -free

• free 命令输出的第三行 (-/+ buffers/cache)

这行最容易让人迷惑。

它显示的第一个值( used 这一列)是这样得来的:

Mem 行 used 列 - Mem 行 buffers 列 - Mem 行

cached 列

它显示的第二个值( free 这一列)是这样得来的:

Mem 行 free 列 + Mem 行 buffers 列 + Mem 行

cached 列

工具介绍 -free

• free 命令输出的第四行 (Swap)

这行显示交换内存的总量、已使用量、

空闲量

通常 buffer 和 cache 可以使用的内

存空间越大,系统 IO 和 文件系统访问

的性能越好。

工具介绍 -uptime

最简便的查看系统负载的工具,系统负载越小,系统

运行状况越好,对于系统负载处在什么范围内比较合

适,我想是没有定论的,我介绍一下我的习惯。

我一般以 15 分钟负载的值来评估系统的健康度,以

10 为这个值的临界点,如果系统负载持续高于 10 ,

通常是存在某个资源长期紧张的原因,我们需要重视

,并且得开始着手解决这个问题了。

如果偶尔高于 10 ,应该开始留意它出现的频度,这

往往是前面一种状况的先兆。

工具介绍 - sysstat 工具包

这个工具包提供了著名的 sar 命令,还有非常实用

的 iostat, mpstat, sa1, sa2 等命令。

这几个命令可实现前面提及工具大多数的功能,除此

之外,还能查看系统的网络带宽状况、每块磁盘使用

状况、每个磁盘分区的使用状况等。

工具介绍 - sysstat 工具包

sa1, sa2 这 2 个命令以配置在 cron 中定期执行,把系统当时的

运行状况信息保存在磁盘上,每日存在一个文件中,因为有这个功

能,因此 sar 工具不单是一个性能分析的工具,这 2 个命令的使

用说明如下:

sa1 配置在 cron 中可以实现系统状态收集,比如 10 分钟运行一

sa2 配置在 cron 中可以实现每日状态的汇总报告

你可以在系统 crontab 中添加如下配置:

*/10 * * * * root /usr/lib/sa/sa1 1 1

53 23 * * * root /usr/lib/sa/sa2 -A

工具介绍 - 其他

• Iozone

IO 和文件系统性能测试的工具,我也习惯用

它作存储系统的性能分析。

• Strace

如果我们知道一个程序执行效率很差,需要

分析这个程序执行时的某个阶段或者某个系统

调用的性能状况,可以使用 strace 命令。

• 其他

动态内容为主的网站

• 分析和优化的过程

初期性能问题及处理

第二次优化

第三次优化

第四次优化

网站结构优化

动态内容为主的网站

• 初期性能问题及处理

– 表现:早晨和下午访问高峰时,服务器频繁宕机,

重启后的一段时间内能正常服务,过一会以后又变

的响应缓慢,然后又宕机。

– 检查:发现宕机前系统负载高, Apache

httpd.conf 配置最大用户数为 1024

– 处理:修改 httpd.conf 配置文件,降到最大

512 个用户数,仍然频繁宕机,又降到 256 个

用户数,系统不宕机了,但是负载很高,站点访问

极慢

动态内容为主的网站

• 初次优化

深入分析系统资源使用情况 (vmstat,top,ps)

– 结论: CPU 资源时常耗尽,因此造成响应缓慢或者长时

间没有响应,主要是用户进程消耗资源严重。

– 原因: PHP 程序没有使用代码加速,网站首页是个 PHP

程序,每次用户访问都要多次查询数据库,其他程序也

没有 Cache 机制,数据库查询负荷过高。

– 处理:安装配置 turck-mmcache 代码加速器,改写网

站首页以及部分频繁访问的程序增加 cache 机制,减少

数据库访问。

动态内容为主的网站

• 第二次优化

一段时间后,系统又开始不稳定,访问高峰时站点无

法正常访问

– 分析系统资源使用状况,发现仍然是 CPU 耗尽后引起问题,

但这次系统 IO 等待消耗的 CPU 资源比较大。

– 原因:上次解决了 CPU 资源容易耗尽的问题,目前网站访问

量增加了, apache 进程数时常达到 256 个,导致内存使用

殆尽,频繁使用交换内存,最终仍然导致 CPU 资源耗尽

– 处理:把 Apache 配置中的 KeepAlive 特性关闭,进程数

大量减少,基本保持在 80 个进程以内,还是会使用交换内

存,但是服务正常了。

动态内容为主的网站

• 第三次优化

一段时间后,系统又开始不稳定,访问高峰时站点无

法正常访问

– 分析发现还是 CPU 资源耗尽导致的原因。

– 原因:程序频繁访问数据库,大量的 SQL 语句中有 where,

order by 等子句,而大量的表没有建索引,导致 MySQL

数据库负荷过高,消耗 CPU 资源过高。

– 处理:优化程序中的 SQL 语句, where 和 order by 子句

上的字段建索引,程序增加 Cache 机制,再次使服务恢复正

常。

动态内容为主的网站

• 第四次优化

一段时间后,系统又开始不稳定,访问高峰时站

点无法正常访问

– 分析系统资源使用状况,发现还是 CPU 耗尽造成的

– 原因:数据库查询过多,大部分都是复杂查询,时常

需要遍历全表

– 处理:优化程序中的 SQL 语句,增加 where 子句上

的匹配条件,减少遍历全部的查询。

动态内容为主的网站

• 网站结构优化

– 鉴于程序的优化空间越来越小,避免以后仍

然出现问题,增加了一台专用数据库服务器

– 在后来的使用过程中,又陆续增加了 1 台

Web 前端服务器,和一台只用于读的

MySQL 数据库服务器

动态内容 +Cache 为主的网

• 该网站系统结构说明

– 多台 Web 前端服务器 , 配置都为单颗

Xeon 3.0G CPU , 4G 内存, 2 块 73G

SCSI 磁盘

– 操作系统 CentOS 3.3

– 多台 MySQL 数据库服务器

– 基于 PHP 开发的应用

动态内容 +Cache 为主的网

• 该应用的特点

– 大量内容基于数据库,需要频繁访问数据库,并

且数据更新很快

– 采用页面 cache 机制缓解数据库压力,但页面

cache 只有 5 分钟有效期,需要频繁生成新的

cache

– Cache 以文件形式存在磁盘上,都是小文件,最

小不到 1k ,最大不超过 128k

动态内容 +Cache 为主的网站

• 问题描述

– 访问高峰期时 Web 前端负载比较高,时常超过 10

– 访问高峰期时 Web 前端响应很慢

• 性能分析

– 负载比较高,时常会超过 10 , CPU Idel 经常会小于

30% ,有时 Idel 为 0 , CPU io wait 很大,经常超过

30% ,磁盘读每秒不超过 100k ,磁盘写每秒 1.5M 左右,

磁盘 tps 超过 100

– 访问高峰期时内存也有部分空闲,用于 buffer 和 cache 的

内存基本占总内存 60% 以上,没有使用交换内存

动态内容 +Cache 为主的网站

• 原因分析

– 分析该应用的特点后发现,访问高峰期时,要频繁生成新的

cache 文件,或者更新以及过期的 cache 文件, cache 文

件目录为 256x256 的哈希结构,因此读写文件时磁盘随机

寻址非常频繁

– 该应用磁盘写远大于磁盘读的原因是系统 cache 命中率高,

大量文件读过一次就 cache 住了,因此读的开销很小

– 写磁盘的量并不算很大,平均每秒 1.5M ,但都是随机写,

因此写磁盘速度会稍微慢,也因此会消耗大量 CPU 时间

– 对比访问高峰期和访问量小时候的系统状态,磁盘写的 tps

提高了 1 倍以上, CPU io wait 提高了 3 倍以上,因此认为

主要性能瓶颈在磁盘写上

动态内容 +Cache 为主的网站

• 优化办法

– 减少磁盘写的次数, cache 文件先写在内存中,超过一定访

问次数时才写回磁盘,但由于要修改应用程序,因此执行难

度大

– 减少磁盘随机写的次数,前端不使用 255x255 的哈希目录

,而是把多个 cache 文件写在一个大的 cache 文件中,并

且只作追加写,这样就能把随机写变成了顺序写, cache 过

期后,整个大的 cache 文件可以一次删除。但由于要修改应

用,因此执行难度大

– 上面 2 个办法结合使用,听上去性能会更好,但是执行难度

更大

动态内容 +Cache 为主的网站

• 优化办法

– 使用 tmpfs 作 cache 磁盘 (ramdisk 也可以 ) ,这样

写都在访问内存,没有磁盘 IO 消耗,缺点是 cache

的空间不会很大,不能超过 2G( 该服务器是 4G 内

存 ) ,但是不用修改应用程序,执行容易:

• Mount –bind /dev/shm /var/www/cache

• 写一个清 cache 的脚本程序,配置在 cron 中, 30 分钟执

行一次,检查 /dev/shm 的使用率超过 70% 时,使用 find

命令找出太旧的 cache 文件删除掉

最终采用了这个办法,高峰期系统负载小于 5

相关的参考资料

• Red Hat Enterprise Linux Introduction to System

Administration

http://www.redhat.com/docs/manuals/enterprise/RHEL-4-

Manual/admin-guide/

• Sysstat 工具集

http://freshmeat.net/projects/sysstat/

• 其他查看系统的 man 手册

参考文档http://www.ylmf.net/linux/tips/2010120813693.html




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值