当前位置:文档之家› linux系统性能优化及瓶颈分析

linux系统性能优化及瓶颈分析

linux系统性能优化及瓶颈分析
linux系统性能优化及瓶颈分析

linux系统性能优化及瓶颈分析

一,用vmstat分析系统I/O情况

[root@localhost ~]# vmstat -n 3 (每个3秒刷新一次)

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

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

1 0 144 186164 105252

2386848 0 0 18 166 83 2 48 21 31 0

2 0 144 189620 105252

2386848 0 0 0 177 1039

1210 34 10 56 0

0 0 144 214324 105252

2386848 0 0 0 10 1071 670 32 5 63 0

0 0 144 202212 105252

2386848 0 0 0 189 1035 558 20 3

77 0

2 0 144 158772 105252

2386848 0 0 0 203 1065

2832 70 14 15 0

IO

-bi:从块设备读入的数据总量(读磁盘)(KB/S)

-bo:写入到块设备的数据总量(写磁盘)(KB/S)

随机磁盘读写的时候,这2个值越大(如超出1M),能看到CPU在IO等待的值也会越大

二,用iostat分析I/O子系统情况

如果你的系统没有iostat,sar,mpstat等命令,安装sysstat-

7.0.2-1.el5.i386.rpm包,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU 使用情况。同vmstat

一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。

iostat的语法如下:

程序代码

iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ]

-c为汇报CPU的使用情况;

-d为汇报磁盘的使用情况;

-k表示每秒按kilobytes字节显示数据;

-t为打印汇报的时间;

-v表示打印出版本信息和用法;

-x device指定要统计的设备名称,默认为所有的设备;

interval指每次统计间隔的时间;

count指按照这个时间间隔统计的次数。

iostat在内核2.4和内核2.6中数据来源不太一样,对于kernel 2.4, iostat 的数据的主要来源是 /proc/partitions;在2.6中,数据来源主要是

/proc/diskstats和/sys/block/sd*/stat这两个文件

#cat /proc/diskstats | grep sda

8 0 sda 17945521 1547188 466667211 174042714 15853874

42776252 469241932 2406054445 0 137655809 2580960422

8 1 sda1 936 1876 6

12

8 2 sda2 19489178 466659986 58655070 469240224

8 3 sda3 1270 1441 33

264

8 4 sda4 4 8

0 0

8 5 sda5 648 1442 0

8 6 sda6 648 1442 0

第1列 : 磁盘主设备号(major)

第2列 : 磁盘次设备号(minor)

第3列 : 磁盘的设备名(name)

第4列 : 读请求总数(rio)

第5列 : 合并的读请求总数(rmerge)

第6列 : 读扇区总数(rsect)

第7列 : 读数据花费的时间,单位是ms.(从__make_request到end_that_request_last)(ruse)

第8列 : 写请求总数(wio)

第9列 : 合并的写请求总数(wmerge)

第10列 : 写扇区总数(wsect)

第11列 : 写数据花费的时间,单位是ms. (从__make_request到end_that_request_last)(wuse)

第12列 : 现在正在进行的I/O数(running),等于I/O队列中请求数

第13列 : 系统真正花费在I/O上的时间,除去重复等待时间(aveq)

第14列 : 系统在I/O上花费的时间(use)。

#iostat -x 1

Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/27/2009

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

30.72 0.00 5.00 5.72 0.00 58.56 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util

sda 0.79 21.81 9.15 8.08 237.99 2 39.29 27.69 1.32 76.31 4.07 7.

02

sdb 0.69 19.13 3.26 2.99 153.08 176.92 52.85 0.43 68.80 5.96 3 .72

sdc 3.47 89.30 10.95 7.30 213.30 7 72.94 54.04 1.32 72.43 4.18 7.

63

每项数据的含义如下,

rrqm/s: 每秒进行 merge 的读操作数目。即 rmerge/s

wrqm/s: 每秒进行 merge 的写操作数目。即 wmerge/s

r/s: 每秒完成的读 I/O 设备次数。即 rio/s

w/s: 每秒完成的写 I/O 设备次数。即 wio/s

rsec/s: 每秒读扇区数。即 rsect/s

wsec/s: 每秒写扇区数。即 wsect/s

rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512

字节。

wkB/s: 每秒写K字节数。是 wsect/s 的一半。

avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。即

(rsect+wsect)/(rio+wio)

avgqu-sz: 平均I/O队列长度。即 aveq/1000 (因为aveq的单位为毫秒)。await: 平均每次设备I/O操作的等待时间 (毫秒)。即

(ruse+wuse)/(rio+wio)

svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 use/(rio+wio) %util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间

I/O队列是非空的,即use/1000 (因为use的单位为毫秒),

如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该

磁盘可能存在瓶颈。

svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。

await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。

队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。

io/s = r/s +w/s

await=(ruse+wuse)/io(每个请求的等待时间)

await*io/s=每秒内的I/O请求总共需要等待的ms

avgqu-sz=await*(r/s+w/s)/1000(队列长度)

以下数据其实与/proc/diskstats中除设备号与设备名外的其它数据是一一对应关系,只是统计的方法略有差别而已。

#cat /sys/block/sda/stat

17949157 1547772 466744707 174070520 15855905 42781288 469298468 2406092114 2 137680700 2581025934

三,sar -b 监控I/O

#sar -b 1 10

Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/29/2009

12:19:40

AM tps rtps wtps bread/s bwrtn /s

12:19:42

AM 21.48 9.40 12.08 187.92 429.53

12:19:43

AM 14.00 14.00 0.00 840.00 0.00 12:19:44

AM 10.29 8.82 1.47 235.29 217.65 12:19:45

AM 12.87 10.89 1.98 752.48 142.57

12:19:46

AM 19.82 12.61 7.21 425.23 381.98 12:19:47

AM 19.00 19.00 0.00 512.00 0.00 12:19:49

AM 9.29 9.29 0.00 262.86 0.00 12:19:50

AM 16.00 5.00 11.00 144.00 536.00 12:19:51

AM 17.65 8.82 8.82 211.76 235.29 12:19:52

AM 41.41 29.29 12.12 614.14 363.64 Average: 17.75 12.30 5.45 397.19 231.99

-tps:每秒钟对磁盘发送transfer的总数,一个transfer就是一个I/O,多个逻辑请求组合成一个对磁盘的I/O请求,一个transfer的大小不确定。

-rtps:每秒钟的物理读的总数

-wtps:每秒钟的物理写的总数

-bread/s:每秒钟从磁盘读取的数据总数

-bwrtn/s:每秒钟写入磁盘的数据的总数

四,sar -d 1 10

Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/29/2009

12:38:56 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util

12:38:57 AM dev8-

0 15.00 232.00 0.00 15.47 0.01

0.87 0.87 1.30

12:38:57 AM dev8-

16 6.00 80.00 320.00 66.67 0.05

8.67 8.67 5.20

12:38:57 AM dev8-

32 10.00 224.00 0.00 22.40 0.09

9.20 9.20 9.20

tps:每秒钟对磁盘发送transfer的总数,一个transfer就是一个I/O,多个逻辑请求组合成一个对磁盘的I/O请求,一个transfer的大小不确定

rd_sec/s

每秒钟读取的扇区数,每个扇区512 bytes.

wr_sec/s

每秒钟写入的扇区数,每个扇区512 bytes.

avgrq-sz

对磁盘请求的扇区的平均大小。

avgqu-sz

对磁盘请求的平均队列长度.

await

请求响应的平均时间(毫秒).包括在请求

队列中的时间和响应消耗时间

svctm

对IO请求的服务时间.

%util

I/O请求占用的CPU时间百分比。

Linux命令----分析内存的瓶颈

为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方

式:Buffer Cache和Page Cache.前者针对磁盘块的读写,后者针对文件inode 的读写.这些Cache有效缩短了I/O系统调用(比如 read,write,getdents)的时间.

内存活动基本上可以用3个数字来量化:活动虚拟内存总量,交换(swapping)率和调页(paging)率.其中第一个数字表明内存的总需求量,后两个数字表示那些内存中有多少比例正处在使用之中.目标是减少内存活动或增加内存量,直到调页率保持在一个可以接受的水平上为止.

活动虚拟内存的总量(VM)=实际内存大小(size of real memory)(物理内存)+使用的交换空间大小(amount of swap space used) 当程序运行需要的内存大于物理内存时,UNIX系统采用了调页机制,即系统copy一些内存中的页面到磁盘上,腾出来空间供进程使用。

大多数系统可以忍受偶尔的调页,但是频繁的调页会使系统性能急剧下降。UNIX内存管理:UNIX系统通过2种方法进行内存管理,“调页算法”,“交换技术”。

调页算法是将内存中最近不常使用的页面换到磁盘上,把常使用的页面(活动页面)保留在内存中供进程使用。

交换技术是系统将整个进程,而不是部分页面,全部换到磁盘上。正常情况下,系统会发生一些交换过程。

当内存严重不足时,系统会频繁使用调页和交换,这增加了磁盘I/O的负载。进一步降低了系统对作业的执行速度,即系统I/O资源问题又会影响到内存资源的分配。

Unix的虚拟内存

Unix的虚拟内存是一个十分复杂的子系统,它实现了进程间代码与数据共享机制的透明性,并能够分配比系统现有物理内存更多的内存,某些操作系统的虚存甚至能通过提供缓存功能影响到文件系统的性能,各种风格的UNIX的虚存的实现方式区别很大,但都离不开下面的4个概念。

1:实际内存

实际内存是指一个系统中实际存在的物理内存,称为RAM。实际内存是存储临时数据最快最有效的方式,因此必须尽可能地分配给应用程序,现在的RAM的形式有多种:SIMM、DIMM、Rambus、DDR等,很多RAM都可以使用纠错机制(ECC)。

2:交换空间

交换空间是专门用于临时存储内存的一块磁盘空间,通常在页面调度和交换进程数据时使用,通常推荐交换空间的大小应该是物理内存的二到四倍。

3:页面调度

页面调度是指从磁盘向内存传输数据,以及相反的过程,这个过程之所以被称为页面调度,是因为Unix内存被平均划分成大小相等的页面;通常页面大小为4KB和8KB(在Solaris中可以用pagesize命令查看)。当可执行程序开始运行时,它的映象会一页一页地从磁盘中换入,与此类似,当某些内存在一段时间内空闲,就可以把它们换出到交换空间中,这样就可以把空闲的RAM交给其他需要它的程序使用。

4:交换

页面调度通常容易和交换的概念混淆,页面调度是指把一个进程所占内存的空闲部分传输到磁盘上,而交换是指当系统中实际的内存已不够满足新的分配需求时,把整个进程传输到磁盘上,交换活动通常意味着内存不足。

[root@localhost ~]# vmstat -n 3 (每个3秒刷新一次)

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

r b swpd free buff cache si so bi bo in cs us sy id wa 1 0 144 186164 105252

2386848 0 0 18 166 83 2 48 21 31 0

2 0 144 189620 105252

2386848 0 0 0 177 1039

1210 34 10 56 0

0 0 144 214324 105252

2386848 0 0 0 10 1071 670 32 5

63 0

0 0 144 202212 105252

2386848 0 0 0 189 1035 558 20 3

77 0

2 0 144 158772 105252

2386848 0 0 0 203 1065

2832 70 14 15 0

MEMORY

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

如果SWAP的值不为0,或者还比较大,比如超过100M了,但是SI,SO的值长期为0,这种情况我们可以不用担心,不会影响系统性能。-free:空闲的物理内存

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

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

如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。

SWAP

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

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

内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。

我发现有些朋友看到空闲内存(FREE)很少的或接近于0时,就认为内存不够用了,实际上不能光看这一点,Linux是抢占内存式的OS,还要结合si,so,如果free很少,但是si,so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

Linux命令----分析CPU的瓶颈

衡量CPU性能的指标:

1,用户使用CPU的情况;

CPU运行常规用户进程

CPU运行niced process

CPU运行实时进程

2,系统使用CPU情况;

用于I/O管理:中断和驱动

用于内存管理:页面交换

用户进程管理:进程开始和上下文切换

3,WIO:用于进程等待磁盘I/O而使CPU处于空闲状态的比率。

4,CPU的空闲率,除了上面的WIO以外的空闲时间

5,CPU用于上下文交换的比率

6,nice

7,real-time

8,运行进程队列的长度

9,平均负载

Linux中常用的监控CPU整体性能的工具有:

? mpstat: mpstat 不但能查看所有CPU的平均信息,还能查看指定CPU的信息。

? vmstat:只能查看所有CPU的平均信息;查看cpu队列信息;

? iostat: 只能查看所有CPU的平均信息。

? sar:与mpstat 一样,不但能查看CPU的平均信息,还能查看指定CPU的信息。

? top:显示的信息同ps接近,但是top可以了解到CPU消耗,可以根据用户指定的时间来更新显示。

下面一一介绍:

一,vmstat

[root@localhost ~]#vmstat -n 3 (每个3秒刷新一次)

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

r

b swpd free buff cache si so

bi bo in cs us sy id wa

10 144 186164 105252

2386848 0 0 18 166 83 2 48 21 31 0

20 144 189620 105252

2386848 0 0 0 177 1039

1210 34 10 56 0

00 144 214324 105252

2386848 0 0 0 10 1071 670 32 5

63 0

00 144 202212 105252

2386848 0 0 0 189 1035 558 20 3 77 0

20 144 158772 105252

2386848 0 0 0 203 1065

2832 70 14 15 0

红色内容标示CPU相关的参数PROC(ESSES)

--r:如果在processes中运行的序列(process r)是连续的大于在系统中的CPU 的个数表示系统现在运行比较慢,有多数的进程等待CPU.

如果r的输出数大于系统中可用CPU个数的4倍的话,则系统面临着CPU短缺的问题,或者是CPU的速率过低,系统中有多数的进程在等待CPU,造成系统中进程运行过慢.

SYSTEM

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

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

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

CPU

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

us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速(比如PHP/PERL)

-sy:内核进程消耗的CPU时间百分比(sy的值高时,说明系统内核消耗的CPU

资源多,这并不是良性表现,我们应该检查原因)

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

wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

-id:CPU处于空闲状态时间百分比,如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us) 系统则面临着CPU资源的短缺.

相关主题
文本预览
相关文档 最新文档