您的位置:首页 > 编程语言 > Java开发

关于java web应用的性能分析

2012-08-30 10:30 495 查看
前一段时间对一个应用做性能的提升,最终从qps 50 搞成了大约400。 这里总结了一下一些方面,希望对大家有所帮助。

总体来说,当你的应用qps不理想,或者访问出现问题是,大致有4个方面需要去查看一下:

1 CPU的瓶颈

2 服务器内存的瓶颈

3 硬盘瓶颈

4 其他的原因

当然了,如果你的请求时从web出发的,考虑一下页面的渲染时间,一般来说,除去页面JS的渲染时间(作为一个java工程师,其实我不会js的加速,所以去掉页面)

对于CPU来说,我们进行压测的时候,出问题的情况下,CPU不外乎两种情况

1 CPU is busy, dong jobs

2 CPU is idle ,waiting other reponse



TOP指令可以帮我们很多:

us:用户的进程cpu消耗,

sy:系统的进程CPU消耗,

ni:这个就有意思了,官方的解释是:The time the CPU has spent running users’proccess that have beenniced.
it is necessary to log on or usesu on the root.

之后这个我们需要注意 id:idle 也就是在压测时的CPU空闲,如果这个很高的话,说明有很大的问题了

wa:Percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.从上不难看出,如果wa很高,IO就成了瓶颈

HI vs SI:这两个一个是硬件中断,比如你敲键盘,软件中断,如果软件中断si很高的话,那么CPU可能消耗了大量的计算在进程或者线程的切换上,这个就需要注意了

如果TOP一切正常呢?

继续看mem

这里就要分成两条线了,一是看看系统的内存是否够用,一是看看JVM的配置是否有问题



1 对于系统内存的查看,用free看看是否swap分区用到了,如果用到了那就惨了,因为这会使你的应用性能很差,如上图,用到了938M的swap分区的内存,先看官方的解释

•A process enters sleep mode. This usually happens because the process depends on interactive action and editors, shells, and data entry applications spend most of their time waiting for user input.
During this time, they are inactive.
•A process behaves poorly. Paging can be a serious performance problem when the amount of free memory pages falls below the minimum amount specified, because the paging mechanism is not able to
handle the requests for physical memory pages and the swap mechanism is called to free more pages. This significantly increases I/O to disk and will quickly degrade a server’s performance.
swap分区使用会直接使得你的进程sleep,或者hehaves poorly. 内存的速度和硬盘的速度不是一个级别的,具体的下面讲到。
2 对于JVM的内存配置。。。。总的来说,不能发生频繁的Full GC,如果发生了,你要看看是不是gc的参数设置的不对导致的,我这里有一个例子
-Xms4g -Xmx4g -XX:PermSize=96m -XX:MaxPermSize=384m -Xmn2g -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5000 -XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=80
-XX:+HeapDumpOnOutOfMemoryError
cms的gc方式,young区 2G ,heap大小4G

硬盘的影响
不说了先上个图



这个图给出了先进硬盘的速度了,寻道时间,访问时间,以及速度。

如果系统出现了大量的IO读写,必然会对系统产生很严重的影响。

另外的是一些其他的因素,比如网络问题,以及程序问题,比如log4J ,这个东西非常消耗性能,需要注意,在部署时候,日志的级别千万不要是debug,debug和info对性能的影响有可能在4倍以上。

最后我给出几个测量内存的方法吧:

1 sizeof。jar 大家可以网上搜一下,这个可以让你对一个对象的大小有所了解

2 btrace 利用btrace跟踪一个函数内存的消耗的大小

3 一个方程式 一次请求的内存消耗=youngc_size/time/qps:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: