aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2022-09-20 17:17:44 +0100
committerGitHub <noreply@github.com>2022-09-20 17:17:44 +0100
commitd8b19c857ffa3f8818ef7f16fa2cda6ba9324430 (patch)
treebd1930c223c91b28be9954b782d81bafee420a6d
parentbd39748b5c8b1890950db100382d3b128d333222 (diff)
HTTP connection keepalives (#2730)
Beforehand we disabled HTTP keepalives to prevent ambient system resources from being used by excess idle connections. Now that we've fixed some bugs in the federation API and device list updater, this situation is now much better and we don't open so many remote connections anyway. Keepalives allow us to not have to handshake TLS so often (which is quite expensive) and reusing an idle connection is much faster than having to open a new one. This can help with response times when talking to remote federated servers. This PR also adds a new option to disable keepalives if needed: ``` # Disable HTTP keepalives, which also prevents connection reuse. Dendrite will typically # keep HTTP connections open to remote hosts for 5 minutes as they can be reused much # more quickly than opening new connections each time. Disabling keepalives will close # HTTP connections immediately after a successful request but may result in more CPU and # memory being used on TLS handshakes for each new connection instead. disable_http_keepalives: false ```
-rw-r--r--dendrite-sample.monolith.yaml7
-rw-r--r--dendrite-sample.polylith.yaml7
-rw-r--r--setup/base/base.go1
-rw-r--r--setup/config/config_federationapi.go6
4 files changed, 21 insertions, 0 deletions
diff --git a/dendrite-sample.monolith.yaml b/dendrite-sample.monolith.yaml
index 195d1161..f1758f54 100644
--- a/dendrite-sample.monolith.yaml
+++ b/dendrite-sample.monolith.yaml
@@ -212,6 +212,13 @@ federation_api:
# enable this option in production as it presents a security risk!
disable_tls_validation: false
+ # Disable HTTP keepalives, which also prevents connection reuse. Dendrite will typically
+ # keep HTTP connections open to remote hosts for 5 minutes as they can be reused much
+ # more quickly than opening new connections each time. Disabling keepalives will close
+ # HTTP connections immediately after a successful request but may result in more CPU and
+ # memory being used on TLS handshakes for each new connection instead.
+ disable_http_keepalives: false
+
# Perspective keyservers to use as a backup when direct key fetches fail. This may
# be required to satisfy key requests for servers that are no longer online when
# joining some rooms.
diff --git a/dendrite-sample.polylith.yaml b/dendrite-sample.polylith.yaml
index 65d60e15..97d10825 100644
--- a/dendrite-sample.polylith.yaml
+++ b/dendrite-sample.polylith.yaml
@@ -219,6 +219,13 @@ federation_api:
# enable this option in production as it presents a security risk!
disable_tls_validation: false
+ # Disable HTTP keepalives, which also prevents connection reuse. Dendrite will typically
+ # keep HTTP connections open to remote hosts for 5 minutes as they can be reused much
+ # more quickly than opening new connections each time. Disabling keepalives will close
+ # HTTP connections immediately after a successful request but may result in more CPU and
+ # memory being used on TLS handshakes for each new connection instead.
+ disable_http_keepalives: false
+
# Perspective keyservers to use as a backup when direct key fetches fail. This may
# be required to satisfy key requests for servers that are no longer online when
# joining some rooms.
diff --git a/setup/base/base.go b/setup/base/base.go
index 0a34523e..0c7b222d 100644
--- a/setup/base/base.go
+++ b/setup/base/base.go
@@ -373,6 +373,7 @@ func (b *BaseDendrite) CreateFederationClient() *gomatrixserverlib.FederationCli
opts := []gomatrixserverlib.ClientOption{
gomatrixserverlib.WithTimeout(time.Minute * 5),
gomatrixserverlib.WithSkipVerify(b.Cfg.FederationAPI.DisableTLSValidation),
+ gomatrixserverlib.WithKeepAlives(!b.Cfg.FederationAPI.DisableHTTPKeepalives),
}
if b.Cfg.Global.DNSCache.Enabled {
opts = append(opts, gomatrixserverlib.WithDNSCache(b.DNSCache))
diff --git a/setup/config/config_federationapi.go b/setup/config/config_federationapi.go
index d3a4b2b6..0f853865 100644
--- a/setup/config/config_federationapi.go
+++ b/setup/config/config_federationapi.go
@@ -22,6 +22,11 @@ type FederationAPI struct {
// on remote federation endpoints. This is not recommended in production!
DisableTLSValidation bool `yaml:"disable_tls_validation"`
+ // DisableHTTPKeepalives prevents Dendrite from keeping HTTP connections
+ // open for reuse for future requests. Connections will be closed quicker
+ // but we may spend more time on TLS handshakes instead.
+ DisableHTTPKeepalives bool `yaml:"disable_http_keepalives"`
+
// Perspective keyservers, to use as a backup when direct key fetch
// requests don't succeed
KeyPerspectives KeyPerspectives `yaml:"key_perspectives"`
@@ -39,6 +44,7 @@ func (c *FederationAPI) Defaults(opts DefaultOpts) {
}
c.FederationMaxRetries = 16
c.DisableTLSValidation = false
+ c.DisableHTTPKeepalives = false
if opts.Generate {
c.KeyPerspectives = KeyPerspectives{
{