[undertow-dev] InMemorySessionManager.java performance
Andrew Schmidt
Andrew.Schmidt at impactmobile.com
Fri Sep 5 10:55:16 EDT 2014
Well on windows, scheduling a new task takes more than 1 ms. Therefore every call
to bumptimeout cause the next bumpTimeout to reschedule.
(Since the ''if(newExpireTime < expireTime)'' is comparing ms)
I'm going to test this out on linux and determine if if the same problem exists. Are you
testing on linux ?
But even still, over the course of a jsf request, which takes anywhere from 100ms to
1second, there could be upwards of 100 getAttribute calls which would be on
different ms's. And that means 100+ cancel's / reschedule's .
> -----Original Message-----
> From: Stuart Douglas [mailto:sdouglas at redhat.com]
> Sent: September-04-2014 11:27 PM
> To: Andrew Schmidt
> Cc: undertow-dev at lists.jboss.org
> Subject: Re: [undertow-dev] InMemorySessionManager.java performance
>
> This seems really odd. This should only be re-scheduled if the condition
> newExpireTime < expireTime is true, which should only happen if the max
> inactive interval has been decreased. I have tested this out locally and it
> seems to be working as expected (i.e. only one executeAfter call).
>
> Do you have a simple way to reproduce this?
>
> Stuart
>
> Andrew Schmidt wrote:
> > My company is currently switching from jboss 4 => wildfly 8.1, jsf +
> hibernate + richfaces. (We develop on Windows)
> >
> > After profiling our application, I've found some major performance
> penalties in the InMemorySessionManager.java in undertow. Specifically in
> the bumpTimeout() that gets called on every getAttribute call. Each of these
> calls takes 15 ms, which when called 100 times during the course of a jsf
> request, adds up. (The 15 ms occurs when the execute.executeAfter in
> netty tries to wake up another thread)
> >
> > Looking over the code:
> > io/undertow/server/session/InMemorySessionManager.java
> >
> > -- snip
> > synchronized void bumpTimeout() {
> > final int maxInactiveInterval = getMaxInactiveInterval();
> > if (maxInactiveInterval> 0) {
> > long newExpireTime = System.currentTimeMillis() +
> (maxInactiveInterval * 1000);
> > if(timerCancelKey != null&& (newExpireTime< expireTime)) {
> > // We have to re-schedule as the new maxInactiveInterval is
> lower than the old one
> > if (!timerCancelKey.remove()) {
> > return;
> > }
> > timerCancelKey = null;
> > }
> > expireTime = newExpireTime;
> > if(timerCancelKey == null) {
> > //+1 second, to make sure that the time has actually expired
> > //we don't re-schedule every time, as it is expensive
> > //instead when it expires we check if the timeout has been
> bumped, and if so we re-schedule
> > timerCancelKey =
> > executor.executeAfter(cancelTask, maxInactiveInterval + 1,
> > TimeUnit.SECONDS);
> > -- snip
> >
> > If the time changes by 1ms, then the expiration task is cancelled and a new
> one is scheduled. But this new scheduling takes 15ms. Therefore every call
> to getAttribute (which in turn calls bumpTimeout) will constantly cancel and
> reschedule the expiration tasks. This seems heavy handed. Also the
> comment seems to imply that the developer who wrote this was aware that
> rescheduling is expensive, yet it happens on every call.
> >
> > Disabling session expiration causes our application to run twice as
> > fast. (5.5 second page load goes down to 2.5)
> >
> >
> >
> >
> > _______________________________________________
> > undertow-dev mailing list
> > undertow-dev at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/undertow-dev
More information about the undertow-dev
mailing list