Hi Sergey.
 
Thanks for the quick feedback!
 
We're using the apache httpclient wth 3.0.4 for some time now without a problem 
(except the ThreadLocal NPE sometimes on startup of the load test).
It's performing really well - to be honest.
 
We only changed the version in the POM for the tests of the various CXF 
Versions (3.0.4 to 3.0.7-SNAPSHOT).
Nothing else of the configuration changed. So something changed with 3.0.6 that 
introduces higher cpu-usage
and increased class loading.
 
Yes, the thread is performing multiple invocations against his self created 
client proxy instance.
Glad to hear, that this doesn't seem to be the problem.
 
I haven't encountered any OOM yet. But I can perform another test that runs a 
longer period.
I'm not sure what causes the constantly increasing class loading. I guess 
that's also the reason why cpu-usage
and memory increases as well. With 3.0.4+3.0.5 class loading was a flat line 
(as you can see on the images).
 
Maybe I can take a heap dump and take a look at the allocated instances to get 
a clue what is going on.
 
Thanks
Veit
--  

Gesendet: Freitag, 18. September 2015 um 13:15 Uhr
Von: "Sergey Beryozkin" <[email protected]>
An: [email protected]
Betreff: Re: Aw: Re: Re: NPE with message body writer during load
Hi Veit
On 18/09/15 12:01, Veit Guna wrote:
> Hi Sergey.
>
> It seems the "problems" came in with 3.0.6 - not with the ThreadLocal fix you 
> did in 3.0.7-SNAPSHOT :).
>
> I'm using the CXF JAX-RS 2.0.1 client proxies using the apache httpclient 
> network driver. I haven't activated
> the "thread-safe" option for the client.
>
> So you say that 3.0.4 worked well, because the clients closed themselves, but 
> that isn't true anymore for CXF version > 3.0.4?

I'm not asserting this is why you are observing a memory growth with
3.0.7-SNAPSHOT. In fact, given that your case is the same thread doing
multiple invocations against the same proxy instance, it would not make
a difference because the proxy is alive all the time so no auto-closing
of the proxy resources happens.

> That means I have to close the client proxy after _each request_? How would 
> that look like? Cast to WebClient? This would
> introduce a lof of boilerplate code that I wanted to avoid using the client 
> proxy :).
>
Yes, with proxy it would not look cool, WebClient.client(proxy).close().
However, I think I can try making proxies Autocloseable so that in try()
it can look neater. It won't make a difference in this case though.

> With "multiple invocations" you mean one thread performs multiple invocations 
> on the same client proxy instance? Or multiple
> threads using the same client proxy instance? The latter case shouldn't 
> happen in my usecase.
>
Yes, I was thinking may be it is the latter, so closing explicitly does
not help...

Well, so I'm not sure what is causing some growth - no state -s
maintained, you do not get OOM though, right ?

May be the difference is you switched from Java HttpUrlConnection to
HttpClient ?

Cheers, Sergey
> Thanks
> Veit
>
>
> Gesendet: Freitag, 18. September 2015 um 11:15 Uhr
> Von: "Sergey Beryozkin" <[email protected]>
> An: [email protected]
> Betreff: Re: Aw: Re: NPE with message body writer during load
> Hi Veit
>
> Thanks for this thorough analysis. The fix I did does not introduce some
> state.
>
> Are you using 2.0 API ? I think in 3.0.4 WebClients (used internally in
> 2.0 impl) were closing themselves automatically in its finalize(). 2.0
> API effectively requires a new instance per every target, so they are
> kept in a weak hash map - but auto-closing the weakly collected clients
> caused some side-effects in the production.
>
> So please make sure a Webclient or JAX-RS 2.0 client is closed between
> multiple invocations.
>
> If that does not help then I'd need a maven test project so that I can
> have a look at the code and experiment...
>
> Cheers, Sergey
> On 18/09/15 08:35, Veit Guna wrote:
>> Mkay. It seems attachments get filtered out. So I uploaded them here:
>>
>> http://s17.postimg.org/vy88qvbtr/cxf304.png
>> http://s17.postimg.org/kn5l2i4yn/cxf305.png[http://s17.postimg.org/kn5l2i4yn/cxf305.png][http://s17.postimg.org/kn5l2i4yn/cxf305.png[http://s17.postimg.org/kn5l2i4yn/cxf305.png]]
>> http://s17.postimg.org/qpd7szten/cxf306.png[http://s17.postimg.org/qpd7szten/cxf306.png][http://s17.postimg.org/qpd7szten/cxf306.png[http://s17.postimg.org/qpd7szten/cxf306.png]]
>> http://s17.postimg.org/sv7inhwv3/cxf307.png[http://s17.postimg.org/sv7inhwv3/cxf307.png][http://s17.postimg.org/sv7inhwv3/cxf307.png[http://s17.postimg.org/sv7inhwv3/cxf307.png]]
>>
>>
>>
>>
>> Gesendet: Freitag, 18. September 2015 um 09:04 Uhr
>> Von: "Veit Guna" <[email protected]>
>> An: [email protected]
>> Betreff: Aw: Re: NPE with message body writer during load
>> Hi Sergey.
>>
>> Thanks for the fix.
>>
>> Now I had time to test the new 3.0.7-SNAPSHOT version. Although I couldn't 
>> reproduce the error again, I encountered other
>> side effects.
>>
>> It seems that now many class load/unload operations are performed. With 
>> 3.0.4, it was a flat line. Now it goes up and down between 5k and 8,5k 
>> loads/unloads.
>> Also, it seems that more memory is needed and CPU usage went from ~10% to 
>> ~20%-30%.
>>
>> So I performed our test with 2 runs, using versions 3.0.4 - 3.0.7-SNAPSHOT. 
>> Please find attached the jvisualvm images for each version.
>> The test uses 50 threads and runs REST CRUD operations concurrently against 
>> a server. I connected the jvisualvm to the testcase for
>> monitoring.
>>
>>
>> 3.0.4: 154s, 147s
>> - "original"
>> 3.0.5: 146s, 146s
>> - almost the same as 3.0.4
>> 3.0.6: 164s, 165s
>> - classloading peaks
>> - higher cpu: 20%-30%
>> 3.0.7: 177s, 163s
>> - classloading peaks
>> - higher cpu: 20%-30%
>>
>> So it seems, that the load/unload came in with 3.0.6 which results in 
>> ~20secs longer runtime of the test
>> and higher CPU usage.
>>
>> Any idea what causes this?
>>
>> I also tested the CXF client within our server application. Here class 
>> loading is constantly increasing from 25k, up to 45k+ - without any occuring 
>> unloading.
>> Performing a manual GC via jvisualvm does not have any effect on that. So I 
>> guess it is leaking somewhere?
>> Test runtime went up from 115secs (3.0.4) to 470secs (3.0.7-SNAPSHOT).
>>
>> Thanks
>> Veit
>>
>>
>>
>> Gesendet: Dienstag, 15. September 2015 um 13:56 Uhr
>> Von: "Sergey Beryozkin" <[email protected]>
>> An: [email protected]
>> Betreff: Re: NPE with message body writer during load
>> This particular issue has been addressed:
>>
>> https://issues.apache.org/jira/browse/CXF-6593[https://issues.apache.org/jira/browse/CXF-6593][https://issues.apache.org/jira/browse/CXF-6593[https://issues.apache.org/jira/browse/CXF-6593]]
>>
>> However this is a short term solution and a more effective solution
>> would need to be done in a new trunk.
>>
>> The way the thread local proxies are managed is somewhat complex in CXF
>> JAX-RS - partially because the bulk of it was written many years back
>> and also because the same provider or resource instance can be shared
>> between multiple endpoints. We can investigate how the code can be
>> re-written when a new Java 8 trunk opens
>>
>> Cheers, Sergey
>>
>>
>> On 10/09/15 11:49, Sergey Beryozkin wrote:
>>> FYI, two more similar issues have been reported in the last couple of days.
>>>
>>> I start suspecting it might be a WeakHashMap optimization I did. In
>>> TomEE, the guys wanted to do a clean refresh of CXF (JAX-RS) module and
>>> the fact the bus was holding strong references to CXF context
>>> implementations such as UriInfoImpl, etc, was problematic (I'll need to
>>> ask Romain for few more details on that). So 'refresh' situations can
>>> possibly release the thread local proxies's content, just speculating
>>> but may be it is related
>>>
>>> So I'm on this issue now :-)
>>>
>>> Thanks, Sergey
>>>
>>>
>>> On 02/09/15 12:24, Sergey Beryozkin wrote:
>>>> Hi
>>>>
>>>> When CXF JAX-RS injects thread-local proxies into providers/resource
>>>> classes it keeps field and method proxy maps on the bus. I recall there
>>>> was a problem in one of the complex setups where there were many
>>>> endpoints with multiple Jackson instances (as opposed to a single
>>>> instance shared between the endpoints) where somehow the provider whose
>>>> thread local proxy was reset depending on the order of the provider
>>>> initialization.
>>>>
>>>> I vaguely recall the side-effect was caused by the fact there were
>>>> different bus instances involved too, this case is now tested in this
>>>> context:
>>>>
>>>> https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml[https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml][https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml[https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml]][https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml[https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml][https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml[https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml]]][https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml[https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml][https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml[https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml]][https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml[https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml][https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml[https://github.com/apache/cxf/blob/master/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml]]]]
>>>>
>>>>
>>>>
>>>> (one of the endpoints has a custom bus)
>>>>
>>>> Perhaps when a client is set up in a complex, possibly multi-threaded
>>>> environment some side-effects with setting tl proxies are possible.
>>>> Example if it is a single/default bus that is shared between all the
>>>> clients then if we have multiple threads then they affect the th maps
>>>> kept on the bus.
>>>> Please experiment with trying to have each client instance have its own
>>>> Bus ? (You can create a unique bus with BusFactory and then set it on
>>>> JAXRSClientFactoryBean before creating a proxy) - if that helps than you
>>>> can limit such a setup to a test env only unless the actual production
>>>> setup is also multi-threaded
>>>>
>>>> HTH, Sergey
>>>>
>>>> On 02/09/15 11:33, Veit Guna wrote:
>>>>> Hi.
>>>>>
>>>>> I'm using CXF 3.0.4 in client proxy mode, using my server REST
>>>>> interfaces.
>>>>> In addition I'm using the httpclient cxf module to workaround earlier
>>>>> problems with concurrency
>>>>> under load (as suggested by Sergey in a post some months ago here on
>>>>> the mailing list).
>>>>>
>>>>> For Multipart handling I'm using the jersey MultiPart JAX-RS
>>>>> MessageBodyWriter on the server
>>>>> as well as on the client.
>>>>>
>>>>> Under normal circumstances all goes well. But sometimes, especially on
>>>>> the startup-phase of the load test,
>>>>> the CXF client proxy dies with the exception below during a Multipart
>>>>> POST. Any clue what might cause this?
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log Caused by:
>>>>> org.apache.cxf.interceptor.Fault: No message body writer has been
>>>>> found for class org.glassfish.jersey.media.multipart.MultiPart,
>>>>> ContentType: multipart/mixed
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.apache.cxf.jaxrs.client.ClientProxyImpl$BodyWriter.doWriteBody(ClientProxyImpl.java:814)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.apache.cxf.jaxrs.client.AbstractClient$AbstractBodyWriter.handleMessage(AbstractClient.java:1042)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.apache.cxf.jaxrs.client.AbstractClient.doRunInterceptorChain(AbstractClient.java:624)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.apache.cxf.jaxrs.client.ClientProxyImpl.doChainedInvocation(ClientProxyImpl.java:674)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.apache.cxf.jaxrs.client.ClientProxyImpl.invoke(ClientProxyImpl.java:224)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> com.sun.proxy.$Proxy484.create(Unknown Source)
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> my.class.doSomething(MyClass.java:383)
>>>>> 0f5ba696ffe4 fns-service.log ... 54 more
>>>>> 0f5ba696ffe4 fns-service.log Caused by:
>>>>> javax.ws.rs.ProcessingException: No message body writer has been found
>>>>> for class org.glassfish.jersey.media.multipart.MultiPart, ContentType:
>>>>> multipart/mixed
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.apache.cxf.jaxrs.client.AbstractClient.reportMessageHandlerProblem(AbstractClient.java:741)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:470)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.apache.cxf.jaxrs.client.ClientProxyImpl$BodyWriter.doWriteBody(ClientProxyImpl.java:804)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log ... 62 more
>>>>> 0f5ba696ffe4 fns-service.log Caused by: java.lang.NullPointerException
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.apache.cxf.jaxrs.impl.tl.ThreadLocalProviders.getMessageBodyWriter(ThreadLocalProviders.java:46)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.glassfish.jersey.media.multipart.internal.MultiPartWriter.writeTo(MultiPartWriter.java:222)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.glassfish.jersey.media.multipart.internal.MultiPartWriter.writeTo(MultiPartWriter.java:79)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.apache.cxf.jaxrs.utils.JAXRSUtils.writeMessageBody(JAXRSUtils.java:1379)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log at
>>>>> org.apache.cxf.jaxrs.client.AbstractClient.writeBody(AbstractClient.java:456)
>>>>>
>>>>>
>>>>> 0f5ba696ffe4 fns-service.log ... 63 more
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>> --
>> Sergey Beryozkin
>>
>> Talend Community Coders
>> http://coders.talend.com/[http://coders.talend.com/][http://coders.talend.com/[http://coders.talend.com/]][http://coders.talend.com/[http://coders.talend.com/][http://coders.talend.com/[http://coders.talend.com/]]][http://coders.talend.com/[http://coders.talend.com/][http://coders.talend.com/[http://coders.talend.com/]][http://coders.talend.com/[http://coders.talend.com/][http://coders.talend.com/[http://coders.talend.com/]]]]
>>
>
>
> --
> Sergey Beryozkin
>
> Talend Community Coders
> http://coders.talend.com/[http://coders.talend.com/][http://coders.talend.com/[http://coders.talend.com/]]
>
 

Reply via email to