Let's Go!

Linux 性能监控分析(一) (转)

上一篇 / 下一篇  2011-12-14 18:39:35 / 个人分类:系统相关&实用技巧

Linux 性能监控分析



详细出处参考:http://www.jb51.net/LINUXjishu/34607.html


       系统由若干子系统构成,通常修改一个子系统有可能影响到另外一个子系统,甚至会导致整个系统不稳定、崩溃。所以说优化、监测、测试通常是连在一起的,而且是一个循环而且长期的过程,通常监测的子系统有以下这些:

(1).      CPU

(2).      Memory

(3).      IO

(4).      Network

       这些子系统互相依赖,了解这些子系统的特性,监测这些子系统的性能参数以及及时发现可能会出现的瓶颈对系统优化很有帮助。

1.1  应用类型

       不同的系统用途也不同,要找到性能瓶颈需要知道系统跑的是什么应用、有些什么特点,比如 web server 对系统的要求肯定和 file server 不一样,所以分清不同系统的应用类型很重要,通常应用可以分为两种类型:

       (1)IO 相关,IO 相关的应用通常用来处理大量数据,需要大量内存和存储,频繁 IO 操作读写数据,而对 CPU 的要求则较少,大部分时候 CPU 都在等待硬盘,比如,数据库服务器、文件服务器等。

       (2)CPU 相关,CPU 相关的应用需要使用大量 CPU,比如高并发的 web/mail 服务器、图像/视频处理、科学计算等都可被视作 CPU 相关的应用。

看看实际中的例子,第1个是文件服务器拷贝一个大文件时表现出来的特征:

$ vmstat 1procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 0  4    140 1962724 335516 4852308  0    0   388 65024 1442  563  0  2 47 52  0 0  4    140 1961816 335516 4853868  0    0   768 65536 1434  522  0  1 50 48  0 0  4    140 1960788 335516 4855300  0    0   768 48640 1412  573  0  1 50 49  0 0  4    140 1958528 335516 4857280  0    0  1024 65536 1415  521  0  1 41 57  0 0  5    140 1957488 335516 4858884  0    0   768 81412 1504  609  0  2 50 49  0 第2个是 CPU 做大量计算时表现出来的特征:

$ vmstat 1procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 4  0    140 3625096 334256 3266584  0    0     0    16 1054  470 100 0  0  0  0 4  0    140 3625220 334264 3266576  0    0     0    12 1037  448 100 0  0  0  0 4  0    140 3624468 334264 3266580  0    0     0   148 1160  632 100 0  0  0  0 4  0    140 3624468 334264 3266580  0    0     0     0 1078  527 100 0  0  0  0 4  0    140 3624712 334264 3266580  0    0     0    80 1053  501 100 0  0  0  0       上面两个例子最明显的差别就是 id 一栏,代表 CPU 的空闲率,拷贝文件时候 id 维持在 50% 左右,CPU 大量计算的时候 id 基本为 0。

1.2  底线

       事先建立一个底线,如果性能监测得到的统计数据跨过这条线,我们就可以说这个系统性能差,如果数据能保持在线内我们就说性能好。建立这样底线需要知道一些理论、额外的负载测试和系统管理员多年的经验。如果自己没有多年的经验,有一个简单划底线的办法就是:把这个底线建立在自己对系统的期望上。自己期望这个系统有个什么样的性能,这是一个底线,如果没有达到这个要求就是性能差。

1.3  监测工具

工具
 简单介绍
 
top
 查看进程活动状态以及一些系统状况
 
vmstat
 查看系统状态、硬件和系统信息等
 
iostat
 查看CPU 负载,硬盘状况
 
sar
 综合工具,查看系统状况
 
mpstat
 查看多处理器状况
 
netstat
 查看网络状况
 
iptraf
 实时网络状况监测
 
tcpdump
 抓取网络数据包,详细分析
 
mpstat
 查看多处理器状况
 
tcptrace
 数据包分析工具
 
netperf
 网络带宽工具
 
dstat
 综合工具,综合了 vmstat, iostat, ifstat, netstat 等多个信息
 


 

vmstat 是报告关于进程,内存,IO,CPU活动的一个统计报告。

在不同的系统中,特别是linux和unix中显示的相关选项会有很大差别。

我们先以ubuntu为例:

一般VMSTAT工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数。

1
2
3
4
5
6
7
8
9
ipcpu@ubuntu:~$vmstat5 10
procs-----------memory-------------swap-------io-----system------cpu----
r b swpdfreebuff cache si so bi boincs us syidwa
1 0 0 6797712 147668 884660 0 0 3 21 162 146 1 1 98 0
0 0 0 6797696 147668 884660 0 0 0 3 35 37 1 0 99 0
1 0 0 6797332 147668 884660 0 0 0 24 62 95 1 0 99 0
0 0 0 6811632 147668 884692 0 0 0 5 25 26 1 0 99 0
0 0 0 6818360 147668 884704 0 0 0 5 70 265 1 3 96 0
0 0 0 6817468 147668 884728 0 0 0 316 253 474 3 2 95 0

procs相关选项: 
r    在运行队列中等待的进程数
b    在等待io的进程数

memoy 
swapd    现时可用的交换内存(k表示)
free    空闲的内存(k表示)
buff    作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
cache    作为page cache的内存数量,一般作为文件系统的cache,

如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。

swap
si     由内存进入内存交换区数量。
so    由内存交换区进入内存数量。
如今的大内存也让swap渐渐淡出了人们的视线,这个不好分析。

IO
bi     从块设备读入数据的总量(读磁盘)(每秒kb)。
bo     向块设备写入数据的总量(写磁盘)(每秒kb)

system 显示采集间隔内发生的中断数
in     列表示在某一时间间隔中观测到的每秒设备中断数。
cs    列表示每秒产生的上下文切换次数。

如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。

cpu相关状态
cs[user]    用户进程消耗的CPU时间百分比
sy[system]    内核进程消耗的CPU时间百分比
id[idle]    cpu空闲的时间
wa[wait]    IO等待消耗的CPU时间百分比

us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
us+sy 大于 80%说明可能存在CPU不足。
wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带
宽瓶颈造成的(主要是块操作)。wa长期超过10% 就该考虑了。

*注意:
NFS由于是在内核里面运行的,所以NFS活动所占用的cpu时间反映在sy里面。这个数字经常很大的话,就需要注意是否某个内核进程,比如NFS任务比较繁重。如果us和sy同时都比较大的话,就需要考虑将某些用户程序分离到另外的服务器上面,以免互相影响。

CPU问题现象:
1) 如果在processes中运行的序列(process r)是连续的大于在系统中的CPU的个数表示系统现在运行比较慢,有多数的进程等待CPU。
2) 如果r的输出数大于系统中可用CPU个数的4倍的话,则系统面临着CPU短缺的问题,或者是CPU的速率过低,系统中有多数的进程在等待CPU,造成系统中进程运行过慢。
3) 如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us) 系统则面临着CPU资源的短缺。

解决办法:
当发生以上问题的时候请先调整应用程序对CPU的占用情况。使得应用程序能够更有效的使用CPU。同时可以考虑增加更多的CPU。
关于CPU的使用情况还可以结合mpstat,   ps aux top   prstat等等一些相应的命令来综合考虑关于具体的CPU的使用情况,和那些进程在占用大量的CPU时间。一般情况下,应用程序的问题会比较大一些。比 如一些SQL语句不合理等等都会造成这样的现象。

Unix中的vmstat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
freebsd7.2中的vmstat
[
ipcpu@freebsd ~]$ vmstat
procs memory page disk faults cpu
r b w avm fre flt repipo fr sr ad4 in sy cs us sy id
000152M 7448M131000132001676448600199
[ipcpu@freebsd ~]$  

AIX5.3中的vmstat-bash-3.00
$ vmstat  
System
configuration:lcpu=4mem=1904MB  
kthr memory page faults cpu
---------------------------------------------------------------
r b avm fre repipo fr sr cy in sy cs us sy id wa
113086795531000001094450133311980

-
bash-3.00$  
SunOS5.10的vmstat  -
bash-3.00$ vmstat
kthr memory page disk faults cpu
r b w swap free re mfpipo fr de sr s0 s1 s2 s5 in sy cs us sy id
000258472026653443101000000004952492350099-bash-3.00$

这里稍微介绍下page相关选项:
re    回收的页面
mf    非严重错误的页面
pi    进入页面数(k表示)
po    出页面数(k表示)
fr    空余的页面数(k表示)
de    提前读入的页面中的未命中数
sr    通过时钟算法扫描的页面

Tips小提示Linux的块设备和字符设备
他们根本区别在于是否可以被随机访问——换句话说就是,能否在访问设备时随意地从一个位置跳转到另一个位置。

举个例子,键盘这种设备提供的就是一个数据流,只能按照你敲击的字母顺序进行录入,所以键盘就是一种典型的字符设备。

硬盘设备的驱动可能要求读取磁盘上任意块的内容,然后又转去读取别的块的内容,而被读取的块在磁盘上位置不一定要连续,所以说硬盘可以被随机访问,而不是以流的方式被访问,显然它是一个块设备。


  

 

二. CPU

       CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,比如拷贝一个文件通常占用较少 CPU,因为大部分工作是由 DMA(Direct Memory Access)完成,只是在完成拷贝以后给一个中断让 CPU 知道拷贝已经完成;科学计算通常占用较多的 CPU,大部分计算工作都需要在 CPU 上完成,内存、硬盘等子系统只做暂时的数据存储工作。要想监测和理解 CPU 的性能需要知道一些的操作系统的基本知识,比如:中断、进程调度、进程上下文切换、可运行队列等。    这里用个例子来简单介绍一下这些概念和他们的关系,CPU每时每刻都有工作在做(进程、线程)并且自己有一张工作清单(可运行队列),由老板(进程调度)来决定他该干什么,他需要和老板沟通以便得到老板的想法并及时调整自己的工作(上下文切换),部分工作做完以后还需要及时向老板汇报(中断),所以打工仔(CPU)除了做自己该做的工作以外,还有大量时间和精力花在沟通和汇报上。

       CPU 也是一种硬件资源,和任何其他硬件设备一样也需要驱动和管理程序才能使用,我们可以把内核的进程调度看作是 CPU 的管理程序,用来管理和分配 CPU 资源,合理安排进程抢占 CPU,并决定哪个进程该使用 CPU、哪个进程该等待。操作系统内核里的进程调度主要用来调度两类资源:进程(或线程)和中断,进程调度给不同的资源分配了不同的优先级,优先级最高的是硬件中断,其次是内核(系统)进程,最后是用户进程。每个 CPU 都维护着一个可运行队列,用来存放那些可运行的线程。线程要么在睡眠状态(blocked 正在等待 IO)要么在可运行状态,如果 CPU 当前负载太高而新的请求不断,就会出现进程调度暂时应付不过来的情况,这个时候就不得不把线程暂时放到可运行队列里。

可以从以下几个方面监控CPU的信息:

(1)中断;

(2)上下文切换;

(3)可运行队列;

(4)CPU 利用率。

2.1 底线

通常我们期望我们的系统能到达以下目标:

       (1)CPU 利用率,如果 CPU 有 100% 利用率,那么应该到达这样一个平衡:65%-70% User Time,30%-35% System Time,0%-5% Idle Time;

       (2)上下文切换,上下文切换应该和 CPU 利用率联系起来看,如果能保持上面的 CPU 利用率平衡,大量的上下文切换是可以接受的;

       (3)可运行队列,每个可运行队列不应该有超过1-3个线程(每处理器),比如:双处理器系统的可运行队列里不应该超过6个线程。

2.2  vmstat

       vmstat 是个查看系统整体性能的小工具,小巧、即使在很 heavy 的情况下也运行良好,并且可以用时间间隔采集得到连续的性能数据。

$ vmstat 1procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 2  1    140 2787980 336304 3531996  0    0     0   128 1166 5033  3  3 70 25  0 0  1    140 2788296 336304 3531996  0    0     0     0 1194 5605  3  3 69 25  0 0  1    140 2788436 336304 3531996  0    0     0     0 1249 8036  5  4 67 25  0 0  1    140 2782688 336304 3531996  0    0     0     0 1333 7792  6  6 64 25  0 3  1    140 2779292 336304 3531992  0    0     0    28 1323 7087  4  5 67 25  0参数介绍:

(1).      r,可运行队列的线程数,这些线程都是可运行状态,只不过 CPU 暂时不可用;

(2).      b,被 blocked 的进程数,正在等待 IO 请求;

(3).      in,被处理过的中断数

(4).      cs,系统上正在做上下文切换的数目

(5).      us,用户占用 CPU 的百分比

(6).      sys,内核和中断占用 CPU 的百分比

(7).      wa,所有可运行的线程被 blocked 以后都在等待 IO,这时候 CPU 空闲的百分比

(8).      id,CPU 完全空闲的百分比

举两个现实中的例子来实际分析一下:

$ vmstat 1procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 4  0    140 2915476 341288 3951700  0    0     0     0 1057  523 19 81  0  0  0 4  0    140 2915724 341296 3951700  0    0     0     0 1048  546 19 81  0  0  0 4  0    140 2915848 341296 3951700  0    0     0     0 1044  514 18 82  0  0  0 4  0    140 2915848 341296 3951700  0    0     0    24 1044  564 20 80  0  0  0 4  0    140 2915848 341296 3951700  0    0     0     0 1060  546 18 82  0  0  0从上面的数据可以看出几点:

(1).      interrupts(in)非常高,context switch(cs)比较低,说明这个 CPU 一直在不停的请求资源;

(2).      user time(us)一直保持在 80% 以上,而且上下文切换较低(cs),说明某个进程可能一直霸占着 CPU;

(3).      run queue(r)刚好在4个。

$ vmstat 1procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st14  0    140 2904316 341912 3952308  0    0     0   460 1106 9593 36 64  1  0  017  0    140 2903492 341912 3951780  0    0     0     0 1037 9614 35 65  1  0  020  0    140 2902016 341912 3952000  0    0     0     0 1046 9739 35 64  1  0  017  0    140 2903904 341912 3951888  0    0     0    76 1044 9879 37 63  0  0  016  0    140 2904580 341912 3952108  0    0     0     0 1055 9808 34 65  1  0  0从上面的数据可以看出几点:

(1).      context switch(cs)比 interrupts(in)要高得多,说明内核不得不来回切换进程;

(2).      进一步观察发现 system time(sy)很高而 user time(us)很低,而且加上高频度的上下文切换(cs),说明正在运行的应用程序调用了大量的系统调用(system call);

(3).      run queue(r)在14个线程以上,按照这个测试机器的硬件配置(四核),应该保持在12个以内。

我上午CPU 100%时的信息:

top - 11:49:08 up 50 days, 22:25,  6 users,  load average: 59.79, 59.98, 60.50

Tasks: 200 total,  61 running, 139 sleeping,   0 stopped,   0 zombie

Cpu0  : 26.5%us, 73.5%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Cpu1  : 25.0%us, 75.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:   1939780k total,  1744412k used,   195368k free,    95704k buffers

Swap:  4401800k total,   662836k used,  3738964k free,   811124k cached

[root@localhost ~]# vmstat 2 10

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

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

58  1 662836 195988  95428 810740    0    0     4   106    4    1 23  4 72  1  0

59  1 662836 195988  95448 810732    0    0     0   128  235  221 28 72  0  0  0

59  1 662836 195988  95448 810768    0    0     0     0  216  209 28 72  0  0  0

2.3  mpstat

       mpstat 和 vmstat 类似,不同的是 mpstat 可以输出多个处理器的数据。

注意:需要安装sysstat 包后才有这个命令,可以使用yum安装:

       #yum install sysstat

       sysstat 包含iostat、mpstat、sar、命令。

[root@localhost gmail]# export LANG=en_US[root@localhost gmail]# mpstat -P ALL    Linux 2.6.18-8.el5xen (localhost.localdomain)   02/21/2011 10:20:16 PM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s10:20:16 PM  all   11.49    0.00    2.58    1.04    0.01    0.13    0.01   84.74    314.6110:20:16 PM    0   15.73    0.00    2.56    0.55    0.02    0.23    0.01   80.89    241.0910:20:16 PM    1    7.25    0.00    2.60    1.53    0.00    0.02    0.01   88.59     73.52[root@localhost gmail]# mpstat -P ALL 1Linux 2.6.18-8.el5xen (localhost.localdomain)   02/21/2011 10:20:18 PM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s10:20:19 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00    136.6310:20:19 PM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00     86.1410:20:19 PM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00     50.50 10:20:19 PM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s10:20:20 PM  all    0.00    0.00    0.00    0.47    0.00    0.00    0.00   99.53    105.0010:20:20 PM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00     79.0010:20:20 PM    1    0.00    0.00    0.00    0.90    0.00    0.00    0.00   99.10     26.00 2.4  ps

查看某个程序、进程占用了多少 CPU 资源:

[root@localhost gmail]#  while :; do ps -eo pid,ni,pri,pcpu,psr,comm | grep 'oracle'; sleep 1; done  PID  NI PRI %CPU PSR COMMAND 3668   0  24  0.0   0 oracle 3670   0  21  0.0   0 oracle 3672   0  24  0.0   0 oracle 3674   0  23  0.0   0 oracle 3676   0  24  0.0   1 oracle 3678   0  23  0.0   0 oracle 3680   0  21  0.0   1 oracle 3682   0  24  0.0   1 oracle 3684   0  24  0.0   0 oracle 3686   0  21  0.0   0 oracle三. Memory

       这里的讲到的 “内存” 包括物理内存和虚拟内存,虚拟内存(Virtual Memory)把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为虚拟内存为计算机提供了一个连贯的虚拟内存空间,好处是我们拥有的内存 ”变多了“,可以运行更多、更大的程序,坏处是把部分硬盘当内存用整体性能受到影响,硬盘读写速度要比内存慢几个数量级,并且 RAM 和 SWAP之间的交换增加了系统的负担。

       在操作系统里,虚拟内存被分成页,在 x86 系统上每个页大小是 4KB。 Linux 内核读写虚拟内存是以 “页” 为单位操作的,把内存转移到硬盘交换空间(SWAP)和从交换空间读取到内存的时候都是按页来读写的。内存和 SWAP 的这种交换过程称为页面交换(Paging),值得注意的是 paging 和 swapping 是两个完全不同的概念,国内很多参考书把这两个概念混为一谈,swapping 也翻译成交换,在操作系统里是指把某程序完全交换到硬盘以腾出内存给新程序使用,和 paging 只交换程序的部分(页面)是两个不同的概念。纯粹的 swapping 在现代操作系统中已经很难看到了,因为把整个程序交换到硬盘的办法既耗时又费力而且没必要,现代操作系统基本都是 paging 或者 paging/swapping 混合,swapping 最初是在 Unix system V 上实现的。

在这里只介绍和性能监测有关的两个内核进程:kswapd 和 pdflush。

       (1)kswapd daemon 用来检查 pages_high 和 pages_low,如果可用内存少于 pages_low,kswapd 就开始扫描并试图释放 32个页面,并且重复扫描释放的过程直到可用内存大于 pages_high 为止。

       扫描的时候检查3件事:

       1)如果页面没有修改,把页放到可用内存列表里;

       2)如果页面被文件系统修改,把页面内容写到磁盘上;

       3)如果页面被修改了,但不是被文件系统修改的,把页面写到交换空间。

       (2)pdflush daemon 用来同步文件相关的内存页面,把内存页面及时同步到硬盘上。比如打开一个文件,文件被导入到内存里,对文件做了修改后并保存后,内核并不马上保存文件到硬盘,由 pdflush 决定什么时候把相应页面写入硬盘,这由一个内核参数 vm.dirty_background_ratio 来控制,比如下面的参数显示脏页面(dirty pages)达到所有内存页面10%的时候开始写入硬盘。

# /sbin/sysctl -n vm.dirty_background_ratio

10

3.1  vmstat



TAG:

 

评分:0

我来说两句

Open Toolbar