我遇到了一个非常奇怪的问题。内置的JAX-WS-server实现可以正常工作
100次
在linux机器上比在Mac OS X或Windows上慢。
我创建并共享了一个JMH测试:
https://github.com/Andremoniy/linuxjvmjaxwstest
基本上,它可以做到以下几点:
在具有2核Intel Core i7的Mac OS X上,它为我提供了:
...
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)
Benchmark Mode Cnt Score Error Units
MyBenchmark.testMethod thrpt 200 3077.813 ± 51.818 ops/s
同一台机器,docker没有CPU限制:
...
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)
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服务器实现中存在一些错误。还是我错过了什么?