提前感谢您的指点和帮助。
基本上,我希望异步版本的性能比同步版本好得多,但是同步版本的性能相当或者更好。
我做错什么事了吗?我尝试不使用javalin,以防框架中的某些东西产生问题,似乎会得到类似的结果。我确实尝试了netty(太长了,无法发布代码),我也经历了类似的结果。
我编写了以下代码:(javalin-3.12.0和jetty-9.4.31.v20200723)
import io.javalin.Javalin;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import java.io.IOException;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class AsyncTest {
static ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(5000);
public static void main(String[] args) {
var jav = Javalin.create();
jav.config.server(() -> new Server(new QueuedThreadPool(5000, 500, 120_000)));
Javalin app = jav.start(8080);
app.get("/async-delay", ctx -> {
var async = ctx.req.startAsync();
scheduledThreadPoolExecutor.schedule(() -> {
try {
ctx.res.getOutputStream().println("ok");
} catch (IOException e) {
e.printStackTrace();
}
async.complete();
}, 100, TimeUnit.MILLISECONDS);
});
app.get("/delay", ctx -> {
Thread.sleep(100);
ctx.result("ok");
});
app.get("/no-delay", ctx -> {
ctx.result("ok");
});
}
}
结果如下:
➜ ~ wrk2 -t16 -c300 -d5s -R3000 http://localhost:8080/delay
Running 5s test @ http://localhost:8080/delay
16 threads and 300 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 331.36ms 138.72ms 626.18ms 57.34%
Req/Sec nan nan 0.00 0.00%
10854 requests in 5.00s, 1.24MB read
Socket errors: connect 53, read 0, write 0, timeout 106
Requests/sec: 2170.40
Transfer/sec: 254.34KB
➜ ~ wrk2 -t16 -c300 -d5s -R3000 http://localhost:8080/async-delay
Running 5s test @ http://localhost:8080/async-delay
16 threads and 300 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 285.84ms 120.75ms 522.50ms 56.27%
Req/Sec nan nan 0.00 0.00%
11060 requests in 6.10s, 1.29MB read
Socket errors: connect 53, read 0, write 0, timeout 124
Requests/sec: 1814.16
Transfer/sec: 216.14KB
➜ ~ wrk2 -t16 -c16 -d5s -R70000 http://localhost:8080/no-delay
Running 5s test @ http://localhost:8080/no-delay
16 threads and 16 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.51ms 3.12ms 21.95ms 88.36%
Req/Sec nan nan 0.00 0.00%
349824 requests in 5.00s, 40.03MB read
Requests/sec: 69995.44
Transfer/sec: 8.01MB
2条答案
按热度按时间whhtz7ly1#
是的,jaokim叫它,wrk是这里的瓶颈。如果我像上面建议的那样并行运行它们,它将是rps数量的4倍。
643ylb082#
由于jetty9+从一开始就是100%异步的,这种差异的缺乏是有意义的(事实上,在jetty9+中,在使用诸如
InputStream.read()
或者OutputStream.write()
)此外,负载测试工作负载也不现实。
您需要更多的客户机来进行测试。没有一个单独的软件客户端能够为jetty服务器带来压力。在达到任何类型的防波堤服务限制之前,您将达到系统资源限制。
客户机与服务器的比率至少为4:1(我们测试的比率为8:1),以产生足够的负载来给jetty施加压力。
您需要许多到服务器的并发连接(思考40000+)
或者您希望看到http/2(它还以自己独特的方式强调服务器资源)
您需要返回大量数据(需要多个网络缓冲区才能返回)。
您还需要添加一些读取速度慢的客户机连接(在同步服务器上,这些连接可能会因为消耗太多资源而影响其他不慢的连接)