MaxIdleConns
参数设置的是整个 http.Transport
可以保持的最大空闲连接数,而不仅仅是到一个特定主机的连接。这些连接是在所有主机之间共享的。
当 http.Transport
完成一个请求并关闭响应的 Body
后,该连接将被添加到空闲连接池中,直到达到 MaxIdleConns
设置的限制。如果空闲连接池已满,那么这个连接就会被关闭。
所以,设置 MaxIdleConns
为 1000 并不意味着 http.Transport
会一直保留 1000 个闲置连接。实际的空闲连接数可能会根据请求的负载和模式而变化。如果请求的负载较低,或者请求的模式使得连接不能被有效地复用,那么实际的空闲连接数可能会低于 MaxIdleConns
的设置。
另外,空闲连接不会无限期地保留。如果一个连接在 IdleConnTimeout
设置的时间内没有被复用,那么它将被关闭。
当一个HTTP请求完成并且响应的Body被关闭后,这个TCP连接有两种可能的处理方式:添加到空闲连接池中或者直接丢弃。
添加到空闲连接池:如果连接被添加到空闲连接池中,那么这个连接就可以被后续的HTTP请求复用。这样可以避免了TCP连接建立和关闭的开销,提高了性能。但是,如果空闲连接池已经满了(即空闲连接数达到了MaxIdleConns
的限制),或者这个连接在IdleConnTimeout
设置的时间内没有被复用,那么这个连接就会被关闭。
直接丢弃:如果连接被直接丢弃,那么这个连接就会被立即关闭,不能被后续的HTTP请求复用。这意味着每个HTTP请求都需要建立一个新的TCP连接,这会增加开销,降低性能。
在大多数情况下,复用TCP连接(即将连接添加到空闲连接池)比直接丢弃连接更优。这是因为TCP连接的建立和关闭都需要时间和资源,特别是在需要进行TLS握手的HTTPS连接中,这个开销更大。因此,复用TCP连接可以显著提高HTTP请求的性能。