You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2021/11/22 10:46:01 UTC
[tomcat] branch 8.5.x updated: Force the use of a single acceptor thread
This is an automated email from the ASF dual-hosted git repository.
markt pushed a commit to branch 8.5.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/8.5.x by this push:
new ead24df Force the use of a single acceptor thread
ead24df is described below
commit ead24df9f54def700c1e6335212c85dc434e3fd1
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Mon Nov 22 10:45:38 2021 +0000
Force the use of a single acceptor thread
9.0.x onwards uses a single acceptor thread.
Multiple acceptor threads offered little/no performance benefit.
Using a single acceptor thread allows bbbb7a8c (detect and protect
against a known OS bug) to be back-ported
---
java/org/apache/coyote/AbstractProtocol.java | 18 +++++++
.../apache/tomcat/util/net/AbstractEndpoint.java | 57 ++++++++++++++++------
java/org/apache/tomcat/util/net/AprEndpoint.java | 10 ++--
java/org/apache/tomcat/util/net/Nio2Endpoint.java | 6 ---
java/org/apache/tomcat/util/net/NioEndpoint.java | 5 --
.../apache/tomcat/util/net/mbeans-descriptors.xml | 9 ++--
webapps/docs/changelog.xml | 3 ++
webapps/docs/config/ajp.xml | 10 +---
webapps/docs/config/http.xml | 10 +---
9 files changed, 73 insertions(+), 55 deletions(-)
diff --git a/java/org/apache/coyote/AbstractProtocol.java b/java/org/apache/coyote/AbstractProtocol.java
index 002b0c0..43f465a 100644
--- a/java/org/apache/coyote/AbstractProtocol.java
+++ b/java/org/apache/coyote/AbstractProtocol.java
@@ -337,9 +337,27 @@ public abstract class AbstractProtocol<S> implements ProtocolHandler,
return endpoint.getConnectionCount();
}
+ /**
+ * Unused.
+ *
+ * @param threadCount Ignored
+ *
+ * @deprecated This attribute is hard-coded to {@code 1} and is no longer
+ * configurable.
+ */
+ @Deprecated
public void setAcceptorThreadCount(int threadCount) {
endpoint.setAcceptorThreadCount(threadCount);
}
+ /**
+ * Unused.
+ *
+ * @return Always returns {@code 1}
+ *
+ * @deprecated This attribute is hard-coded to {@code 1} and is no longer
+ * configurable.
+ */
+ @Deprecated
public int getAcceptorThreadCount() {
return endpoint.getAcceptorThreadCount();
}
diff --git a/java/org/apache/tomcat/util/net/AbstractEndpoint.java b/java/org/apache/tomcat/util/net/AbstractEndpoint.java
index 8830658..072e5b6 100644
--- a/java/org/apache/tomcat/util/net/AbstractEndpoint.java
+++ b/java/org/apache/tomcat/util/net/AbstractEndpoint.java
@@ -191,7 +191,8 @@ public abstract class AbstractEndpoint<S> {
}
/**
- * Threads used to accept new connections and pass them to worker threads.
+ * Thread used to accept new connections and pass them to worker threads.
+ * This is hard-coded to use a single acceptor.
*/
protected Acceptor[] acceptors;
@@ -445,14 +446,39 @@ public abstract class AbstractEndpoint<S> {
/**
- * Acceptor thread count.
+ * Unused.
+ *
+ * @deprecated This attribute is hard-coded to {@code 1} and is no longer
+ * configurable.
*/
+ @Deprecated
protected int acceptorThreadCount = 1;
+ /**
+ * Unused.
+ *
+ * @param acceptorThreadCount Ignored
+ *
+ * @deprecated This attribute is hard-coded to {@code 1} and is no longer
+ * configurable.
+ */
+ @Deprecated
public void setAcceptorThreadCount(int acceptorThreadCount) {
- this.acceptorThreadCount = acceptorThreadCount;
+ // NO-OP;
+ }
+
+ /**
+ * Unused.
+ *
+ * @return Always returns {@code 1}
+ *
+ * @deprecated This attribute is hard-coded to {@code 1} and is no longer
+ * configurable.
+ */
+ @Deprecated
+ public int getAcceptorThreadCount() {
+ return 1;
}
- public int getAcceptorThreadCount() { return acceptorThreadCount; }
/**
@@ -1014,6 +1040,8 @@ public abstract class AbstractEndpoint<S> {
}
}
// Wait for upto 1000ms acceptor threads to unlock
+ // Should only be one thread but retain this code in case the
+ // acceptor start has been customised.
long waitLeft = 1000;
for (Acceptor acceptor : acceptors) {
while (waitLeft > 0 &&
@@ -1238,18 +1266,15 @@ public abstract class AbstractEndpoint<S> {
}
protected final void startAcceptorThreads() {
- int count = getAcceptorThreadCount();
- acceptors = new Acceptor[count];
-
- for (int i = 0; i < count; i++) {
- acceptors[i] = createAcceptor();
- String threadName = getName() + "-Acceptor-" + i;
- acceptors[i].setThreadName(threadName);
- Thread t = new Thread(acceptors[i], threadName);
- t.setPriority(getAcceptorThreadPriority());
- t.setDaemon(getDaemon());
- t.start();
- }
+ acceptors = new Acceptor[1];
+
+ acceptors[0] = createAcceptor();
+ String threadName = getName() + "-Acceptor-0";
+ acceptors[0].setThreadName(threadName);
+ Thread t = new Thread(acceptors[0], threadName);
+ t.setPriority(getAcceptorThreadPriority());
+ t.setDaemon(getDaemon());
+ t.start();
}
diff --git a/java/org/apache/tomcat/util/net/AprEndpoint.java b/java/org/apache/tomcat/util/net/AprEndpoint.java
index 96542db..8556040 100644
--- a/java/org/apache/tomcat/util/net/AprEndpoint.java
+++ b/java/org/apache/tomcat/util/net/AprEndpoint.java
@@ -349,12 +349,6 @@ public class AprEndpoint extends AbstractEndpoint<Long> implements SNICallBack {
setUseSendfileInternal(false);
}
- // Initialize thread count default for acceptor
- if (acceptorThreadCount == 0) {
- // FIXME: Doesn't seem to work that well with multiple accept threads
- acceptorThreadCount = 1;
- }
-
// Delay accepting of new connections until data is available
// Only Linux kernels 2.4 + have that implemented
// on other platforms this call is noop and will return APR_ENOTIMPL.
@@ -496,7 +490,9 @@ public class AprEndpoint extends AbstractEndpoint<Long> implements SNICallBack {
// Stop the Poller calling select
poller.stop();
- // Wait for the acceptor(s) to shutdown
+ // Wait for the acceptor to shutdown.
+ // Should only be one thread but retain this code in case the
+ // acceptor start has been customised.
for (AbstractEndpoint.Acceptor acceptor : acceptors) {
long waitLeft = 10000;
while (waitLeft > 0 &&
diff --git a/java/org/apache/tomcat/util/net/Nio2Endpoint.java b/java/org/apache/tomcat/util/net/Nio2Endpoint.java
index a2e0bd3..84a8303 100644
--- a/java/org/apache/tomcat/util/net/Nio2Endpoint.java
+++ b/java/org/apache/tomcat/util/net/Nio2Endpoint.java
@@ -147,12 +147,6 @@ public class Nio2Endpoint extends AbstractJsseEndpoint<Nio2Channel> {
InetSocketAddress addr = (getAddress()!=null?new InetSocketAddress(getAddress(),getPort()):new InetSocketAddress(getPort()));
serverSock.bind(addr, getAcceptCount());
- // Initialize thread count defaults for acceptor, poller
- if (acceptorThreadCount != 1) {
- // NIO2 does not allow any form of IO concurrency
- acceptorThreadCount = 1;
- }
-
// Initialize SSL if needed
initialiseSsl();
}
diff --git a/java/org/apache/tomcat/util/net/NioEndpoint.java b/java/org/apache/tomcat/util/net/NioEndpoint.java
index 8f2ee6c..6826985 100644
--- a/java/org/apache/tomcat/util/net/NioEndpoint.java
+++ b/java/org/apache/tomcat/util/net/NioEndpoint.java
@@ -231,11 +231,6 @@ public class NioEndpoint extends AbstractJsseEndpoint<NioChannel> {
}
serverSock.configureBlocking(true); //mimic APR behavior
- // Initialize thread count defaults for acceptor, poller
- if (acceptorThreadCount == 0) {
- // FIXME: Doesn't seem to work that well with multiple accept threads
- acceptorThreadCount = 1;
- }
if (pollerThreadCount <= 0) {
//minimum one poller thread
pollerThreadCount = 1;
diff --git a/java/org/apache/tomcat/util/net/mbeans-descriptors.xml b/java/org/apache/tomcat/util/net/mbeans-descriptors.xml
index fbff758..62642dd 100644
--- a/java/org/apache/tomcat/util/net/mbeans-descriptors.xml
+++ b/java/org/apache/tomcat/util/net/mbeans-descriptors.xml
@@ -30,7 +30,8 @@
type="int"/>
<attribute name="acceptorThreadCount"
- type="int"/>
+ type="int"
+ description="Deprecated - do not use"/>
<attribute name="acceptorThreadPriority"
type="int"/>
@@ -253,7 +254,8 @@
type="int"/>
<attribute name="acceptorThreadCount"
- type="int"/>
+ type="int"
+ description="Deprecated - do not use"/>
<attribute name="acceptorThreadPriority"
type="int"/>
@@ -464,7 +466,8 @@
type="int"/>
<attribute name="acceptorThreadCount"
- type="int"/>
+ type="int"
+ description="Deprecated - do not use"/>
<attribute name="acceptorThreadPriority"
type="int"/>
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index e590f85..ea16c3a 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -156,6 +156,9 @@
Improve error handling if APR/Native fails to accept an incoming
connection. (markt)
</fix>
+ <add>
+ Hard code all connectors to use a single acceptor thread. (markt)
+ </add>
</changelog>
</subsection>
<subsection name="WebSocket">
diff --git a/webapps/docs/config/ajp.xml b/webapps/docs/config/ajp.xml
index de88e29..75d0049 100644
--- a/webapps/docs/config/ajp.xml
+++ b/webapps/docs/config/ajp.xml
@@ -321,16 +321,8 @@
value is 100.</p>
</attribute>
- <attribute name="acceptorThreadCount" required="false">
- <p>The number of threads to be used to accept connections. Increase this
- value on a multi CPU machine, although you would never really need more
- than <code>2</code>. Also, with a lot of non keep alive connections, you
- might want to increase this value as well. Default value is
- <code>1</code>.</p>
- </attribute>
-
<attribute name="acceptorThreadPriority" required="false">
- <p>The priority of the acceptor threads. The threads used to accept
+ <p>The priority of the acceptor thread. The thread used to accept
new connections. The default value is <code>5</code> (the value of the
<code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc
for the <code>java.lang.Thread</code> class for more details on what
diff --git a/webapps/docs/config/http.xml b/webapps/docs/config/http.xml
index aa1da23..8017844 100644
--- a/webapps/docs/config/http.xml
+++ b/webapps/docs/config/http.xml
@@ -349,16 +349,8 @@
value is 100.</p>
</attribute>
- <attribute name="acceptorThreadCount" required="false">
- <p>The number of threads to be used to accept connections. Increase this
- value on a multi CPU machine, although you would never really need more
- than <code>2</code>. Also, with a lot of non keep alive connections, you
- might want to increase this value as well. Default value is
- <code>1</code>.</p>
- </attribute>
-
<attribute name="acceptorThreadPriority" required="false">
- <p>The priority of the acceptor threads. The threads used to accept
+ <p>The priority of the acceptor thread. The thread used to accept
new connections. The default value is <code>5</code> (the value of the
<code>java.lang.Thread.NORM_PRIORITY</code> constant). See the JavaDoc
for the <code>java.lang.Thread</code> class for more details on what
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org