51Testing软件测试论坛

标题: 有关性能测试中性能问题的定位 [打印本页]

作者: kofwxh    时间: 2010-8-30 16:03
标题: 有关性能测试中性能问题的定位
不知道各位如果在性能测试中发现CPU占用率过高,会用什么方法及工具去定位问题?
作者: 愚人    时间: 2010-8-30 16:06
查进程……看看那个进程高,然后查看代码吧?定位了进程就可以了……
作者: PrefTest    时间: 2010-8-30 17:04
查看CPU的变化曲线,与虚拟用户图和事务图关联一下,再进一步分析
作者: 楠族开心果    时间: 2010-8-30 17:23
看CPU进程
作者: msnshow    时间: 2010-8-30 21:29
相信楼主做压力测试的时候,服务器上应该也没有别的进程会占用很多CPU的,个人觉得楼主可以把你压力的范围进行缩减,以发现具体某个模块引起的CPU占用过高
作者: kofwxh    时间: 2010-8-31 09:37
多谢楼上各位的指教。

我是性能测试新手,目前还没有使用LoadRunner这种重量级选手  所以三楼所说的“虚拟用户图和事务图”目前无从下手

我现在手头主要使用的工具是JConsole,为了试验对CPU占用问题的跟踪,我自己写了个程序如下:

1 package test;
2
3 import java.util.concurrent.TimeUnit;
4
5 public class ThreadCPUUsage {
6
7     public static void main(String[] args) {
8         Thread thread = null;
9         for (int i = 0; i < 10; i++) {
10             thread = new Thread(new Runnable(){
11             @Override
12             public void run() {
13                 while(true){
14                 try {
15                     System.out.println("Thread "+ Thread.currentThread().getName()+ "is running");
16                     int i = 100000000;
17                     while(i-->0){
18                        
19                     }
20                     TimeUnit.SECONDS.sleep(1);
21                 } catch (InterruptedException e) {
22                     // TODO Auto-generated catch block
23                     e.printStackTrace();
24                 }
25               
26             }
27             }
28               
29             }, "thread"+i);      
30            
31             thread.start();           
32         }
33     }
34   
35 }

这段代码明显消耗CPU时间的地方在这个地方:
int i = 100000000;
                    while(i-->0){
                       
                    }

使用jconsole + topthread 工具查看,可以看到一般thread的调用信息

java.lang.Thread.sleep(Native Method)
java.lang.Thread.sleep(Thread.java:298)
java.util.concurrent.TimeUnit.sleep(TimeUnit.java:328)
test.ThreadCPUUsage$1.run(ThreadCPUUsage.java:20)
java.lang.Thread.run(Thread.java:619)

但是都没有定位到出问题的代码行上,无意中点击在topthread插件列表中最顶上一行的thread,查看到thread调用信息为:
test.ThreadCPUUsage$1.run(ThreadCPUUsage.java:17)
java.lang.Thread.run(Thread.java:619)

不知道是不是用这个可以解决普遍的性能定位问题?有待检验。
作者: msnshow    时间: 2010-9-1 22:16
java的使用jprofiler




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2