diff options
| author | Chris Lu <chris.lu@gmail.com> | 2025-12-01 09:52:18 -0800 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2025-12-01 09:52:18 -0800 |
| commit | 2f007425c0e27c4778cbebeeeee933961985ae3b (patch) | |
| tree | 7efdd2966d9263ccd0bc576381ef4793fc5d0e87 | |
| parent | 5461f85240c486a4f0e88ca016143e7392d2e552 (diff) | |
| download | seaweedfs-2f007425c0e27c4778cbebeeeee933961985ae3b.tar.xz seaweedfs-2f007425c0e27c4778cbebeeeee933961985ae3b.zip | |
http: disable HTTP/2 to enable parallel connections
This fixes the mount read throughput issue where HTTP GET requests to the
same volume server were being serialized even with high -concurrentReaders.
The issue was that:
1. HTTP/2 multiplexes all requests over a single TCP connection
2. Even with HTTP/1.1, ForceAttemptHTTP2 defaults to true in Go
Changes:
- Set ForceAttemptHTTP2: false on http.Transport to disable HTTP/2
- Set MaxConnsPerHost: 0 (unlimited) to allow parallel connections per host
- For HTTPS, set NextProtos to only 'http/1.1' to prevent HTTP/2 negotiation
This allows multiple goroutines to use separate TCP connections to the same
volume server, enabling true parallel chunk fetching and better network
bandwidth utilization.
Relates to: #7504
| -rw-r--r-- | weed/util/http/client/http_client.go | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/weed/util/http/client/http_client.go b/weed/util/http/client/http_client.go index d1d2f5c56..3e015ca2d 100644 --- a/weed/util/http/client/http_client.go +++ b/weed/util/http/client/http_client.go @@ -119,6 +119,7 @@ func NewHttpClient(clientName ClientName, opts ...HttpClientOpt) (*HTTPClient, e Certificates: []tls.Certificate{}, RootCAs: caCertPool, InsecureSkipVerify: false, + NextProtos: []string{"http/1.1"}, // Disable HTTP/2 for parallel connections } if clientCertPair != nil { @@ -130,6 +131,8 @@ func NewHttpClient(clientName ClientName, opts ...HttpClientOpt) (*HTTPClient, e httpClient.Transport = &http.Transport{ MaxIdleConns: 1024, MaxIdleConnsPerHost: 1024, + MaxConnsPerHost: 0, // 0 means no limit, allows parallel connections + ForceAttemptHTTP2: false, TLSClientConfig: tlsConfig, } httpClient.Client = &http.Client{ |
