On Tue, Nov 18, 2014 at 2:43 PM, Christopher Schultz
<ch...@christopherschultz.net> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
>
> Lisa,
>
> On 11/18/14 11:52 AM, Lisa Woodring wrote:
>> We recently upgraded from Tomcat 6.0.29 to Tomcat 8.0.14.
>> Everything appears to be working fine, except that Tomcat is
>> keeping a high # of threads (in TIMED_WAITING state) -- and the CPU
>> has a high load & low idle time.  We are currently running Tomcat8
>> on 2 internal test machines, where we also monitor their
>> statistics.  In order to monitor the availability of the HTTPS/AJP
>> port (Apache-->Tomcat), our monitoring software opens a port to
>> verify that this works -- but then does not follow that up with an
>> actual request.  This happens every 2 minutes.  We have noticed
>> that the high thread/load activity on Tomcat coincides with this
>> monitoring.  If we disable our monitoring, the issue does not
>> happen.  We have enabled/disabled the monitoring on both machines
>> over several days (and there is only very minimal, sometimes
>> non-existent) internal traffic otherwise) -- in order to verify
>> that the monitoring is really the issue.  Once these threads ramp
>> up, they stay there or keep increasing.  We had no issues running
>> on Tomcat 6 (the thread count stayed low, low load, high idle
>> time).
>>
>> The thread backtraces for these threads look like this:
>> -----------------------------------------------------------------------------
>>
>>
> Thread[catalina-exec-24,5,main]
>> at sun.misc.Unsafe.park(Native Method) at
>> java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
>>
>>
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
>> at
>> java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
>>
>>
> at org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:85)
>> at
>> org.apache.tomcat.util.threads.TaskQueue.poll(TaskQueue.java:31) at
>> java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
>>
>>
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
>> at
>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>>
>>
> at
> org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
>> at java.lang.Thread.run(Thread.java:745)
>> -----------------------------------------------------------------------------
>>
>>
> The thread count grows over time (goes up to 130-150 threads after 2
>> hours).  Setting 'connectionTimeout' (as opposed to the default of
>> never timing out) does seems to help "some" -- the # of threads
>> isn't quite as bad (only 60-80 threads after 2 hours).  However,
>> the CPU Idle % is still not good -- was only 10% idle with default
>> tomcat settings, is something like 40% idle with current settings.
>> Also tried setting Apache's 'KeepAliveTimeout = 5' (currently set
>> to 15) but this did not make any difference.
>>
>>
>> Is there some configuration we can set to make Tomcat tolerant of
>> this monitoring?  (We have tried setting connectionTimeout &
>> keepAliveTimeout on the Connector.  And we have tried putting the
>> Connector behind an Executor with maxIdleTime.) OR, should we
>> modify our monitoring somehow?  And if so, suggestions?
>>
>>
>> * Running on Linux CentOS release 5.9 * running Apache in front of
>> Tomcat for authentication, using mod_jk * Tomcat 8.0.14
>>
>> relevant sections of tomcat/conf/server.xml:
>> ------------------------------------------------------------------------
>>
>>
> <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
>> maxThreads="250" minSpareThreads="20" maxIdleTime="60000" />
>>
>> <Connector executor="tomcatThreadPool" port="8080"
>> protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"
>> />
>>
>> <Connector executor="tomcatThreadPool" port="8009"
>> protocol="AJP/1.3" redirectPort="8443" maxThreads="256"
>> connectionTimeout="3000" keepAliveTimeout="60000" />
>
> Both of these connectors should be NIO connectors, so they should not
> block while waiting for more input. That means that you should not run
> out of threads (which is good), but those connections will sit in the
> poller queue for a long time (20 seconds for HTTP, 3 seconds for AJP)
> and then sit in the acceptor queue for the same amount of time (to
> check for a "next" keepAlive request). Are you properly shutting-down
> the connection on the client end every 2 minutes?
>



The monitoring software is trying to test is that the AJP port itself
is actually accepting connections.  With Apache in front in a
production system, it could forward the actual request to one of
several Tomcat boxes -- but we don't know which one from the outside.
The monitoring software is trying to test -- for each Tomcat instance
-- if it is accepting connections.  It used to send an "nmap" request,
but now sends essentially a "tcp ping" -- to port 8009, gets a
response & moves on.  So, no, it does not shutdown the connection --
it's pretty simple/dumb.

My main questions are:
1) Why was this ok on Tomcat 6?  but now an issue with Tomcat 8?
2) Suggestions on how to monitor this better?



The graphing I have -- are images.  Is there a good way to share these?


>> ----------------------------------------------------------------------------
>>
>>  If interested, I can provide graphing of the machine's thread
>> count, cpu idle%, and cpu load. Any suggestions would be most
>> welcome.
>
> More data is always good. Remember that the list strips attachments,
> so maybe paste it somewhere (e.g. pastebin or whatever) and provide a
> link.
>
> - -chris

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to