Golang Go语言中gorm的连接池参数如何配置比较好?
在做开发的时候,一直在思考一个问题,就是 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 参数应该是越大越好,直到增加的量级达到临界值导致池中的连接存在浪费的情况,怎么找到这个合适的值呢?需要通过什么指标来观察和调整?
Golang Go语言中gorm的连接池参数如何配置比较好?
更多关于Golang Go语言中gorm的连接池参数如何配置比较好?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
假定单机 1K 的 QPS ,50%的请求走 SQL 查询,每个 SQL 执行时间 10ms ,那么一个连接 1 秒钟能处理 100 个请求,
500QPS 只需要 5 个连接就够了,考虑到可能部分查询波动,总计 10 个就足够了,那么设置最小 5 最大 10 就可以了,
你可以适当的放大这个数字但是不要太多,为什么不多给点呢,因为如果你有 20 台机器就是 20*10=200 ,通常云服务器都是会限制这个总量的。
连接存活时间精准评估起来会复杂点,懒得打字了,5 分钟问题也不大,保证因为流量波动建立的连接能释放掉就行了,快点慢点你根据自己情况看把。
SetMaxIdleConns 设置空闲连接池中连接的最大数量
SetMaxOpenConns 设置打开数据库连接的最大数量
SetConnMaxLifetime 设置了连接可复用的最大时间
讲道理只能写接口压测,但是懒,所以 SetMaxIdleConns 给 10 ,SetMaxOpenConns 给 20 😄
在Golang中使用GORM进行数据库操作时,合理配置连接池参数对于提升性能和资源利用率至关重要。以下是一些关于如何配置GORM连接池参数的建议:
-
MaxOpenConns:设置数据库连接池中的最大打开连接数。这个值应该根据你的应用负载和数据库服务器的处理能力来设置。如果设置得太高,可能会耗尽数据库服务器的资源;如果设置得太低,则可能导致连接不足,影响性能。
-
MaxIdleConns:设置连接池中保持空闲状态的最大连接数。这个值通常可以设置为略小于MaxOpenConns,以确保在高峰时段有足够的可用连接,同时避免在空闲时段浪费资源。
-
ConnMaxLifetime:设置连接可复用的最大时间。超过这个时间的连接将被关闭并替换为新的连接。这有助于防止连接因长时间使用而变得不稳定。
-
MaxConnLifetime(在某些版本中可能不同名):与ConnMaxLifetime类似,用于控制连接的最大生命周期。
配置示例(以MySQL为例):
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
sqlDB, err := db.DB()
if err != nil {
panic("failed to get *sql.DB")
}
sqlDB.SetMaxOpenConns(100) // 设置最大打开连接数
sqlDB.SetMaxIdleConns(10) // 设置最大空闲连接数
sqlDB.SetConnMaxLifetime(time.Hour) // 设置连接最大生命周期
请根据你的具体需求和环境调整这些参数。