繁体   English   中英

java 在两台不同服务器上的性能

[英]java performance on two different servers

不知道这个问题应该在这里还是在serverfault中,但它与java相关,所以这里是:

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

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

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

两者都启用了涡轮增压,并且没有超线程。

因此 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:平均值 = 1664,修剪 10% = 1615
  • server2:平均 = 1510,修剪 10% = 1429

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

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

  • server1:平均值 = 27598,修剪 10% = 26583
  • server2:平均 = 52320,修剪 10% = 39359

这次 server2 性能 < server1 性能

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

显然,我正在寻找一种在第二种情况下提高 server2 性能的方法。 一定有某种不同的配置,我不知道是哪一种。 操作系统相同,java 版本相同。

它可以与核心数量相关联吗? 可能是 BIOS 设置? 尽管 BIOS 不同(AMI 与戴尔),但设置似乎非常相似。

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

谢谢

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

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());
     }
}

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

好的,我有一个理论: Thread.sleep() 防止热点编译器启动。因为你有一个睡眠,它假设循环不是“热的”,即它的效率有多高并不重要循环中的代码是(因为毕竟,你睡觉的唯一目的可能是减慢速度)。

因此,您在循环中添加了一个 Thread.sleep() ,循环中的其他内容也运行得更慢。

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

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

我实际上更新了 DELL R610 上的 BIOS,并确保调整所有 BIOS CPU 参数以获得最佳的低延迟性能(无超线程等)。 它解决了它。 有和没有 Thread.sleep 的性能是有道理的,R610 在这两种情况下的整体性能都比 Sun 好得多。 最初的 BIOS 似乎没有正确或完全使用 nehalem 功能(而 Sun 做到了)。

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


这是我将如何运行相同的测试。 该测试是独立的,可以进行您需要的分析。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM