Question

We are running a jruby/rails app under tomcat, and can not immediately make the shift to threadsafe due to some of the components we are using. In the interim we plan to set jruby.runtime.min and jruby.runtime.max to prevent perm-gen out of memory errors. Unfortunately this will throttle the number of concurrent users to a fairly small number, so my question is when does the runtime get recycled? Is it session based or something else. Would lowetring session timeout help to speed up the availability of pools or is there more to it than that. Any links to better understand the specifics of how jruby runtime works would be appreciated.

Was it helpful?

Solution

first of all there's a bit of confusion in the q - setting min/max runtime parameters will not prevent perm-gen errors ... you will likely need to increase memory a bit (depending on your application's footprint) as you're seeing those esp. if you're setting min/max values higher.

secondly - it will sure throttle concurrency but not that much - think of it as mongrel (thin) cluster: concurrent requests handled >= the number of running instances

a single runtime is blocked for the duration of a single request (does not depend at all on any session state), after the response is returned the runtime is returned to the pool and is ready to handle another requests. if a request comes in and there's no runtime in the pool it will try to wait for one to become available before returning a HTTP error (can be configured using jruby.runtime.acquire.timeout).

I would recommend to run or at least (integration) test with min = max since booting a runtime on demand might be costly (yet again this is application dependent) and at the same time it's harder to guess your memory requirement when you boot up a Rails instance on demand while serving. be aware that it might take a while to boot since your application needs loading on deploy min-times.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top