代码之家  ›  专栏  ›  技术社区  ›  Andremoniy

Linux JVM的JAX WS服务器实现性能问题?

  •  4
  • Andremoniy  · 技术社区  · 7 年前

    我遇到了一个非常奇怪的问题。内置的JAX-WS-server实现可以正常工作 100次 在linux机器上比在Mac OS X或Windows上慢。

    我创建并共享了一个JMH测试: https://github.com/Andremoniy/linuxjvmjaxwstest

    基本上,它可以做到以下几点:

    • 使用一个SOAP方法启动JAX WS:

      端点=端点。发布(“ http://localhost:8888/ “,new FooServiceImpl());

    • 执行客户端对此方法的请求:

      字符串结果=状态。客户foo(state.foo);

    在具有2核Intel Core i7的Mac OS X上,它为我提供了:

    # JMH version: 1.19
    # VM version: JDK 1.8.0_151, VM 25.151-b12
    # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/jre/bin/java
    ...
    Result "test.openjdk.MyBenchmark.testMethod":
      3077.813 ±(99.9%) 51.818 ops/s [Average]
      (min, avg, max) = (1718.347, 3077.813, 3315.271), stdev = 219.400
      CI (99.9%): [3025.995, 3129.630] (assumes normal distribution)
    
    # Run complete. Total time: 00:06:49
    
    Benchmark                Mode  Cnt     Score    Error  Units
    MyBenchmark.testMethod  thrpt  200  3077.813 ± 51.818  ops/s
    

    同一台机器,docker没有CPU限制:

    # JMH version: 1.19
    # VM version: JDK 1.8.0_151, VM 25.151-b12
    # VM invoker: /usr/java/jdk1.8.0_151/jre/bin/java
    ...
    Result "test.openjdk.MyBenchmark.testMethod":
      19.882 ?(99.9%) 0.169 ops/s [Average]
      (min, avg, max) = (10.031, 19.882, 20.104), stdev = 0.715
      CI (99.9%): [19.714, 20.051] (assumes normal distribution)
    
    # Run complete. Total time: 00:07:01
    
    Benchmark                Mode  Cnt   Score   Error  Units
    MyBenchmark.testMethod  thrpt  200  19.882 ? 0.169  ops/s
    

    我也试过docker openjdk:8u151 OracleJava . 我还尝试在VirtualBox Ubuntu 16.04、AWS EC2 Ubuntu实例上运行它——在linux机器上,它总是存在的~ 20 ops/s .

    但当我将服务器实现更改为Jetty时:

        ContextHandlerCollection contextHandlerCollection = new ContextHandlerCollection();
        server.setHandler(contextHandlerCollection);
    
        JettyHttpServerProvider.setServer(server);
        HttpContext context = new JettyHttpServerProvider().createHttpServer(new InetSocketAddress(8888), 5).createContext("/");
    
        Endpoint endpoint = Endpoint.create(new MyBenchmark.FooServiceImpl());
        endpoint.publish(context);
    
        server.start();
    

    linux和其他操作系统之间的性能差异消失了。这意味着JRE/OpenJDK for Linux的内置HTTP服务器实现中存在一些错误。还是我错过了什么?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Andremoniy    7 年前

    Java开发者支持团队承认这是一个bug:

    https://bugs.openjdk.java.net/browse/JDK-8193236