linux性能分析

有些时候,我们特别关注程序的性能,特别是底层软件,比如驱动程序,OS等。为了更好的优化程序性能,我们必须找到性能瓶颈点,“好钢用在刀刃上”才能取 得好的效果,否则可能白做工作。为了找到关键路径,我们可以使用profilng技术,在linux平台上,我们可以使用gprof和oprofile工 具。

  • gprof是GNU工具之一,它在编译的时候在每个函数的出入口加入了profiling的代码,运行时统计程序在用户态的 执行信息,可以得到每个函数的调用次数,执行时间,调用关系等信息,简单易懂。适合于查找用户级程序的性能瓶颈,对于很多时间都在内核态执行的程 序,gprof不适合。
  • oprofile也是一个开源的profiling工具,它使用硬件调试寄存器来统计信息,进 行profiling的开销比较小,而且可以对内核进行profiling。它统计的信息非常的多,可以得到cache的缺失率,memory的访存信 息,分支预测错误率等等,这些信息gprof是得不到的,但是对于函数调用次数,它是不能够得到的。。
    简单来说,gprof简单,适合于查找用户级程序的瓶颈,而oprofile稍显复杂,但是得到的信息更多,更适合调试系统软件。
    我们以编译运行hello.c为例,来说明如何使用这两个工具,这里不解释具体结果的含义,要想详细了解每个结果代表什么意思,可以看一下参考资料中官方站点上的doc信息,里面会给你详尽的解释。
gprof Quick Start
    gprof是gnu binutils工具之一,默认情况下linux系统当中都带有这个工具。
使用 -pg 选项来编译hello.c,如果要得到带注释的源码清单,则需要增加 -g 选项。运行: gcc -pg -g -o hello hello.c
运行应用程序: ./hello 会在当前目录下产生gmon.out文件
使用gprof来分析gmon.out文件,需要把它和产生它的应用程序关联起来:
gprof hello gmon.out -p 得到每个函数占用的执行时间
gprof hello gmon.out -q 得到call graph,包含了每个函数的调用关系,调用次数,执行时间等信息。
gprof hello gmon.out -A 得到一个带注释的“源代码清单”,它会注释源码,指出每个函数的执行次数。这需要在编译的时候增加 -g选项。 oprofile Quick Start
    oprofile是sourceforge上面的一个开源项目,在2.6内核上带有这个工具,好像只有smp系统才有。比较老的系统,需要自己安装,重新编译内核。
    oprofile是一套工具,分别完成不同的事情。
op_help: 列出所有支持的事件。
opcontrol:设置需要收集的事件。
opreport: 对结果进行统计输出。
opannaotate:产生带注释的源/汇编文件,源语言级的注释需要编译源文件时的支持。
opstack:    产生调用图profile,但要求x86/2.6的平台,并且linux2.6安装了call-graph patch
opgprof:    产生如gprof相似的结果。
oparchive: 将所有的原始数据文件收集打包,可以到另一台机器上进行分析。
op_import: 将采样的数据库文件从另一种abi转化成本地格式。    运行oprofile需要root权限,因为它要加载profile模块,启动oprofiled后台程序等。所以在运行之前,就需要切换到root。
opcontrol --init 加载模块,mout /dev/oprofile 创建必需的文件和目录
opcontrol --no-vmlinux 或者 opcontrol --vmlinux=/boot/vmlinux-`uname -r` 决定是否对kernel进行profiling
opcontrol --reset 清楚当前会话中的数据
opcontrol --start 开始profiling
./hello 运行应用程序,oprofile会对它进行profiling
opcontrol --dump 把收集到的数据写入文件
opcontrol --stop 停止profiling
opcotrol -h 关闭守护进程oprofiled
opcontrol --shutdown 停止oprofiled
opcontrol --deinit 卸载模块 常用的是3→7这几个过程,得到性能数据之后,可以使用opreport, opstack, opgprof, opannotate几个工具进行分析,我常用的是opreport, opannotate进行分析。

opreport使用
http://oprofile.sourceforge.net/doc/opreport.html

opannotate使用
http://oprofile.sourceforge.net/doc/opannotate.html

opgprof使用
http://oprofile.sourceforge.net/doc/opgprof.html 最常用的是opreport,这个可以给出image和symbols的信息,比如我想得到每个函数的执行时间占用比例等信息,用来发现系统性能瓶颈。opannotate可以对源码进行注释,指出哪个地方占用时间比较多。常用命令如下:

  • opreport -l /bin/bash --exclude-depand --threshold 1 , 用来发现系统瓶颈。
  • opannotate --source --output-dir=annotated /usr/local/oprofile-pp/bin/oprofiled
  • opannotate --source --base-dirs=/tmp/build/libfoo/ --search-dirs=/home/user/libfoo/ --output-dir=annotated/ /lib/libfoo.so
网络资源

gprof 用户手册
http://sourceware.org/binutils/docs-2.17/gprof/index.html

oprofile官方站点
http://oprofile.sourceforge.net/

使用 GNU profiler 来提高代码运行速度
http://www-128.ibm.com/developerworks/cn/linux/l-gnuprof.html

使用 OProfile for Linux on POWER 识别性能瓶颈
http://www-128.ibm.com/developerworks/cn/linux/l-pow-oprofile/

本文来自ChinaUnix博客,如果查看原文请点: http://blog.chinaunix.net/u3/99507/showart_2156128.html
 
 
 

Linux性能分析工具详解

一、tcpdump

常用用法:

这里用sudo因为当前帐号无权使用tcpdump,这里仅以一个tcp的例子来说明:sudo /usr/sbin/tcpdump tcp port 80 and host 172.23.1.69 -ieth1 -n

每一行中间都有这个包所携带的标志:

S=SYN,发起连接标志

P=PUSH,传送数据标志

F=FIN,关闭连接标志

ack    表示确认包

RST=RESET,异常关闭连接

. 表示没有任何标志

 常用参数:

Tcp/udp/arp等:指定协议类型。

(src/dst)Host:指定源端或者目的端ip

(src/dst)port:指定源端或者目的端

-i:指定网卡。

-n:显示ip,而不是主机名。

-c:指定抓多少个包后退出。

-A:以ASCII方式显示包内容,这个选项对文本格式的协议包非常有用。

-s:指定抓包显示一行的宽度,-s0表示显示完整的包,经常和-A一起用。

-x/-xx/-X/-XX:以十六进制显示包内容,几个选项只有细微的差别,详见man手册。

 上图示例的过程详解:

第一行:17:40:10这个时间,从172.17.66.27client)的临时端口49376172.23.1.66server)的9500监听端口发起连接,client初始包序号为1350828479,滑动窗口大小为5840字节(滑动窗口即tcp接收缓冲区的大小,用于tcp拥塞控制),mss大小为1460(即可接收的最大包长度,通常为MTU40字节,IP头和TCP头各20字节)。

第二行:server响应连接,同时带上第一个包的ack信息,为client端的初始包序号加11350828480,即server端下次等待接受这个包序号的包,用于tcp字节流的顺序控制。Server端的初始包序号为258050143mss也是1460

第三行:client再次确认,三次握手完成。

第四行:client发请求包,包长度91字节。

第五行:server响应ack

第六行:server回包,包长度21字节。

第七行:client响应ack

第八行:client发起关闭连接请求。

第九行:server响应ack,并且也发送FIN标志关闭。

第十行:客户端响应ack,关闭连接的四次握手完成。

通过这个来理解tcp协议也挺好的,连接关闭过程,字节流顺序控制,拥塞控制,tcp状态转换等。不过这里就不详述了。

二、vmstat

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

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

对于 Linux 性能分析100%理解 vmstat 输出内容的含义, 那你对系统性能分析的能力就算是基本掌握了。

我这里主要说明一下这个命令显示出的部分数据代表的含义,和 它反映出系统相关资源的状况。输出内容共有 6 类,分别说明如下。

 Vmstat的输出格式如(CentOS 3.3)

 Procs

r:

运行的和等待(CPU时间)运行的进程数, 这个值也可以判断是否需要增CPU(长期 大1)

b:

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

   Memory

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

  如果 swpd 的值不为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时,系统性能会受到影响。磁盘IOCPU资 源都会被消耗。

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

 Io

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

bo: 写入到块设备的数据总(写磁盘)

(KB/s)

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

 System

in: 每秒产生的中断次数

cs: 每秒产生的上下文切换次数 上面这2个值越大,会看到由内核消耗CPU

时间会越多

   Cpu

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

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

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

 sy 的值高时,说明系统内核消耗的CPU资源多,这并不是良性 的表现,我们应该检查原因。

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

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

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

 情景分析 这个vmstat的输出那些信息值得关注?

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

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

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

基本正常

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

Cpu wa: 稍微有些高

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

 

三、Top

这个命令可以查看系统中运行的进程的状况,CPU使 用状况,系统负载,内存使用等。它是检查系统进程 运行状况最方便的工具了,它默认显示部分活动的进 程,并且按照进程使用CPU的多少排序。它可以显示 全部CPU的使用状况,也可以显示每个进程都运行在 那个CPU上面。

我习惯使用这个命令查看那些进程或者那类进程占用 CPU和内存资源最多,以此迅速定位存在性能问题的 进程,以及运行异常的进程。

 Top命令的输1 (CentOS 3.3)

 Top命令的输2 (CentOS 3.3)

  top 看到的内存的说(Mem的第2)

actv

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

in_d

inactive_dirty 非活跃的内存页,并且内存数据被 修改,需要写回磁盘

in_c

inactive_clean 非活跃的内存页,干净的数据,可 以被重新分配使用

 问题?

in_d in_c 以及 cache, buffer 的内存有何 不同?

我的理解:

actv, in_d, in_c VM 中对内存的管理组织 形式,buffer是块设备读写缓冲cache是文 件系统缓存

     top 看到的进程所处的几种状(STAT)

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

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

   S 休眠中

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

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

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

   < 高优先级的进程

   N 低优先级

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

 情景分析 前面两top的输出那些信息值得关注?

1)

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

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

CPU

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

 Cpu idle: 200%了,需要注意

2)

Cpu iowait:接近200%了,很大

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

通过这个命令我们可以看到系统进程实际使用的 物理内存,buffercache使用的物理内存

 free命令输出的第二(Mem)

这行分别显示了物理内存的总量(total)、已使用的 (used)、空闲(free)、共享(shared)buffer系统分配但未被使用的buffers 数量cache系统分配但未被使用的cache 数量的内存。

   free命令输出的第三行(-/+ buffers/cache) 这行最容易让人迷惑。

它显示的第一个值(used这一列)是这样得来的: Memused - Membuffers - Memcached列。(这个值就是实际使用的内存总量)

它显示的第二个值(free这一列)是这样得来的:Memfree + Membuffers + Memcached列。(这个值就是系统当前实际可用内存)

 free命令输出的第四(Swap) 这行显示交换内存的总量、已使用量、 空闲量

 

下面是bufferscached的区别。

buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.cached是用来给文件做缓冲。那就是说:buffers是用来存储,目录里面有什么内容,权限等等。而cached直接用来记忆我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。

实验:在一台没有什么应用的机器上做会看得比较明显。记得实验只能做一次,如果想多做请换一个文件名。

#free

#man X

#free

#man X

#free

你可以先后比较一下free后显示buffers的大小。

另一个实验:

#free

#ls /dev

#free

你比较一下两个的大小,当然这个buffers随时都在增加,但你有ls过的话,增加的速度会变得快,这个就是buffers/chached的区别。

因为Linux将你暂时不使用的内存作为文件和数据缓存,以提高系统性能,当你需要这些内存时,系统会自动释放(不像windows那样,即使你有很多空闲内存,他也要访问一下磁盘中的pagefiles

因此,一个最简单的判断Linux下内存是否足够的办法是,只要基本没用到swap,这台机器的内存就是足够的。

 

 

 

学会使用Linux性能分析工具

学会使用Linux性能分析工具

  Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。
  在Linux下有很多系统性能分析工具,比较常见的有top、free、ps、time、timex、uptime等。下文将介绍几个较为重要的性能分析工具vmstat、iostat和sar及其使用。

  用vmstat监视内存使用情况

  vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

  vmstat的语法如下:

  vmstat [-V] [-n] [delay [count]]



  其中,-V表示打印出版本信息;-n表示在周期性循环输出时,输出的头部信息仅显示一次;delay是两次输出之间的延迟时间;count是指按照这个时间间隔统计的次数。对于vmstat输出各字段的含义,可运行man vmstat查看。

  用iostat监视I/O子系统情况

  iostat是I/O statistics(输入/输出统计)的缩写,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一般的输出格式如下:

Linux 2.4.18-18smp (builder.linux.com) 2003年03月07日

avg-cpu: %user  %nice  %sys  %idle
      4.81  0.01  1.03  94.15

Device:      tps  Blk_read/s  Blk_wrtn/s  Blk_read  Blk_wrtn
dev3-0      30.31   1117.68    846.52  16104536  12197374
dev3-1      7.06    229.61    40.40  3308486   582080



  对于输出中各字段的含义,iostat的帮助中有详细的说明。

  使用sar进行综合分析

  表1 sar参数说明

  选项 功能

  -A 汇总所有的报告

  -a 报告文件读写使用情况

  -B 报告附加的缓存的使用情况

  -b 报告缓存的使用情况

  -c 报告系统调用的使用情况

  -d 报告磁盘的使用情况

  -g 报告串口的使用情况

  -h 报告关于buffer使用的统计数据

  -m 报告IPC消息队列和信号量的使用情况

  -n 报告命名cache的使用情况

  -p 报告调页活动的使用情况

  -q 报告运行队列和交换队列的平均长度

  -R 报告进程的活动情况

  -r 报告没有使用的内存页面和硬盘块

  -u 报告CPU的利用率

  -v 报告进程、i节点、文件和锁表状态

  -w 报告系统交换活动状况

  -y 报告TTY设备活动状况



  sar是System Activity Reporter(系统活动情况报告)的缩写。顾名思义,sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、串口、CPU效率、内存使用状况、进程活动及IPC有关的活动等,使用也是较为复杂。

  sar的语法如下:

sar [-option] [-o file] t [n]



  它的含义是每隔t秒取样一次,共取样n次。其中-o file表示取样结果将以二进制形式存入文件file中。

  另一种语法如下:

sar [-option] [-s time] [-e time] [-i sec] [-f file]



  含义是表示从file文件中取出数据,如果没有指定-f file,则从标准数据文件/var/adm/sa/sadd取数据,其中dd表示当前天。另外,-s time表示起始时间;-e time表示停止时间;-i sec表示取样的时间间隔,如果不指定则表示取文件中所有的数据。对于具体的选项参见表1。

  一般它与-q和-u联合使用,以便对每个CPU的使用情况进行分析,比如运行如下命令:

sar -q -u 5 1



  将输出如下:

Linux 2.4.18-18smp (builder.linux.com)   2003年03月07日

09时46分16?   CPU   %user   %nice  %system   %idle
09时46分21?   all   0.20   0.00   0.00   99.80

09时46分16? runq-sz plist-sz  ldavg-1  ldavg-5
09时46分21?    0    91   0.00   0.00

Average:     CPU   %user   %nice  %system   %idle
Average:     all   0.20   0.00   0.00   99.80

Average:   runq-sz plist-sz  ldavg-1  ldavg-5
Average:      0    91   0.00   0.00



  由于sar命令太复杂,只有通过熟练使用才能了解每个选项的含义,对于sar输出中每个字段的含义运行man sar命令可以得到详细的解释。
 
系统性能分析和优化
童剑 2006/03/21
msn: [email protected]
前言
很高兴能有这样的机会,把我自己多年工作中对服务器硬件,软件方面的性能分析的经验和体会,以及性能优化的经验和各位朋友做一次分享.

这份ppt的内容组织大致是这样的,通过对系统中和性能相关的各个环节的介绍,使大家知道出现性能问题时可以从那些方面入手去查,而分析典型应用对系统资源使用的特点,让大家对应用和系统资源的依赖有了更直观的认识,然后我会介绍常见的分析及监控系统资源时使用的工具,这个环节应该是最主要的,最后我会举一个实际发生过的系统性能瓶颈分析和优化的案例,作为一个实践和总结.
本文涉及的内容基于Gnu/Linux系统平台,但关于性能优化分析和优化的思路也能适用于其他系统平台.
我们将会讨论下列7个话题
性能分析的目的
性能分析相关的人
性能相关的各个环节
系统使用和优化的原则
典型应用对系统资源使用的特点
常见的性能分析工具介绍
性能分析及优化的案例
开始第1个话题
性能分析的目的
性能分析相关的人
性能相关的各个环节
系统使用和优化的原则
典型应用对系统资源使用的特点
常见的性能分析工具介绍
性能分析及优化的案例
性能分析的目的
找出系统性能瓶颈
硬件瓶颈
软件瓶颈
提供性能优化方案
升级硬件
改进系统结构
达到合理的硬件和软件配置
使系统资源使用达到平衡
性能分析的目的
但遗憾的是

解决一个性能瓶颈,往往又会出现另外的瓶颈或者其他问题,所以性能优化更加切实的目标是做到在一定范围内使系统的各项资源使用趋向合理和保持一定的平衡.
系统运行良好的时候恰恰也是各项资源达到了一个平衡体,任何一项资源的过渡使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓.比如CPU过渡使用会造成大量进程等待CPU资源,系统响应变慢,等待会造成进程数增加,进程增加又会造成内存使用增加,内存耗尽又会造成虚拟内存使用,使用虚拟内存又会造成磁盘IO增加和CPU开销增加(用于进程切换,缺页处理的CPU开销)
开始第2个话题
性能分析的目的
性能分析相关的人
性能相关的各个环节
系统使用和优化的原则
典型应用对系统资源使用的特点
常见的性能分析工具介绍
性能分析及优化的案例
性能分析相关的人
系统管理员
大型应用的系统结构设计人员
软件开发人员
性能分析相关的人
系统管理员
掌握系统运行状况(负载)
掌握系统资源使用情况(硬件)
掌握应用程序对资源的使用情况(应用程序执行效率,反馈给应用开发人员)
有针对性的开展服务器性能优化(硬件,软件,软件配置)
性能分析相关的人
系统架构设计人员
了解程序执行效率
了解系统架构中的性能瓶颈,优化系统结构
设计更好的应用系统架构
性能分析相关的人
软件开发人员
了解程序执行效率
改进程序逻辑,改进性能
开始第3个话题
性能分析的目的
性能分析相关的人
性能相关的各个环节
系统使用和优化的原则
典型应用对系统资源使用的特点
常见的性能分析工具介绍
性能分析及优化的案例
性能相关的各个环节
硬件资源
操作系统
服务器软件
开发平台/中间件软件/框架软件
应用程序
性能相关的-硬件资源
CPU
内存
存储系统
带宽
性能相关的-硬件资源
CPU
是否使用SMP
单颗CPU的性能对依赖CPU的某些应用的影响很严重,比如数据库的查询处理
性能相关的-硬件资源
内存
物理内存
物理内存不够时会使用交换内存
交换内存
使用交换内存会带来磁盘IO和CPU的开销增加

性能相关的-硬件资源
存储系统
SCSI磁盘
ATA/SATA磁盘
RAID磁盘阵列(RAID0, RAID1, RAID5, RAID0+1)
一些经验
小文件读写的性能瓶颈是磁盘的寻址(随机读写性能更差),评估的标准是tps
大文件读写的性能瓶颈是带宽,评估的标准是持续的读写速度
Linux可以利用空闲内存作文件系统访问的cache,因此系统内存越大存储系统的性能也越好
性能相关的-硬件资源
带宽
网络带宽
SCSI总线带宽
大文件访问时SCSI的带宽瓶颈
系统总线带宽
性能相关的-操作系统
SMP性能
VM性能
IO性能(存储设备,网络设备,异步IO)
文件系统性能(大文件优化,小文件优化,写优化,读优化,网络文件系统)
多线程性能
开始第4个话题
性能分析的目的
性能分析相关的人
性能相关的各个环节
系统使用和优化的原则
典型应用对系统资源使用的特点
常见的性能分析工具介绍
性能分析及优化的案例
系统使用和优化的原则
对资源的使用状况作长期的监控和数据收集
Snmp+MRTG
Sar
程序的优化和系统结构的优化比硬件的性能优化更有效
避免不受限制的使用系统资源
设置各项服务对资源的使用限额,如Apache, MySQL,PHP等
系统使用和优化的原则
始终保留一定量的空闲资源
多少合适 根据应用的特点,比如是否有突发性使用增长
日常情况下,保留至少 60% 的系统资源,以应付突发使用增长.
日常情况下,资源使用率达到 80% 时,你必须有所行动了,尤其是web应用.
系统硬件达到合理的配置(以适合应用的特点为依据,资源消耗均衡为目标)
系统性能的水桶理论
系统使用和优化的原则
应用软件对资源的使用要均衡(理想目标)
怎么样就算是均衡了 我也在摸索中……
理想状况为:CPU消耗到50%的时候,磁盘的带宽也到50%,磁盘的tps也到50%,内存使用也到50%(除去可以提供给cache的内存)
开始第5个话题
性能分析的目的
性能分析相关的人
性能相关的各个环节
系统使用和优化的原则
典型应用对系统资源使用的特点
常见的性能分析工具介绍
性能分析及优化的案例
典型应用对系统资源使用的特点
声明
这部分内容主要是本人在网站工作多年的一些实践经验积累, 所以这些经验并不完全适用于其他的应用环境.
在我的经验中,大多数的硬件性能问题主要和CPU,磁盘,内存相关, 还没有遇到因为开发语言的运行效率对整个应用的性能造成影响,而应用程序设计的缺陷和数据库查询的滥用反倒是最最常见的性能问题.
需要注意的是,大多数情况下,虽然性能瓶颈的起因是程序性能差或者是内存不足或者是磁盘瓶颈等各种原因,但最终表现出的结果就是CPU耗尽,系统负载极高,响应迟缓,甚至暂时失去响应,因此我们观察服务器状况时,最先看的就是系统负载和CPU空闲度.
典型应用对系统资源使用的特点
动态内容为主的Web应用
静态内容为主的Web应用 (如Squid Cache)
数据库应用
软件下载
流媒体服务
典型应用对系统资源使用的特点
动态内容为主的Web应用
频繁执行程序,如 Perl, PHP, Java 等,消耗CPU严重
提供并发用户访问,因此系统进程数多,消耗内存多,当内存不足时,使用交换内存也会增加CPU的开销
磁盘的写IO比较频繁(主要为随机写),比如生成cache文件,更新session文件等.
内存充足时读取的内容可以被cache住,cache的命中率和文件更新的频繁程度成反比,磁盘的读IO相对较小
典型应用对系统资源使用的特点
静态内容为主的Web应用 (如Squid Cache)
网络带宽瓶颈
小文件的随机读取频繁,内存充足时可以缓解磁盘随机读的压力
系统内存不足时磁盘IO量会比较大(读,写,交换内存),因此增加CPU的开销
典型应用对系统资源使用的特点
数据库应用
数据库查询语句复杂,大量的 where 子句,order by, group by 排序等,CPU容易出现瓶颈
表太大时,查询遍历全表造成磁盘读的IO量大,容易出现读IO等待的情况
数据更新量大或者更新频繁时,造成磁盘写的IO量大
内存不足时频繁使用交换内存
典型应用对系统资源使用的特点
软件下载
网络带宽瓶颈
存储系统带宽瓶颈(读)
流媒体服务
网络带宽瓶颈
存储系统带宽瓶颈(读)
开始第6个话题
性能分析的目的
性能分析相关的人
性能相关的各个环节
系统使用和优化的原则
典型应用对系统资源使用的特点
常见的性能分析工具介绍
性能分析及优化的案例
常见的性能分析工具介绍
Vmstat
Top
Free
Uptime
sysstat 工具包
Iozone
Strace
希望看完以上工具的使用说明,让你能够知道如何判断系统瓶颈在那里,内存是否够用,CPU是否够用,磁盘IO是否够用,网络和磁盘带宽是否够用等问题.
工具介绍-vmstat
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
这个命令可以查看系统中运行的进程的状况,CPU使用状况,系统负载,内存使用等.它是检查系统进程运行状况最方便的工具了,它默认显示部分活动的进程,并且按照进程使用CPU的多少排序.它可以显示全部CPU的使用状况,也可以显示每个进程都运行在那个CPU上面.

我习惯使用这个命令查看那些进程或者那类进程占用CPU和内存资源最多,以此迅速定位存在性能问题的进程,以及运行异常的进程.
工具介绍-top
Top命令的输出1 (CentOS 3.3)
工具介绍-top
Top命令的输出2 (CentOS 3.3)
工具介绍-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 命令.
其他
开始第7个话题
性能分析的目的
性能分析相关的人
性能相关的各个环节
系统使用和优化的原则
典型应用对系统资源使用的特点
常见的性能分析工具介绍
性能分析及优化的案例
性能分析及优化的案例
动态内容为主的网站
动态内容+Cache为主的网站
动态内容为主的网站
该网站系统结构说明
1台Dell2650服务器, 单颗Xeon 3.0G CPU,1G内存,2块72G SCSI磁盘
操作系统 CentOS 3.3
应用基于LAMP架构,所有服务都在一台服务器上
动态内容为主的网站
分析和优化的过程
初期性能问题及处理
第二次优化
第三次优化
第四次优化
网站结构优化
动态内容为主的网站
初期性能问题及处理
表现:早晨和下午访问高峰时,服务器频繁宕机,重启后的一段时间内能正常服务,过一会以后又变的响应缓慢,然后又宕机.
检查:发现宕机前系统负载高,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 手册
结束啦!
谢谢参与!
 
 

你可能感兴趣的:(linux开发/应用)