Skip to content

perf(net/gclient): optimize default http.Transport connection pool configuration#4390

Merged
hailaz merged 2 commits into
gogf:masterfrom
lxzan:master
Aug 28, 2025
Merged

perf(net/gclient): optimize default http.Transport connection pool configuration#4390
hailaz merged 2 commits into
gogf:masterfrom
lxzan:master

Conversation

@lxzan
Copy link
Copy Markdown
Contributor

@lxzan lxzan commented Aug 28, 2025

Please ensure you adhere to every item in this list.

  • The PR title is formatted as follows: <type>[optional scope]: <description> For example, fix(os/gtime): fix time zone issue
    • <type> is mandatory and can be one of fix, feat, build, ci, docs, style, refactor, perf, test, chore
      • fix: Used when a bug has been fixed.
      • feat: Used when a new feature has been added.
      • build: Used for modifications to the project build system, such as changes to dependencies, external interfaces, or upgrading Node version.
      • ci: Used for modifications to continuous integration processes, such as changes to Travis, Jenkins workflow configurations.
      • docs: Used for modifications to documentation, such as changes to README files, API documentation, etc.
      • style: Used for changes to code style, such as adjustments to indentation, spaces, blank lines, etc.
      • refactor: Used for code refactoring, such as changes to code structure, variable names, function names, without altering functionality.
      • perf: Used for performance optimization, such as improving code performance, reducing memory usage, etc.
      • test: Used for modifications to test cases, such as adding, deleting, or modifying test cases for code.
      • chore: Used for modifications to non-business-related code, such as changes to build processes or tool configurations.
    • After <type>, specify the affected package name or scope in parentheses, for example, (os/gtime).
    • The part after the colon uses the verb tense + phrase that completes the blank in
    • Lowercase verb after the colon
    • No trailing period
    • Keep the title as short as possible. ideally under 76 characters or shorter
    • Reference Documentation
  • If there is a corresponding issue, add either Fixes #1234 or Updates #1234
    (the latter if this is not a complete fix) to this comment
  • Delete these instructions once you have read and applied them

提交前请遵守每个事项,感谢!

  • PR 标题格式如下:<类型>[可选 范围]: <描述> 例如 fix(os/gtime): fix time zone issue
    • <类型>是必须的,可以是 fixfeatbuildcidocsstylerefactorperftestchore 中的一个
      • fix: 用于修复了一个 bug
      • feat: 用于新增了一个功能
      • build: 用于修改项目构建系统,例如修改依赖库、外部接口或者升级 Node 版本等
      • ci: 用于修改持续集成流程,例如修改 Travis、Jenkins 等工作流配置
      • docs: 用于修改文档,例如修改 README 文件、API 文档等
      • style: 用于修改代码的样式,例如调整缩进、空格、空行等
      • refactor: 用于重构代码,例如修改代码结构、变量名、函数名等但不修改功能逻辑
      • perf: 用于优化性能,例如提升代码的性能、减少内存占用等
      • test: 用于修改测试用例,例如添加、删除、修改代码的测试用例等
      • chore: 用于对非业务性代码进行修改,例如修改构建流程或者工具配置等
    • <类型>后在括号中填写受影响的包名或范围,例如 (os/gtime)
    • 冒号后使用动词时态 + 短语
    • 冒号后的动词小写
    • 不要有结尾句号
    • 标题尽量保持简短,最好在 76 个字符或更短
    • 参考文档
  • 如果有对应的 issue,请在此评论中添加 Fixes #1234,如果不是完全修复则添加 Updates #1234
  • 应用这些规则后删除所有的说明

@lxzan lxzan changed the title perf: optimize default http.Transport connection pool configuration perf(net/gclient): optimize default http.Transport connection pool configuration Aug 28, 2025
@houseme houseme requested review from gqcn and hailaz August 28, 2025 04:04
@lxzan
Copy link
Copy Markdown
Contributor Author

lxzan commented Aug 28, 2025

DeepSeek推荐的默认配置参数

image

@lxzan
Copy link
Copy Markdown
Contributor Author

lxzan commented Aug 28, 2025

// http.Transport 的默认连接池参数
transport := &http.Transport{
    MaxIdleConns:          100,           // 最大空闲连接数
    MaxIdleConnsPerHost:   2,             // 每个host的最大空闲连接数(问题关键!)
    MaxConnsPerHost:       0,             // 每个host的最大连接数(0表示无限制)
    IdleConnTimeout:       90 * time.Second, // 空闲连接超时时间
    ResponseHeaderTimeout: 0,             // 响应头超时
    ExpectContinueTimeout: 1 * time.Second,
}

问题一:MaxIdleConnsPerHost: 2 限制过严

这是最严重的问题:

// 默认每个host只能保持2个空闲连接
// 对于高并发场景,这会导致大量的连接重建开销

影响:

  • 频繁的TCP三次握手和TLS握手

  • 增加延迟和CPU开销

  • 对于HTTPS连接,TLS握手成本尤其高

问题二:MaxConnsPerHost: 0 无限制

// 没有限制每个host的最大连接数
// 可能导致连接数爆炸,耗尽文件描述符

风险:

  • 潜在的内存泄漏

  • 文件描述符耗尽

  • 服务端过载

问题三:超时设置不合理

// 缺少必要的超时控制
ResponseHeaderTimeout: 0,  // 无响应头超时
TLSHandshakeTimeout:   0,  // 无TLS握手超时

@hailaz hailaz merged commit 26f2078 into gogf:master Aug 28, 2025
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants