[Vertx比执行完全相同的代码的原始asyncservlet慢得多
我已经实现了一个非常基本的GET http方法,该方法在返回http响应文本“ ok”之前没有执行Thread.sleep(30)的功能。我是用jetty-servlet和vertx-verticles做的]
Vertx vertx = Vertx.vertx();
DeploymentOptions d = new DeploymentOptions();
d.setInstances(400);
d.setWorker(true);
d.setWorkerPoolSize(400);
vertx.deployVerticle("com.vertx.Ping",d);
公共类Ping扩展AbstractVerticle {
private HttpServer server;
public void start(Future<Void> startFuture) {
server = vertx.createHttpServer().requestHandler(req -> {
try {
Thread.currentThread().sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
req.response().end("ok");
});
server.listen(9999);
}
}
ab -k -c 1 -n 1 => servlet和vertx的结果相同:〜31ms
Servlet:ab -k -c 1000 -n 100000在一定时间内服务的请求百分比(毫秒)50%21966%22475%22780%22990%23595%24098%24599%247100%264(最长请求)
Vertx:ab -k -c 1000 -n 100000 => 2分钟后我停止了测试
让我们尝试一些简单的事情:Vertx:ab -k -c 1000 -n 10000(少10倍)
在一定时间内服务的请求百分比(ms)50%393066%394375%396480%397790%399795%400998%401999%4028100%4038(最长请求)
Vertx真该死,我该怎么办错人?谢谢
您未按原样使用Vert.x。请记住,Vert.x基于异步操作。
首先,您不需要400个工作台实例。仅1个常规(非工作人员)垂直实例就足够了。之所以这样做,是因为调用了Thread.sleep
,这会导致线程阻塞,但是有一种更简单的方法。]
下一个:不要使用阻止操作!您正在事件循环上运行代码,因此请勿阻塞。您的代码应如下所示:
vertx .createHttpServer() .requestHandler(req -> { vertx.setTimer(30, tid -> { req.response().end("ok"); } }) .listen(9999);
[您应该看到您的度量有了显着的改进,所有这些都只有一个线程,而您只有400个线程。
注意:当您需要调用阻塞操作时,应该查看executeBlocking
类中的Vertx
,该类将一些代码分担给工作程序,然后将结果作为新事件进行分派。
甚至更糟。