[
https://issues.apache.org/jira/browse/DIRMINA-934?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14371499#comment-14371499
]
Chris Kistner commented on DIRMINA-934:
---------------------------------------
Thanks [~quhw]!
With MINA 2.0.7, we used to create the acceptor with 20 NIO processors and it
worked pretty well:
{code:java}acceptor = new NioSocketAcceptor(NIO_ACCEPTOR_THREADS);
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new
OurProtocolCodecFactory()));{code}
However with MINA 2.0.8/2.0.9, the performance degraded considerably, where all
20 of our MINA threads were in a waiting state:
{noformat}"NioProcessor-5" - Thread t@1091
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <1562a344> (a
java.util.concurrent.Semaphore$FairSync)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:994)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1303)
at java.util.concurrent.Semaphore.acquire(Semaphore.java:317)
at
org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:231)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:943)
at
org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:109)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542)
at
org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:535)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:714)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:668)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:657)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:67)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1121)
at
org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Locked ownable synchronizers:
- locked <72562fdf> (a
java.util.concurrent.ThreadPoolExecutor$Worker){noformat}
Now I've changed our code to add the threadpool to the filter chain to get the
performance like we had with MINA 2.0.7:
{code:java}minaWorkers = new OrderedThreadPoolExecutor(1, nioProcessorCount,
60L, TimeUnit.SECONDS,
new OurLablingDefaultThreadFactory("minaWorker"), null);
acceptor = new NioSocketAcceptor(2);
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new
OurProtocolCodecFactory()));
acceptor.getFilterChain().addLast("minaWorkers", new
ExecutorFilter(minaWorkers));{code}
Alsod take note that if you don't specify the processorCount argument for the
NioSocketAcceptor and you have more than 1 CPU core/thread (like if you have a
Quad Core Xeon CPU with hyperthreading enabled), you may also run into this
semaphore lock issue under high network loads! We haven't experimented yet with
other values for the processorCount to see where the threshold/optimum
performance is.
I hope this helps other people struggling with the same issue.
> Replace synchronized with a Semaphore for better performance
> ------------------------------------------------------------
>
> Key: DIRMINA-934
> URL: https://issues.apache.org/jira/browse/DIRMINA-934
> Project: MINA
> Issue Type: Improvement
> Components: Core
> Affects Versions: 2.0.7, 2.0.8
> Environment: Window 8 Pro x64, JDK 7
> Reporter: Paul Gregoire
> Labels: patch
> Fix For: 2.0.8
>
> Attachments: ProtocolCodecFilterWithSemaphoreAndMore.diff
>
> Original Estimate: 2h
> Remaining Estimate: 2h
>
> Replacing the synchronized block with a Semaphore in the ProtocolCodecFilter
> provides a lot of benefit in terms of locking and also reduces CPU
> utilization. See attached git diff.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)