中規模の大規模なGroovyアプリケーションが何を生産時にゆっくり実行するのかを判断するのは、苦労しています。私はいくつかのsetCallSiteTargetNormal
方法はかなりヘビー級であり、すべてのブロックのことをオンラインに言及見てきたInvoke DynamicでのGroovyパフォーマンスの問題?
at java.lang.invoke.MethodHandleNatives.setCallSiteTargetNormal(Native Method)
at java.lang.invoke.CallSite.setTargetNormal(CallSite.java:258)
at java.lang.invoke.MutableCallSite.setTarget(MutableCallSite.java:154)
at org.codehaus.groovy.vmplugin.v7.Selector$MethodSelector.doCallSiteTargetSet(Selector.java:909)
at org.codehaus.groovy.vmplugin.v7.Selector$MethodSelector.setCallSiteTarget(Selector.java:969)
at org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:228)
at java.lang.invoke.LambdaForm$DMH/1665404403.invokeStatic_L3IL5_L(LambdaForm$DMH)
at java.lang.invoke.LambdaForm$BMH/1705072168.reinvoke(LambdaForm$BMH)
:実行中のアプリケーションのスレッドダンプを取るとき、私は見ている奇妙なことは、このようなスタックトレースとたくさんのスレッドのです呼び出されている間のJVMスレッド。私たちはGroovyの動的呼び出しの呼び出しを使用しています。このメソッドをあまりにも広範囲に呼び出す原因となっているGroovyの何らかのバグにぶつかっているのだろうかと思います。私はすでにチェックした
明らかなパフォーマンスの問題:
- メモリ使用量が
- ファインGCオーバーヘッドでサーバー上の
- 通常のCPU使用率がOKに見えている
- 外部DBとWebサービスの呼び出しがありますすべて正常
CPU使用量に関する1つの注意点は、CPUが不足しているようにアプリケーションが動作していることですyは4 CPUマシンの合計CPUの約1/4を使用しています。それはスレッドがCPUを100%ペグする必要があるように動作していますが、私はそれをまったく見ていません。しかし、私が見つけたいくつかの情報は、setCallSiTeTargetNormal
メソッドコールのオンラインポイントが、JVM上のすべてのスレッドを完全にブロックするものであると指しています。
uがこれをヒットしていますか? https://bugs.openjdk.java.net/browse/JDK-8151981 – Eugene
ええ、私はそれが同じだと思います。私はそれがGroovyの問題であると確信しているので、Groovyのバグを提出しました。 https://issues.apache.org/jira/browse/GROOVY-8298 – jjathman