Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

allow configuring maximum idle connections per host #18908

Merged
merged 1 commit into from Jan 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions cmd/common-main.go
Expand Up @@ -397,6 +397,7 @@ func buildServerCtxt(ctx *cli.Context, ctxt *serverCtxt) (err error) {
ctxt.ShutdownTimeout = ctx.Duration("shutdown-timeout")
ctxt.IdleTimeout = ctx.Duration("idle-timeout")
ctxt.ReadHeaderTimeout = ctx.Duration("read-header-timeout")
ctxt.MaxIdleConnsPerHost = ctx.Int("max-idle-conns-per-host")

if conf := ctx.String("config"); len(conf) > 0 {
err = mergeServerCtxtFromConfigFile(conf, ctxt)
Expand Down
7 changes: 4 additions & 3 deletions cmd/globals.go
Expand Up @@ -157,9 +157,10 @@ type serverCtxt struct {
ConnReadDeadline time.Duration
ConnWriteDeadline time.Duration

ShutdownTimeout time.Duration
IdleTimeout time.Duration
ReadHeaderTimeout time.Duration
ShutdownTimeout time.Duration
IdleTimeout time.Duration
ReadHeaderTimeout time.Duration
MaxIdleConnsPerHost int

// The layout of disks as interpreted
Layout disksLayout
Expand Down
9 changes: 8 additions & 1 deletion cmd/server-main.go
Expand Up @@ -135,6 +135,13 @@ var ServerFlags = []cli.Flag{
Value: 10 * time.Minute,
EnvVar: "MINIO_DNS_CACHE_TTL",
},
cli.IntFlag{
Name: "max-idle-conns-per-host",
Usage: "set a custom max idle connections per host value",
Hidden: true,
Value: 2048,
EnvVar: "MINIO_MAX_IDLE_CONNS_PER_HOST",
harshavardhana marked this conversation as resolved.
Show resolved Hide resolved
},
cli.StringSliceFlag{
Name: "ftp",
Usage: "enable and configure an FTP(Secure) server",
Expand Down Expand Up @@ -330,7 +337,7 @@ func serverHandleCmdArgs(ctxt serverCtxt) {
// allow transport to be HTTP/1.1 for proxying.
globalProxyTransport = NewCustomHTTPProxyTransport()()
globalProxyEndpoints = GetProxyEndpoints(globalEndpoints)
globalInternodeTransport = NewInternodeHTTPTransport()()
globalInternodeTransport = NewInternodeHTTPTransport(ctxt.MaxIdleConnsPerHost)()
globalRemoteTargetTransport = NewRemoteTargetHTTPTransport(false)()

globalForwarder = handlers.NewForwarder(&handlers.Forwarder{
Expand Down
2 changes: 1 addition & 1 deletion cmd/test-utils_test.go
Expand Up @@ -111,7 +111,7 @@ func TestMain(m *testing.M) {
// Initialize globalConsoleSys system
globalConsoleSys = NewConsoleLogger(context.Background())

globalInternodeTransport = NewInternodeHTTPTransport()()
globalInternodeTransport = NewInternodeHTTPTransport(0)()

initHelp()

Expand Down
4 changes: 2 additions & 2 deletions cmd/utils.go
Expand Up @@ -587,7 +587,7 @@ func GetDefaultConnSettings() xhttp.ConnSettings {

// NewInternodeHTTPTransport returns a transport for internode MinIO
// connections.
func NewInternodeHTTPTransport() func() http.RoundTripper {
func NewInternodeHTTPTransport(maxIdleConnsPerHost int) func() http.RoundTripper {
lookupHost := globalDNSCache.LookupHost
if IsKubernetes() || IsDocker() {
lookupHost = nil
Expand All @@ -601,7 +601,7 @@ func NewInternodeHTTPTransport() func() http.RoundTripper {
CurvePreferences: fips.TLSCurveIDs(),
EnableHTTP2: false,
TCPOptions: globalTCPOptions,
}.NewInternodeHTTPTransport()
}.NewInternodeHTTPTransport(maxIdleConnsPerHost)
}

// NewCustomHTTPProxyTransport is used only for proxied requests, specifically
Expand Down
18 changes: 11 additions & 7 deletions internal/http/transports.go
Expand Up @@ -49,7 +49,11 @@ type ConnSettings struct {
TCPOptions TCPOptions
}

func (s ConnSettings) getDefaultTransport() *http.Transport {
func (s ConnSettings) getDefaultTransport(maxIdleConnsPerHost int) *http.Transport {
if maxIdleConnsPerHost <= 0 {
maxIdleConnsPerHost = 1024
}

dialContext := s.DialContext
if dialContext == nil {
dialContext = DialContextWithLookupHost(s.LookupHost, NewInternodeDialContext(s.DialTimeout, s.TCPOptions))
Expand All @@ -67,7 +71,7 @@ func (s ConnSettings) getDefaultTransport() *http.Transport {
tr := &http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: dialContext,
MaxIdleConnsPerHost: 1024,
MaxIdleConnsPerHost: maxIdleConnsPerHost,
WriteBufferSize: 32 << 10, // 32KiB moving up from 4KiB default
ReadBufferSize: 32 << 10, // 32KiB moving up from 4KiB default
IdleConnTimeout: 15 * time.Second,
Expand Down Expand Up @@ -106,8 +110,8 @@ func (s ConnSettings) getDefaultTransport() *http.Transport {
}

// NewInternodeHTTPTransport returns transport for internode MinIO connections.
func (s ConnSettings) NewInternodeHTTPTransport() func() http.RoundTripper {
tr := s.getDefaultTransport()
func (s ConnSettings) NewInternodeHTTPTransport(maxIdleConnsPerHost int) func() http.RoundTripper {
tr := s.getDefaultTransport(maxIdleConnsPerHost)

// Settings specific to internode requests.
tr.TLSHandshakeTimeout = 15 * time.Second
Expand All @@ -121,7 +125,7 @@ func (s ConnSettings) NewInternodeHTTPTransport() func() http.RoundTripper {
// only supports HTTP/1.1
func (s ConnSettings) NewCustomHTTPProxyTransport() func() *http.Transport {
s.EnableHTTP2 = false
tr := s.getDefaultTransport()
tr := s.getDefaultTransport(0)

// Settings specific to proxied requests.
tr.ResponseHeaderTimeout = 30 * time.Minute
Expand All @@ -133,7 +137,7 @@ func (s ConnSettings) NewCustomHTTPProxyTransport() func() *http.Transport {

// NewHTTPTransportWithTimeout allows setting a timeout for response headers
func (s ConnSettings) NewHTTPTransportWithTimeout(timeout time.Duration) *http.Transport {
tr := s.getDefaultTransport()
tr := s.getDefaultTransport(0)

// Settings specific to this transport.
tr.ResponseHeaderTimeout = timeout
Expand Down Expand Up @@ -161,7 +165,7 @@ func (s ConnSettings) NewHTTPTransportWithClientCerts(ctx context.Context, clien
// NewRemoteTargetHTTPTransport returns a new http configuration
// used while communicating with the remote replication targets.
func (s ConnSettings) NewRemoteTargetHTTPTransport(insecure bool) func() *http.Transport {
tr := s.getDefaultTransport()
tr := s.getDefaultTransport(0)

tr.TLSHandshakeTimeout = 10 * time.Second
tr.ResponseHeaderTimeout = 0
Expand Down