性能调优
转又一个大牛写的,都是testroad上看到的,感谢
问题描述:
性能调优从哪些方面入手?
精彩答案:
会员 yzylion:
我个人觉得现在大多数的性能测试工作人员分为以下三个阶段:
1、出了问题就看资源,资源占用如果很高,报以窃喜的心态,恩,发现了,原理是资源瓶颈
2、资源没有出现瓶颈,通过一些技术手段分析,发现是组件的配置文件有问题,例如:server的并发策略有问题,带宽有问题,找到了线路短板性能中的短板,到了这个阶段在我看来是比较牛的测试拉
3、以上均无问题的情况下,考虑数据结构和算法
就我个人接触到的来说,现在大多数的人员都是在仰望第二阶段,摸索第三阶段,希望从代码级就发现出性能的问题,进行问题的发现和解决,也符合我们的bug越早发现修复的成本越低的理论。同时,也是一名性能测试工程师高薪的象征。
那么谈完了现状,回到我们的这个话题:性能调优从哪些方面入手,个人觉得有如下几点:
1、对于所测系统所设计到的知识领域的了解。例如:所测系统开发语言,牵涉到的中间件,web,app 两大server等的配置参数是什么意思,如何监控,分析它们的哪些数据等
2、注重基础知识的学习和积累。例如:对于web的性能测试,对于TCP/IP原理,基本知识,数据的转发实现,交换机和路由器的带宽设置策略对性能的影响等需要了解,掌握清楚,思路清晰
3、确定性能测试本身的有效。例如:脚本的优化,场景的设置等。因为,有些本身脚本的优化带来的执行效率的问题,往往被我们忽略,而一股脑的在那里研究是我们本身哪里出了问题
性能测试调优是一条说简单简单,要做好不是那么容易的路,共勉~~~
转一个大牛的写的
|
|
系统性能检测--磁盘io
先罗列一些工作中用得比较多的系统检测工具吧,top、ps、iostat、vmstat、free (-m)、tcpdump...
1.磁盘io相对于内存读写是巨慢无比的,数据库操作也是,所以在一些io密集的程序里面可以用内存映射、memcached来进行优化
2.就个人理解来描述一下磁盘访问
cpu访问文件数据时,先在cpu cache和memory查找,没找到就通知io子系统去磁盘加载(数据以内存内的形式加载,一个内存页一般是4kb)(MPF,major page fault)
如果在内存(写缓存buffer,读缓存cached)中可以找到就不用有磁盘操作了(MnPF,minor page fault)
后者速度快多了,所以在频繁的io操作后内存中有很多空间用于缓存磁盘数据,这时候如果看到free的空间不足并不表示机器真的内存不足,当有内存需求时内核会释放这些用于磁盘缓存的内存空间,下图中cached就是缓存所占的空间,内存实际剩余是free+buffers+cached = 117+10+508。但是如果Swap used很多就表示系统内存真的很紧张,使用交换分区的速度很慢,因为它是保存在磁盘上的。
- www.linuxidc.com@linuxidc:~$ free -m
- total used free shared buffers cached
- Mem: 1889 1771 117 0 10 508
- -/+ buffers/cache: 1252 636
- Swap: 4766 282 4484
3.内存页类型:
read page:只读,包括库文件之类的
dirty page(write page):写过需要同步到磁盘的数据,我想在fprintf之后紧接着调用fflush()之类的函数应该可以从这里写回磁盘
anonymous page:跟磁盘文件无关,归某些进程所有,内存不足时这些数据可能掉入Swap
4.计算IOPS(每秒响应的磁盘io次数):
假如磁盘的RPM是10000(RPM,Revolutions Per Minute,每分钟旋转圈数)
则,磁盘的RD(Rotational Delay,旋转半圈的毫秒数)是(1/(10000/(60*1000)))/2=3
加上磁头的DS(Disk Seek,磁头寻道的毫秒数)平均是3MS
加上2MS延迟
最终的IOPS是8ms,内核每次的io请求磁盘需要8ms来完成,就是10000RPM的磁盘每秒可以提供大约125次IOPS
根据
5.实际io情况要根据程序来考量,邮件服io数据小而请求频繁,属于Random IO,流媒体服务io数据大而请求频度低,属于Sequential IO
前者对iops要求比较高,后者对读写大量数据能力(KB per request, (rkB/s)/(r/s)或者(wkB/s)/(w/s))要求比较高
当用top或者iostat查看发现iowait比较高时说明有io瓶颈
- www.linuxidc.com@linuxidc:~$ iostat -kdx 2
- Linux 3.0.0-14-generic (HP) 2012年01月08日 _x86_64_ (4 CPU)
- Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
- sda 0.60 2.08 2.86 1.20 65.79 37.79 51.09 0.37 91.11 34.56 225.77 14.59 5.92
- Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
- sda 0.00 0.00 2.00 0.00 64.00 0.00 64.00 0.02 9.00 9.00 0.00 5.00 1.00
- Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
- sda 0.00 0.50 0.50 1.00 2.00 6.00 10.67 0.01 9.33 8.00 10.00 9.33 1.40
性能调优无疑是个庞大的话题,也是很多项目中非常重要的一环,性能调优的难做是众所周知的,毕竟性能调优涵盖的面实在是太多了,看看性能调优这项庞大的工程都有些什么过程,同时也看看这些过程中常见的一些做法。 (图)性能调优性能调优 性能调优 - 目标 性能调优,首先是要确定性能调优的目标是什么,如果现在应用已经满足了需求,就没必要去做性能调优了,毕竟不经过一个系统的过程,其实是无法确定你所做的性能调整是否真的调优了性能,是否没有造成应用中其他的问题,所以确定性能目标是非常重要的,在定义性能目标的时候通常这么定义的呢: 1、最大并发数 2、Quality of Service 服务的质量,在软件系统方面我们认为主要表现在请求的出错率,系统的load等。 3、最长响应时间 对于任何请求所能承受的最大响应时间。 4、TPS 每秒需要支持的最大事务数,最典型的指标是:“某页面最高需要支撑每秒7000次的访问次数”。 例如一个web系统,需要定义出来的目标是: 并发目标:最高支撑200并发; QoS:出错率须控制在万分之一,系统的load最高只能到达10; TPS:每秒完成7000次请求的处理; 最大响应时间:最长允许的响应时间为5秒。 至于请求的平均响应时间这些就不在性能调优目标中定义,因为要达到TPS的要求,响应时间是必须要达到一个级别的,而且响应时间随着高并发是会出现劣化的。 当然,还可以把性能指标定到更为细节,例如某个方法的TPS在100并发时需要达到多少。 在确定好了性能目标后,重要的就是如何来测量系统的性能了。 性能调优 - 测量系统性能 对于新系统而言,需要评估出其正式运行时的数据量的增长情况;而对于已运行的系统,则需要根据监控获取到系统的运行数据(例如高峰并发数、系统的响应速度情况、系统的load、网络流量、每类请求在总的请求中所占的百分比等)。 (图)性能调优性能调优 对于新系统而言,要评估出具体的性能相对来说稍微好做一点,因为此时系统通常较为单纯,数据量的增长也不可能是一夜之间增长的,因此基本可以按照一种正常的方法在测试环境评估出其正式运行的性能。 而对于已运行的系统而言,则较为麻烦,因为通常来讲要在测试环境中模拟正式运行环境基本是不太可能的,因此这个时候通常要采取一些模拟的方法或更高压力的方法来尽量更为准确的评估出系统的性能。 在测试系统性能时,通常可采用的方法有: 1、单元测试; 可借助单元测试来测试某个请求的性能; 2、压力测试; 压力测试无疑是测量系统性能中最常采用的方式,根据定义的性能目标对系统进行压力测试,以确定系统是否满足性能要求,同时也可以根据压力测试的结果来分析系统的瓶颈,进而进行对应的调优,可用于做压力测试的工具还是不少的,像loadrunner、jmeter等等,不过压力测试这个话题实在太大了,不在这里展开去讲了,不过我也不怎么懂就是,呵呵。 分析系统性能瓶颈 根据测量系统性能的结果,多数是可以分析出系统性能瓶颈,同时还可以结合像jvm堆栈、jprofiler、系统日志等来进行进一步的确定,另外也可以根据性能调优人员的经验,例如可以去了解开发人员是否采用了不适合的数据结构等。 简单说一个线程分析的例子: 借助kill -3 pid来获取到目前jvm的线程堆栈信息,特别需要关注的是里面wait for monitor这样的线程,这种线程是指在等待锁的线程,等待一两分钟后再次kill -3 pid,看看这些wait for monitor的线程的变化情况,这对于分析线程中是否存在不合理的竞争过高的锁的分析是非常重要的。 这一步无疑也是性能调优过程中最难的一步了,分析系统性能瓶颈这种基本只能结合实际例子来讲了,正确在后续抽取一两个例子来进行讲解。
个人的经验总结:
响应时间过长的解决办法:
1 清理流水表;
2 通过AWR报告找出时间占用过长的SQL;
3 判断SQL是否有索引;
4 考虑数据问题;


浙公网安备 33010602011771号