[ 
https://issues.apache.org/jira/browse/HTTPCORE-155?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12659132#action_12659132
 ] 

Michael Clark commented on HTTPCORE-155:
----------------------------------------

Hi all,

As I understand it, the root problem is that 
java.nio.channels.SelectionKey#interestOps(int) is allowed to block, and, in 
the IBM JDK, this allowance is taken to heart, and the method really does block 
for some time.  In fact, it blocks for so much time that it is undesirable to 
invoke SelectionKey#interestOps(int) on the reactor thread, as this will delay 
the reactor thread from dispatching (potentially thousands of) other 
ready-to-distribute events, which ends up causing performance degradation for 
other, unrelated connections.

I'm hoping I understand the problem correctly, as I have a couple 
questions/concerns about Marc's proposed changes. One is that it seems to me 
that the invocation of SelectionKey#interestOps(int) is still being done on the 
reactor thread -- it is just being done at a different stage within the 
reactor's execution loop.  To me, it seems like this should not solve the core 
problem.  The reactor thread is still invoking SelectionKey#interestOps(int), 
and presumably SelectionKey#interestOps(int) is still blocking, and if I am 
understanding things correctly, the reactor will still be choked during this 
block.

My second question/concern is the hard-coding of the Selector#select(long) 
timeout parameter to 1 millisecond.  At face value, this seems less than ideal. 
 I am not knowledgeable enough yet about NIO and the HC non-blocking API to 
make a judgment call on this... architecturally.  However, if the select 
timeout is going to be hard-coded, the member variable 
AbstractIOReactor#selectTimeout should be removed, renamed or re-purposed -- as 
it is no longer be honored as part of the selection process.

Would perhaps a better solution to this problem, be to introduce or reuse an 
Executor thread pool (where? TBD), and hand off the task of setting interestOps 
to a non-reactor worker thread?  Of course, this makes the setting of 
interestOps asynchronous to the reactor -- the impact of which must be 
evaluated and dealt with.  I am not yet quite far enough along in researching 
NIO and the Reactor to determine how to properly manage any intermediate state, 
if this change were to be introduced.  For example, it seems to me that certain 
operations should only proceed/occur after the interestOps have successfully 
been set.  I need to determine what these operations are, how they are 
triggered, and how to make sure they happen at the right time, and on the right 
thread, even in the face of interestOps being set asynchronously.

regards,

Mike


> Performance issues with IBM JRE 6.0
> -----------------------------------
>
>                 Key: HTTPCORE-155
>                 URL: https://issues.apache.org/jira/browse/HTTPCORE-155
>             Project: HttpComponents HttpCore
>          Issue Type: Bug
>          Components: HttpCore NIO
>    Affects Versions: 4.0-beta1
>         Environment: Windows 2003 SP2 - IBM J2RE 1.6.0 build 2.4 - HTTPCore 
> Beta1 - Dual Core CPU 3.0Ghz - 1Gbps networking
>            Reporter: Tom McSorley
>             Fix For: 4.1
>
>         Attachments: AbstractIOReactor.diff, AbstractIOReactor.java, 
> IOSessionImpl.diff, IOSessionImpl.java, 
> javacore.20081203.153723.32300.0001.txt, patch.08-12-17.tar.gz, 
> patch.08-12-18.tar.gz, patch.08-12-22.tar.gz
>
>
> I'm issuing a second HTTP Request on a connection that has very recently 
> returned a null for the submitRequest() call...  this 2nd request is being 
> issued approximately 500ms after the submitRequest() null is returned... so 
> the connection has just been established, an HTTP Request/Response-200 cycle 
> has completed just prior to this 2nd request being issued.  I'm seeing 
> unusually long delays in the requestOutput() call (verified by surrounding 
> timing prints)... that can range anywhere from a few milliseconds on up to 60 
> seconds...  It eventually unwinds, and then the submitRequest() is called... 
> this 2nd request is dispatched and works fine... but, it is delayed 
> considerably...  Is this a known issue and is there a possible work-around?
> Here's the JVM related thread information:
> The thread being delayed and stuck in the requestOutput() call for a long 
> time (mostly longer than 5 seconds):
> 3XMTHREADINFO      "pool-2-thread-5" TID:0x2AEECE00, j9thread_t:0x2A7189A8, 
> state:B, prio=5
> 3XMTHREADINFO1            (native thread ID:0x1B44, native priority:0x5, 
> native policy:UNKNOWN)
> 4XESTACKTRACE          at 
> sun/nio/ch/SelectionKeyImpl.interestOps(SelectionKeyImpl.java:60)
> 4XESTACKTRACE          at 
> org/apache/http/impl/nio/reactor/IOSessionImpl.setEvent(IOSessionImpl.java:113)
> 4XESTACKTRACE          at 
> org/apache/http/impl/nio/NHttpConnectionBase.requestOutput(NHttpConnectionBase.java:158)
> .... (non important stack information removed)
> 4XESTACKTRACE          at 
> java/util/concurrent/ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:919)
> 4XESTACKTRACE          at java/lang/Thread.run(Thread.java:735)
> Here's the monitor that this thread is blocked and waiting on:
> 2LKMONINUSE      sys_mon_t:0x2A708AF8 infl_mon_t: 0x2A708B30:
> 3LKMONOBJECT       sun/nio/ch/uti...@00b09208/00B09214: Flat locked by "I/O 
> dispatcher 7" (0x2A208E00), entry count 1
> 3LKWAITERQ            Waiting to enter:
> 3LKWAITER                "pool-2-thread-5" (0x2AEECE00)
> And here's the thread that currently has this monitor locked:
> 3XMTHREADINFO      "I/O dispatcher 7" TID:0x2A208E00, j9thread_t:0x2A6EC73C, 
> state:R, prio=5
> 3XMTHREADINFO1            (native thread ID:0x830, native priority:0x5, 
> native policy:UNKNOWN)
> 4XESTACKTRACE          at 
> sun/nio/ch/WindowsSelectorImpl$SubSelector.poll0(Native Method)
> 4XESTACKTRACE          at 
> sun/nio/ch/WindowsSelectorImpl$SubSelector.poll(WindowsSelectorImpl.java:308(Compiled
>  Code))
> 4XESTACKTRACE          at 
> sun/nio/ch/WindowsSelectorImpl$SubSelector.access$500(WindowsSelectorImpl.java(Compiled
>  Code))
> 4XESTACKTRACE          at 
> sun/nio/ch/WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:162(Compiled 
> Code))
> 4XESTACKTRACE          at 
> sun/nio/ch/SelectorImpl.lockAndDoSelect(SelectorImpl.java:69(Compiled Code))
> 4XESTACKTRACE          at 
> sun/nio/ch/SelectorImpl.select(SelectorImpl.java:80(Compiled Code))
> 4XESTACKTRACE          at 
> org/apache/http/impl/nio/reactor/AbstractIOReactor.execute(AbstractIOReactor.java:121)
> 4XESTACKTRACE          at 
> org/apache/http/impl/nio/reactor/BaseIOReactor.execute(BaseIOReactor.java:70)
> 4XESTACKTRACE          at 
> org/apache/http/impl/nio/reactor/AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:318)
> 4XESTACKTRACE          at java/lang/Thread.run(Thread.java:735)
> I should also note that we're attempting to use 1000 client instances on this 
> single system... each with potentially 2 active connections simultaneously... 
> there is also virtually no CPU load (i.e. less then 5%) on this system...

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to