我们使用的是 Wildfly 10.1.0 和 Resteasy 3.1.1。在数百 rps 的吞吐量下,即使平均延迟非常低,我们也会看到随机的长请求。
我们正在查看 New Relic 在我们的应用程序中生成的指标。我们注意到一小部分请求(约 1%)卡在“HttpServlet30Dispatcher.service()”中,这是一个 Resteasy 库函数。对于卡在那里的请求,看起来 HttpServlet30Dispatcher(或它下面的一些代码)消耗了该请求 100% 的时间。我们发现通常需要 50 毫秒的请求会增加到 20 秒以上。
有谁知道是什么原因造成的?感觉 Wildfly 可能会阻止等待空闲线程的请求,并且可能会发生线程饥饿。任何人都可以确认或就如何分析这一点提出任何建议吗?
谢谢! 马特
最佳答案
答案是这些都是网速慢造成的。我能够通过使用 chrome 开发工具并将网络设置为下载速度非常慢来证明这一点。
发生的事情是:Wildfly 是缓冲响应的地方,因此网络速度较慢的客户端会导致此功能阻塞。
New Relic 是我们正在使用的工具,它无法过滤掉这些请求,因此它们会增加我们的总体 APDEX 分数,这很烦人。
这实际上并不表示您的代码或应用服务器配置有任何问题。请注意,发生这种情况时,慢速网络客户端会占用一个线程。我已经能够在 NodeJS 中重现完全相同的问题,我想它在其他应用程序服务器中也是一样的。我本以为 Wildfly 使用的是 NIO,它会使这个事务异步,但据我所知,这并没有发生。
IO 缓冲有很多解决方案 - 您可以使用 NGINX 或其他一些代理为您做缓冲,而您的应用服务器不必这样做。
关于resteasy - Wildfly Resteasy 随机请求耗时较长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50334205/