Router Backend Keepalive Connections

Page last updated:

This topic describes how to enable support in the Gorouter for keepalive connections with backends, and considerations for configuration.

Support for keepalive connections is described in Idle Keepalive Connections.

Enable Keepalive Connections from Gorouter to Backends

By default, support for keepalive connections with backends is disabled. An operator can enable the feature by entering a non-zero value for the Router Max Idle Keepalive Connections field in the Networking Pane of the Elastic Runtime tile.

Considerations for Configuring Max Idle Keepalive Connections

Each router process is limited to 100,000 file descriptors. Each inbound request consumes at most two file descriptors; one for the connection from the client and one from the Gorouter to the backend. For this reason we recommend that Max Idle Connections is never set higher than 50,000. As a few other file descriptors are consumed by the process under normal operation, this limit is more like 49,900.

In order to determine how many idle connections are needed, consider that the peak connections could be calculated by multiplying throughput by response time. Example: if a single router receives 1000 requests per second, and response time is 1 second, at any given time there are likely to be 1000 connections open to backends. Accommodating for growth of 2x, an operator might configure a maximum of 2000 idle connections per router.

Gorouter has been hard coded with a limit of 100 idle connections per backend. The configurable property max_idle_connections governs idle connections across all backends.

Gorouter Retry Behavior

When you deploy an app that requires Diego cells to restart or recreate, the app may not respond to a Gorouter request before the keepalive connection breaks. The following table describes how Gorouter behaves if it cannot establish a TCP connection to an app:

If Gorouter … then Gorouter …
cannot establish a TCP connection to the routing backend for the app waits 15 minutes for a response.
establishes a TCP connection to the routing backend, but the app does not respond retries the request three times.

In both cases, if the app still does not respond to the request, Gorouter returns a 502.

Create a pull request or raise an issue on the source for this page in GitHub