两个不同服务器上的java性能

时间:2011-07-22 02:36:11

标签: java performance settings cpu

不确定这个问题是应该在这里还是在serverfault中,但它与java有关,所以这里是:

我有两台服务器,技术非常相似:

  • server1是Oracle / Sun x86,带有双x5670 CPU(2.93 GHz)(每个4核),12GB RAM。
  • server2是戴尔R610,配备双x5680 CPU(3.3 GHz)(每个6核),16GB RAM。

两者都运行Solaris x86,配置完全相同。

都启用了turbo-boost,没有超线程。

因此,server2应该比server1快一点。

我在两个平台上运行以下简短的测试程序。

import java.io.*;

public class TestProgram {

public static void main(String[] args) {
    new TestProgram ();
}

public TestProgram () {
    try {
        PrintWriter writer  = new PrintWriter(new FileOutputStream("perfs.txt", true), true);

        for (int i = 0; i < 10000; i++) {
            long t1 = System.nanoTime();
            System.out.println("0123456789qwertyuiop0123456789qwertyuiop0123456789qwertyuiop0123456789qwertyuiop");
            long t2 = System.nanoTime();

            writer.println((t2-t1));

            //try {
            //  Thread.sleep(1);
            //}
            //catch(Exception e) {
            //  System.out.println("thread sleep exception");
            //}
        }
    }
    catch(Exception e) {
        e.printStackTrace(System.out);
    }
}
}

我打开perfs.txt并对结果取平均值,我得到:

  • server1:average = 1664,trim 10%= 1615
  • server2:average = 1510,trim 10%= 1429

这是一个有点预期的结果(server2 perfs&gt; server1 perfs)。

现在,我取消注释“Thread.sleep(1)”部分并再次测试,结果现在是:

  • server1:average = 27598,trim 10%= 26583
  • server2:average = 52320,trim 10%= 39359

这次server2 perfs&lt; server1 perfs

这对我没有任何意义......

显然我正在寻找一种在第二种情况下改进server2 perfs的方法。必须有某种不同的配置,我不知道哪一种。 操作系统完全相同,java版本相同。

它可以与核心数量相关联吗? 也许这是BIOS设置?虽然BIOS不同(AMI与戴尔),但设置看起来非常相似。

我会尽快更新戴尔的BIOS并重新测试,但我很感激任何见解......

感谢

4 个答案:

答案 0 :(得分:0)

我会尝试不同的测试程序,尝试运行这样的事情。

public class Timer implements Runnable
{
    public void startTimer()
    {
        time = 0;
        running = true;
        thread = new Thread(this);
        thread.start();
    }

    public int stopTimer()
    {
        running = false;
        return time;
    }

    public void run()
    {
        try
        {
            while(running)
            { 
                Thread.sleep(1);
                time++;
            }
        }catch(Exception e){e.printStackTrace();}
    }

    private int time;
    private Thread thread;
    private boolean running;
}

现在计时器主要是主要的:

public class Main
{
    public static void main(String args[])
    {
        Timer timer = new Timer();
        timer.startTimer();
        for(int x=0;x<1000;x++)
            System.out.println("Testing!!");
        System.out.println("\n\nTime Taken: "+timer.stopTimer());
     }
}

我认为这是测试系统运行速度更快的好方法。试试这个,让我知道它是怎么回事。

答案 1 :(得分:0)

好吧,我有一个理论:Thread.sleep()阻止热点编译器进入。因为你有一个睡眠,它假设循环不是“热”,即它没关系太多循环中的代码效率如何(因为,毕竟,你睡觉的唯一目的可能是减慢速度)。

因此,你在循环中添加一个Thread.sleep(),循环中的其他东西也会运行得更慢。

我想知道如果你在循环中有一个循环并测量内循环的性能,它是否会有所作为? (并且在外部循环中只有Thread.sleep())。在这种情况下,编译器可能会优化内部循环(如果有足够的迭代)。

(提出一个问题:如果此代码是从生产代码中提取的测试用例,为什么生产代码会睡眠?)

答案 2 :(得分:0)

我实际上更新了DELL R610上的BIOS并确保调整所有BIOS CPU参数以获得最佳的低延迟性能(无超线程等)。 它解决了它。表演与&amp;没有Thread.sleep有意义,R610在两种情况下的整体性能都比太阳好得多。 原来的BIOS似乎没有正确或完全使用nehalem功能(而太阳确实如此)。

答案 3 :(得分:-1)

您正在测试控制台更新的速度。这完全取决于操作系统和窗口。如果在IDE中运行它,它将比在xterm中运行慢得多。即使使用哪种字体以及窗口有多大,也会使性能大不相同。如果在运行测试时窗口关闭,这将提高性能。


以下是我将如何运行相同的测试。该测试是自包含的,并进行您需要的分析。

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

public class TestProgram {
    public static void main(String... args) throws IOException {
        File file = new File("out.txt");
        file.deleteOnExit();
        PrintWriter out = new PrintWriter(new FileWriter(file), true);

        int runs = 100000;
        long[] times = new long[runs];
        for (int i = -10000; i < runs; i++) {
            long t1 = System.nanoTime();
            out.println("0123456789qwertyuiop0123456789qwertyuiop0123456789qwertyuiop0123456789qwertyuiop");
            long t2 = System.nanoTime();
            if (i >= 0)
                times[i] = t2 - t1;
        }
        out.close();
        Arrays.sort(times);
        System.out.printf("Median time was %,d ns, the 90%%tile was %,d ns%n", times[times.length / 2], times[times.length * 9 / 10]);
    }
}

在2.6 GHz Xeon WIndows Vista盒上打印

Median time was 3,213 ns, the 90%tile was 3,981 ns