gorm 的连接池参数如何配置比较好?

2023-06-05 18:18:53 +08:00
 ben548
在做开发的时候,一直在思考一个问题,就是 gorm 的连接池配置,怎么配置比较好?

查阅了一些资料,
比如鸟窝的这篇: https://colobu.com/2020/05/18/configuring-sql-DB-for-better-performance-2020/
还有 go-zero 的这篇: https://juejin.cn/post/7111500846575124488
得到的一些信息是:
1 、根据经验,你应该显式的设置 MaxOpenConns 值。这个值应该远远低于数据库或者基础设施对连接数的任何硬限制。/2 、通常,更大的 MaxOpenConns 和 MaxIdleConns 可能会带来更好的性能。但是回报正在减少。你需要知道,一个大的连接池(一些连接根本就没有重用却被重新创建)可能会减少性能。
3 、为了降低第二点的风险,你可能需要设置一个相对短的 ConnMaxLifetime ,但是太对会导致连接被 kill 并被创建
4 、MaxIdleConns 应该小于等于 MaxOpenConns

结合这两篇文章,我设置的这几个参数的配置信息是:

max_idle_conns: 64
max_open_conns: 64
conn_max_lifetime: 5 (单位:分)

现在有点好奇,怎么判断这几个配置参数是否合适,我理解是
max_idle_conns 和 max_open_conns 参数应该是越大越好,直到增加的量级达到临界值导致池中的连接存在浪费的情况,怎么找到这个合适的值呢?需要通过什么指标来观察和调整?
1731 次点击
所在节点    Go 编程语言
3 条回复
777777
2023-06-05 19:00:20 +08:00
压测调参
FrankAdler
2023-06-05 21:52:06 +08:00
假定单机 1K 的 QPS ,50%的请求走 SQL 查询,每个 SQL 执行时间 10ms ,那么一个连接 1 秒钟能处理 100 个请求,
500QPS 只需要 5 个连接就够了,考虑到可能部分查询波动,总计 10 个就足够了,那么设置最小 5 最大 10 就可以了,
你可以适当的放大这个数字但是不要太多,为什么不多给点呢,因为如果你有 20 台机器就是 20*10=200 ,通常云服务器都是会限制这个总量的。
连接存活时间精准评估起来会复杂点,懒得打字了,5 分钟问题也不大,保证因为流量波动建立的连接能释放掉就行了,快点慢点你根据自己情况看把。
mengdodo
2023-06-06 09:26:03 +08:00
SetMaxIdleConns 设置空闲连接池中连接的最大数量
SetMaxOpenConns 设置打开数据库连接的最大数量
SetConnMaxLifetime 设置了连接可复用的最大时间

讲道理只能写接口压测,但是懒,所以 SetMaxIdleConns 给 10 ,SetMaxOpenConns 给 20 😄

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/946036

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX