You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2026/06/04 20:11:27 UTC
(couchdb) branch limit-couch-server-sharding created (now 87e535cbd)
This is an automated email from the ASF dual-hosted git repository.
nickva pushed a change to branch limit-couch-server-sharding
in repository https://gitbox.apache.org/repos/asf/couchdb.git
at 87e535cbd Limit couch_server sharding
This branch includes the following new commits:
new 87e535cbd Limit couch_server sharding
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(couchdb) 01/01: Limit couch_server sharding
Posted by va...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
nickva pushed a commit to branch limit-couch-server-sharding
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 87e535cbd0055e40b794e19d5420709f09729cf6
Author: Nick Vatamaniuc <va...@gmail.com>
AuthorDate: Thu Jun 4 15:50:59 2026 -0400
Limit couch_server sharding
With a default setting `max_dbs_open = 500` on servers with 128 CPU cores,
per-instance LRU cache limits would become tiny (500/128 = 4). In that case, if
just 4 db names on any gen_server randomly pick any the same server the cluster
will start emitting `all_dbs_active` errors, even though in aggregate across
all instances there will still be plenty of available LRU slots left.
As a simple solution, let's limit the sharding factor with a config setting.
Use the scheduler count on small instances and those will more schedulers are
limited by the limit.
---
rel/overlay/etc/default.ini | 7 +++++++
src/couch/src/couch_server.erl | 5 ++++-
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/rel/overlay/etc/default.ini b/rel/overlay/etc/default.ini
index ff148b271..508d98c4f 100644
--- a/rel/overlay/etc/default.ini
+++ b/rel/overlay/etc/default.ini
@@ -16,6 +16,13 @@ view_index_dir = {{view_index_dir}}
; among them.
;max_dbs_open = 500
+; Limit the maxumum number of couch_server shards. Normally couch_server
+; instances equal the number of Erlang schedulers, which by default equal the
+; number of CPUs available on a node. However, to avoid over-sharding and
+; getting too low of a per-couch-server max_dbs_open threshold it's beneficial
+; to limit the sharding factor.
+;max_couch_server_shards = 16
+
; Method used to compress everything that is appended to database and view index files, except
; for attachments (see the attachments section). Available methods are:
;
diff --git a/src/couch/src/couch_server.erl b/src/couch/src/couch_server.erl
index 9a4d8bffb..7dd4ad22b 100644
--- a/src/couch/src/couch_server.erl
+++ b/src/couch/src/couch_server.erl
@@ -40,6 +40,7 @@
-include("couch_server_int.hrl").
-define(MAX_DBS_OPEN, 500).
+-define(DEFAULT_SHARDS, 16).
-define(RELISTEN_DELAY, 5000).
-define(DEFAULT_ENGINE, "couch").
-define(AVAILABLE_JS_ENGINES, ["spidermonkey", "quickjs"]).
@@ -998,7 +999,9 @@ name(BaseName, N) when is_integer(N), N > 0 ->
list_to_atom(BaseName ++ "_" ++ integer_to_list(N)).
num_servers() ->
- erlang:system_info(schedulers).
+ Max = config:get_integer("couchdb", "max_couch_server_shards", ?DEFAULT_SHARDS),
+ Schedulers = erlang:system_info(schedulers),
+ max(1, min(Max, Schedulers)).
aggregate_queue_len() ->
N = num_servers(),