非常慢的播放框架2.3请求处理代码

我面临的方法表现极慢:

HttpRequestDecoder.unfoldAndFireMessageReceived() 

 Future$PromiseCompletingRunnable.run() 

这两种方法使用服务器中每个事务的大约一半时间。 它发生在低营养和高使用时间。

例如,凌晨1点,只有我对应用程序的请求,我得到了新的遗物图形,如下所示:

新遗物指标

在这个事务中,只有这两个方法消耗1秒,甚至更慢,通过hibernate访问数据库! 再一次,应用程序中只有一个用户。

如果交易较重,则需要更多时间:

新遗物2

在这种情况下,当我自己的代码消耗1.5秒,总共4秒时,这两种方法平均消耗2.5秒。 我觉得那个时刻可能只是误导了新的遗物标准。 也许newrelic会显示这些方法名称,但它确实是我编写的代码。 所以我决定得到一个像这样的自定义指标:

 playController(){ //Start timer //do the job //stop the timer() and send metric to new relic //return; } 

结果是我的代码耗时1.5秒。 所以这次是真正的游戏请求处理程序。

这种行为在高负荷时会杀死我的应用。 当throghput每分钟大约500个请求(实际上不是高吞吐量!)时,这两种方法可能消耗长达20秒,但我的代码保持稳定在最多3秒。

我真的不认为这是一个线程问题,因为它甚至在有一个用户的时候就会发生,但是当有很多并发请求时它会变得很麻烦。 我尝试改变“同步应用程序”的线程数量,例如文档提及,但我没有得到任何性能改变,它甚至变得更糟。

我真的很担心这个问题,因为在两年多的游戏邮件列表中有类似的情况而没有答案!:

http://grokbase.com/t/gg/play-framework/159bzf7r9p/help-to-understand-newrelic-report-for-slow-transactions-2-1-4

在StackOverflow中甚至有一个类似的问题,但对于没有回答且没有明显活动的游戏2.1:

使用Play Framework作为后端的NewRelic中的交易缓慢

什么可能导致这种行为的想法?

所以一个月后我终于可以说这个问题已经解决了。 答案是,根本没有问题。 新的文本默认检测不能正确报告Play Framework 2事务所消耗的时间 ,我甚至可以说任何在Netty上运行的异步框架。

为了得出这个结论,我必须在最有问题的事务中包含一些自定义指标,以发现我的自定义工具使用的时间少于新文件报告的时间。

之后,我使用firebug在客户端测试,报告的时间与我的自定义指标相符。

就在一周前,我在newrelic论坛上发现了这篇文章:

https://docs.newrelic.com/docs/agents/java-agent/frameworks/disable-scala-netty-akka-play-2-instrumentation

在禁用netty,akka的所有工具并在newrelic配置文件中使用这些行后,我终于开始通过默认检测获得实际时间:

 common: &default_settings class_transformer: # Disable all Akka instrumentations com.newrelic.instrumentation.akka-2.0: enabled: false com.newrelic.instrumentation.akka-2.1: enabled: false com.newrelic.instrumentation.akka-2.2: enabled: false # Disable all Netty instrumentations com.newrelic.instrumentation.netty-3.4: enabled: false com.newrelic.instrumentation.netty-3.8: enabled: false com.newrelic.instrumentation.netty-4.0.0: enabled: false com.newrelic.instrumentation.netty-4.0.8: enabled: false # Disable all Play 2 instrumentations com.newrelic.instrumentation.play-2.1: enabled: false com.newrelic.instrumentation.play-2.2: enabled: false com.newrelic.instrumentation.play-2.3: enabled: false # New in Release 3.22, the Play 2.4 instrumentation does not respect # the older play2_instrumentation configuration setting com.newrelic.instrumentation.play-2.4: enabled: false # Disable all Scala-language instrumentations com.newrelic.instrumentation.scala-2.9.3: enabled: false 

在新的文件中说:

如果您发现报告的度量标准对您没有价值,或者如果检测的开销超出您的预期,您可以选择禁用部分或全部此检测。 如果您有选择地禁用某些检测,则不会报告某些活动段,并且您的总时间将被低估。

但恕我直言应该说:

如果要获得实际指标,可以选择禁用所有此工具。

为什么会这样? 我只能猜测Play和Netty通过许多事务重用池中的一些线程,并且newrelic代理无法正确分离数据库消耗的时间和netty,重复并且有时会使应用程序消耗的实际时间重复三次。

这个问题严重误导了我的团队(以及项目的发起人)。 我并不完全责怪Newrelic,这个工具很有帮助,但这让我不能只相信一个工具。