Hi Alex,

it's quite likely connected to this JIRA :

https://issues.apache.org/jira/browse/DIRMINA-948?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13790224#comment-13790224

right ?



Le 10/9/13 3:14 PM, Alexandros Touloupis a écrit :
> Hi all,
>
> I am currently stress testing my application that uses MINA. In my stress
> test I am quite satisfied with the TPS handled by the application, but
> still i think there is room for improvement.
> I am using mina 2.0.7 and i monitored during the stress test using the
> VisualVM. CPU sampler shows  huge amount spend in the
> DefaultWriteRequestQueue.size method.
>
> org.apache.mina.core.session.DefaultIoSessionDataStructureFactory$DefaultWriteRequestQueue.size()
> 70.299576 2138327 ms (70.3%) 2138327 ms
>
> From the thread dump I could see that most threads were spending most of
> the time in the following stack trace:
>
>    java.lang.Thread.State: RUNNABLE
> at
> java.util.concurrent.ConcurrentLinkedQueue.size(ConcurrentLinkedQueue.java:449)
> at
> org.apache.mina.core.session.DefaultIoSessionDataStructureFactory$DefaultWriteRequestQueue.size(DefaultIoSessionDataStructureFactory.java:232)
> at
> org.apache.mina.core.session.AbstractIoSession$CloseAwareWriteQueue.size(AbstractIoSession.java:1388)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain$HeadFilter.filterWrite(DefaultIoFilterChain.java:600)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:482)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1400(DefaultIoFilterChain.java:47)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:775)
> at
> org.apache.mina.core.filterchain.IoFilterAdapter.filterWrite(IoFilterAdapter.java:123)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:482)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1400(DefaultIoFilterChain.java:47)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:775)
> at
> org.apache.mina.filter.codec.ProtocolCodecFilter.filterWrite(ProtocolCodecFilter.java:331)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:482)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1400(DefaultIoFilterChain.java:47)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.filterWrite(DefaultIoFilterChain.java:775)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain$TailFilter.filterWrite(DefaultIoFilterChain.java:705)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain.callPreviousFilterWrite(DefaultIoFilterChain.java:482)
> at
> org.apache.mina.core.filterchain.DefaultIoFilterChain.fireFilterWrite(DefaultIoFilterChain.java:475)
> at
> org.apache.mina.core.session.AbstractIoSession.write(AbstractIoSession.java:494)
> at
> org.apache.mina.core.session.AbstractIoSession.write(AbstractIoSession.java:439)
>
>
> As it is states in the javadoc
> http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html
> ConcurrentLinkedQueue#size()
> method is *NOT* a constant-time operation.
> Actually it seems quite costly as it tries to determine the first element
> in a for(;;) loop (
> http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/AbstractCollection.java#AbstractCollection.size%28%29
> ). Since the stress test adds in the queue constantly i think that there,
> the problems begins.
>
> I found a commit related to the following code in DefaultIoChain (
> http://mail-archives.apache.org/mod_mbox/mina-commits/201209.mbox/%3c20120928145021.1d32c2388...@eris.apache.org%3E
> )
>
> -            s.getWriteRequestQueue().offer(s, writeRequest);
> +            WriteRequestQueue writeRequestQueue = s.getWriteRequestQueue();
> +
>              if (!s.isWriteSuspended()) {
> -                s.getProcessor().flush(s);
> +                if (writeRequestQueue.size() == 0) {
> +                    // We can write directly the message
> +                    s.getProcessor().write(s, writeRequest);
> +                } else {
> +                    s.getWriteRequestQueue().offer(s, writeRequest);
> +                    s.getProcessor().flush(s);
> +                }
> +            } else {
> +                s.getWriteRequestQueue().offer(s, writeRequest);
>              }
>          }
>
>
> Is this improvement really necessary? The "if
> (writeRequestQueue.size() == 0)" statement seems to be causing huge
> load for me.
>
>
> Thank you in advance!
>
> Best regards,
>
> Alex
>


-- 
Regards,
Cordialement,
Emmanuel Lécharny
www.iktek.com 

Reply via email to