From 86ac52b88c36219c60eced5631a35f192eda3990 Mon Sep 17 00:00:00 2001 From: Jian Wen Date: Wed, 23 Sep 2026 19:36:05 +0800 Subject: [PATCH 1/2] Increase the default backlog of listen() to net.core.somaxconn of Linux. Another approach to fix ZOOKEEPER-974. Our use case is to handle 100k clients. 50 is a very small value. Google has been using 1024 for at least 21 years, and they increased this to 4096 after TCP listener rework has been completed, more than 11 years ago. They got no complain of this change breaking any legacy application. See https://github.com/torvalds/linux/commit/19f92a030ca6d772ab44b22ee6a01378a8cb32d4 --- .../org/apache/zookeeper/server/NIOServerCnxnFactory.java | 2 +- .../administrators-guide/configuration-parameters.mdx | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/NIOServerCnxnFactory.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/NIOServerCnxnFactory.java index 800b76f2ac9..9a3ac573135 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/NIOServerCnxnFactory.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/NIOServerCnxnFactory.java @@ -659,7 +659,7 @@ public void configure(InetSocketAddress addr, int maxcc, int backlog, boolean se ss.socket().setReuseAddress(true); LOG.info("binding to port {}", addr); if (listenBacklog == -1) { - ss.socket().bind(addr); + ss.socket().bind(addr, Integer.MAX_VALUE); } else { ss.socket().bind(addr, listenBacklog); } diff --git a/zookeeper-website/app/pages/_docs/docs/_mdx/admin-ops/administrators-guide/configuration-parameters.mdx b/zookeeper-website/app/pages/_docs/docs/_mdx/admin-ops/administrators-guide/configuration-parameters.mdx index 7606196b361..8086c41035b 100644 --- a/zookeeper-website/app/pages/_docs/docs/_mdx/admin-ops/administrators-guide/configuration-parameters.mdx +++ b/zookeeper-website/app/pages/_docs/docs/_mdx/admin-ops/administrators-guide/configuration-parameters.mdx @@ -430,8 +430,9 @@ property, when available, is noted below. the number of requests that will be queued server-side to be processed by the ZooKeeper server. Connections that exceed this length will receive a network timeout (30s) which may cause ZooKeeper session expiry issues. - By default, this value is unset (`-1`) which, on Linux, uses a backlog of - `50`. This value must be a positive number. + By default, this value is unset (`-1`) which, on Linux, is + net.core.somaxconn that defaults to 4096 since Linux 5.4. This value + must be a positive number. - _serverCnxnFactory_ : (Java system property: **zookeeper.serverCnxnFactory**) From fb122ed492f8ab7bbe8923c4f1979b059cdc6989 Mon Sep 17 00:00:00 2001 From: Jian Wen Date: Wed, 14 Oct 2026 10:07:09 +0800 Subject: [PATCH 2/2] Increase the default backlog of listen of reconfigure() --- .../java/org/apache/zookeeper/server/NIOServerCnxnFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/NIOServerCnxnFactory.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/NIOServerCnxnFactory.java index 9a3ac573135..5bf5c5a257a 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/NIOServerCnxnFactory.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/NIOServerCnxnFactory.java @@ -695,7 +695,7 @@ public void reconfigure(InetSocketAddress addr) { this.ss = ServerSocketChannel.open(); ss.socket().setReuseAddress(true); LOG.info("binding to port {}", addr); - ss.socket().bind(addr); + ss.socket().bind(addr, listenBacklog == -1 ? Integer.MAX_VALUE : listenBacklog); ss.configureBlocking(false); acceptThread = new AcceptThread(ss, addr, selectorThreads); acceptThread.start();