我面临着一个非常奇怪的问题。内置的JAX WS服务器实现作品 100次在Linux机器上,然后在Mac OS X或Windows上慢。
我已经创建并共享了JMH测试:https://github.com/andremoniy/linuxjvmjaxwstest
基本上可以执行以下操作:
-
使用一种肥皂方法开始JAX WS:
endpoint = endpoint.publish(" http://localhost:8888/",新的fooserviceimpl());
-
执行客户请求对此方法:
字符串结果= state.client.foo(state.foo);
在Mac OS X上使用2个内核I7,它给了我:
# 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
同一台机器,没有CPU限制的Docker:
# 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。我还尝试在AWS EC2 Ubuntu实例上使用VirtualBox Ubuntu 16.04运行它 - 在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和其他OS的性能之间的差异消失了。这意味着在linux的JRE/OpenJDK中,内置的HTTP服务器实现中存在一些错误。还是我错过了什么?
这是Java开发人员支持团队作为错误的:
https://bugs.openjdk.java.net/browse/jdk-8193236