V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ben548
V2EX  ›  Go 编程语言

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

  •  
  •   ben548 · 2023-06-05 18:18:53 +08:00 · 1860 次点击
    这是一个创建于 564 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在做开发的时候,一直在思考一个问题,就是 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 参数应该是越大越好,直到增加的量级达到临界值导致池中的连接存在浪费的情况,怎么找到这个合适的值呢?需要通过什么指标来观察和调整?
    3 条回复    2023-06-06 09:26:03 +08:00
    777777
        1
    777777  
       2023-06-05 19:00:20 +08:00
    压测调参
    FrankAdler
        2
    FrankAdler  
       2023-06-05 21:52:06 +08:00   ❤️ 2
    假定单机 1K 的 QPS ,50%的请求走 SQL 查询,每个 SQL 执行时间 10ms ,那么一个连接 1 秒钟能处理 100 个请求,
    500QPS 只需要 5 个连接就够了,考虑到可能部分查询波动,总计 10 个就足够了,那么设置最小 5 最大 10 就可以了,
    你可以适当的放大这个数字但是不要太多,为什么不多给点呢,因为如果你有 20 台机器就是 20*10=200 ,通常云服务器都是会限制这个总量的。
    连接存活时间精准评估起来会复杂点,懒得打字了,5 分钟问题也不大,保证因为流量波动建立的连接能释放掉就行了,快点慢点你根据自己情况看把。
    mengdodo
        3
    mengdodo  
       2023-06-06 09:26:03 +08:00
    SetMaxIdleConns 设置空闲连接池中连接的最大数量
    SetMaxOpenConns 设置打开数据库连接的最大数量
    SetConnMaxLifetime 设置了连接可复用的最大时间

    讲道理只能写接口压测,但是懒,所以 SetMaxIdleConns 给 10 ,SetMaxOpenConns 给 20 😄
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   999 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:44 · PVG 06:44 · LAX 14:44 · JFK 17:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.