Nashorn increase in eval duration over time
Jan Bauer Nielsen
jbn at dbc.dk
Mon Mar 14 17:16:11 UTC 2016
Hi Hannes.
Yes, the second batch gets a new set of script engines.
The java version is 1.8.0_72-b15, so it should be pretty recent. We
haven't tried any of the java 9 ea builds, since our production version
of GlassFish won't run with this.
Jan
On 2016-03-14 17:44, Hannes Wallnoefer wrote:
> Hi Jan,
>
> This list is fine for reporting Nashorn related problems.
>
> Is it correct that the second batch of business logic is evaluated
> into a completely new set of script engines? In that case I'm not sure
> how the problem could be with Nashorn, since different script engines
> should not share anything. So that could hint at a problem deeper down
> in the implementation of method handles.
>
> If you are using JDK 8_25 (not sure I parse the version string
> correctly) one thing you could try is to use a newer JDK 8 update
> release. There are a few issues that have been fixed in later releases.
>
> Hannes
>
> Am 2016-03-10 um 13:13 schrieb Jan Bauer Nielsen:
>> First of all I'm sorry if this is not the right forum for this type
>> of question, but I haven't been able to find a nashorn-user mailing
>> list or anything like that.
>>
>> We have an enterprise application (using GlassFish 4.1 as application
>> server) which sits in the middle of a processing pipeline receiving
>> data messages from a JMS queue and applying business logic in the
>> form of substantial (30.000+ lines) javascripts to said data. The
>> business logic is user defined, varies on the type of input format,
>> and as such is not known to us at application startup. The setup in
>> question allows for 8 concurrent processor threads, where each thread
>> evals into (and caches) one script engine per unique set of business
>> logic (the cache is actually on the EJB level and not on the thread
>> level).
>>
>> Submitting a batch requiring business-logic-x results in below eval
>> times:
>>
>> [2016-03-10 09:15:41,756] [INFO] [p: thread-pool-1; w: 43] Module
>> eval took 6540 ms
>> [2016-03-10 09:15:42,918] [INFO] [p: thread-pool-1; w: 39] Module
>> eval took 7663 ms
>> [2016-03-10 09:15:44,188] [INFO] [p: thread-pool-1; w: 46] Module
>> eval took 9000 ms
>> [2016-03-10 09:15:44,670] [INFO] [p: thread-pool-1; w: 42] Module
>> eval took 9481 ms
>> [2016-03-10 09:15:44,920] [INFO] [p: thread-pool-1; w: 41] Module
>> eval took 9681 ms
>> [2016-03-10 09:15:45,043] [INFO] [p: thread-pool-1; w: 40] Module
>> eval took 9784 ms
>> [2016-03-10 09:15:45,196] [INFO] [p: thread-pool-1; w: 44] Module
>> eval took 9944 ms
>> [2016-03-10 09:15:45,427] [INFO] [p: thread-pool-1; w: 45] Module
>> eval took 10222 ms
>>
>> Subsequently submitting another batch requiring business-logic-y
>> forcing more script engines to be created (simulated here by clearing
>> cached script engines from application and resubmitting batch for
>> business-logic-x) results in much worse performance:
>>
>> [2016-03-10 09:26:07,129] [INFO] [p: thread-pool-1; w: 31] Module
>> eval took 226070 ms
>> [2016-03-10 09:26:14,760] [INFO] [p: thread-pool-1; w: 40] Module
>> eval took 234753 ms
>> [2016-03-10 09:26:17,167] [INFO] [p: thread-pool-1; w: 26] Module
>> eval took 230762 ms
>> [2016-03-10 09:26:22,174] [INFO] [p: thread-pool-1; w: 36] Module
>> eval took 235614 ms
>> [2016-03-10 09:26:22,978] [INFO] [p: thread-pool-1; w: 30] Module
>> eval took 238836 ms
>> [2016-03-10 09:26:28,909] [INFO] [p: thread-pool-1; w: 38] Module
>> eval took 242011 ms
>> [2016-03-10 09:26:40,921] [INFO] [p: thread-pool-1; w: 32] Module
>> eval took 252076 ms
>> [2016-03-10 09:26:50,700] [INFO] [p: thread-pool-1; w: 35] Module
>> eval took 262625 ms
>>
>> We are not seeing anything out of the ordinary with regard to GC,
>> apart from survivor space often being near 100% full before objects
>> are moved to old-gen. Heap and code cache are nowhere near to being
>> exhausted.
>>
>> Unfortunately we haven't been able to get java flight recorder to
>> work with this GlassFish installation, but jvisualvm samples
>> indicates that 80% of our time is being spent in
>> java.lang.invoke.MethodHandleNatives.setCallSiteTargetNormal().
>>
>> We have tried running both single threaded and with a shared script
>> engine creating separate script contexts, and although we are seeing
>> much better performance in these cases, we are still seeing an
>> increase in eval times nonetheless (in the shared engine case, the
>> eval times of the second batch is a factor 10 less than the numbers
>> above, but it is still a factor 5 larger than the initial batch).
>>
>> We are running on java build 25.72-b15.
>>
>> Any input as to what we might be doing wrong and possibly how to
>> avoid it would be very much appreciated.
>>
>> This problem has actually forced us to remain on the Rhino script
>> engine for the time being.
>>
>> Kind regards,
>>
>> Jan Bauer Nielsen
>> Software developer
>> DBC as
>> http://www.dbc.dk/english
>
More information about the nashorn-dev
mailing list