[undertow-dev] InMemorySessionManager.java performance
Andrew Schmidt
Andrew.Schmidt at impactmobile.com
Thu Sep 4 11:11:15 EDT 2014
It appears to be this changeset that caused the performance degradation:
https://github.com/undertow-io/undertow/commit/636590a011ad8497286ef01f19dc9551a16eef79
> -----Original Message-----
> From: undertow-dev-bounces at lists.jboss.org [mailto:undertow-dev-
> bounces at lists.jboss.org] On Behalf Of Andrew Schmidt
> Sent: September-04-2014 10:59 AM
> To: undertow-dev at lists.jboss.org
> Subject: [undertow-dev] InMemorySessionManager.java performance
>
> 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