I'll take a look...

-- Peter


On Jan 12, 2012, at 4:53 PM, Peter Firmstone wrote:

> Hi Peter,
> 
> I was wondering if you had any thoughts on this post from Bryan on River 
> users?
> 
> Hope you don't mind me asking ;)
> 
> Best Regards,
> 
> Peter Firmstone.
> 
> From: Tom Hobbs <tvho...@googlemail.com>
> Date: January 12, 2012 3:45:01 PM EST
> To: u...@river.apache.org, dev@river.apache.org
> Subject: Re: DGC threads issue
> Reply-To: dev@river.apache.org
> 
> 
> Hi Bryan,
> 
> Sorry that no one got back to you about this.  I'm afraid that I don't
> know the answer to your question, I've copied the dev list into this
> email in case someone who monitors that list (but not this one) has
> any ideas.
> 
> Best regards,
> 
> Tom
> 
> On Thu, Jan 12, 2012 at 2:29 PM, Bryan Thompson <br...@systap.com> wrote:
>> Just to follow up on this thread myself.  I modified the pattern to return a 
>> "thick" future rather than a proxy for the future.  This caused the RMI call 
>> to wait on the server until the future was done and then sent back the 
>> outcome.  This "fixed" the DGC memory/thread leak by reducing the number of 
>> exported proxies drammatically.
>> 
>> In terms of best practices, is distributed DGC simply not useful for 
>> exported objects with short life spans?  Can it only be used with proxies 
>> for relatively long lived services?
>> 
>> Thanks,
>> Bryan
>> 
>>> -----Original Message-----
>>> From: Bryan Thompson
>>> Sent: Tuesday, January 03, 2012 12:06 PM
>>> To: u...@river.apache.org
>>> Subject: DGC threads issue
>>> 
>>> Hello,
>>> 
>>> Background:
>>> 
>>> I am seeing what would appear to be one DGC thread allocated
>>> per exported object.  This is using River 2.2 and Sun JDK
>>> 1.6.0_17.  Relevant configuration parameters are below.
>>> 
>>> I am observing problems with the DGC threads not being
>>> retired on a timely basis.  The exported objects are proxies
>>> for Futures which are being executed on the service.  The
>>> code pattern is such that the proxied Future goes out of
>>> lexical scope quite quickly.  E.g.,
>>> rmiCallReturningProxyForFuture().get().
>>> 
>>> Under a modest load, a large number of such Futures are
>>> exported which results in a large number of long lived DGC
>>> threads.  This turns into a problem for the JVM due to the
>>> stack allocation per thread.  Presumably this is not good for
>>> other reasons as well (e.g., scheduling).
>>> 
>>> I have tried to override the leaseValue and checkInterval
>>> defaults per the configuration options below.  I suspect that
>>> the lease interval is somehow not being obeyed, which is
>>> presumably a problem on my end.  However, I can verify that
>>> the configuration values are in fact showing up in
>>> System.getProperties() for at least some of the JVMs involved
>>> (the one which drives the workload and the one that I am
>>> monitoring with the large number of DGC lease threads).
>>> 
>>> Some questions:
>>> 
>>> Is this one-thread-per-exported proxy the expected behavior
>>> when DGC is requested for the exported object?
>>> 
>>> The DGC lease checker threads appear to expire ~14 - 15
>>> minutes after I terminate the process which was originating
>>> the RMI requests.  This is close the sum of the default
>>> leaseValue (10m) and checkInterval (5m) parameters, but maybe
>>> there is some other timeout which is controlling this?  If
>>> this is the sum of those parameters, why would the DGC lease
>>> threads live until the sum of those values?  I thought that
>>> the lease would expire after the leaseValue (10m default).
>>> 
>>> Can the issue I am observing be caused by a low heap pressure
>>> on the JVM to which the RMI proxies were exported?  If it
>>> fails to GC those proxies, even though they are reachable,
>>> could that cause DGC to continue to retain those proxies on
>>> the JVM which exported them?
>>> 
>>> Is there any way to configure DGC to use a thread pool or to
>>> have the leases managed by a single thread?
>>> 
>>> Is it possible that there is an interaction with the useNIO option?
>>> 
>>> Relevant options that I am using include:
>>> 
>>>    -Dcom.sun.jini.jeri.tcp.useNIO=true
>>>    -Djava.rmi.dgc.leaseValue=30000
>>>    -Dsun.rmi.dgc.checkInterval=15000
>>>    -Dsun.rmi.transport.tcp.connectionPool=true
>>> 
>>> Thanks in advance,
>>> Bryan
> 
> 
> 

Reply via email to