Amazon RDS PostgreSQL高并发请求超时问题排查求助
Amazon RDS PostgreSQL连接超时/拒绝问题排查求助
我开发的问卷类应用采用React+Go+PostgreSQL架构,预期支持250-300并发用户同时发起相同的API GET请求。用户流程为:从数据库获取单题作答,服务器保存答案后,用户点击下一题获取新问题。
用k6做性能测试时,设置500个虚拟用户持续2分钟调用API端点,当请求量达到6000左右时,数据库频繁返回dial: i/o timeout甚至连接拒绝,请求成功率仅约93%。
已尝试的优化措施
- 调整RDS实例的TCP keepalive参数(当前配置为
tcp_keepalives_count=30、tcp_keepalives_idle=1000、tcp_keepalives_interval=1000,也试过其他数值组合) - 将RDS存储从20GB扩容至100GB
- 升级实例规格,从db.t3.micro改为db.t3.medium
- 数据库表已建立对应索引,通过
explain语句验证过查询效率
这些操作都没能解决问题,无法达到100%的请求成功率。按道理常规的Go+PostgreSQL服务应该能处理这类请求,毕竟只是简单的select * from x where y查询。
代码示例
Go服务的DB仓库代码
我采用依赖注入模式,仅创建一个DB实例并传递给所有仓库及API包:
func NewRepository() (DBRepository, error) { dbname := getenv("POSTGRES_DATABASE", "") username := getenv("POSTGRES_ROOT_USERNAME", "") password := getenv("POSTGRES_ROOT_PASSWORD", "") host := getenv("POSTGRES_HOST", "") port := getenv("POSTGRES_PORT", "") dsn := fmt.Sprintf("host=%s user=%s password=%s"+ " dbname=%s port=%s sslmode=disable TimeZone=Europe/Bucharest", host, username, password, dbname, port) db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { return nil, err } db.AutoMigrate( // 迁移表定义在这里 ) return &dbRepository{ db: db, }, nil }
我使用GORM的.Find()语句执行查询,问题似乎出在首次数据库连接/查询阶段,测试的端点包含2个查询,卡在第一个查询上。
k6测试代码
import http from 'k6/http'; import { check } from 'k6'; import { sleep } from 'k6'; export const options = { insecureSkipTLSVerify: true, stages: [ { target: 225, duration: '2m' }, ], }; const access_tokens = [] let random_token = access_tokens[Math.floor(Math.random()*access_tokens.length)]; const params = { headers: {'Authorization': `Bearer ${random_token}`} }; export default function () { let res = http.get('endpoint here', params); check(res, {'Message': (r)=> r.status === 202}); sleep(1); }
恳请各位提供排查和解决的思路。
内容的提问来源于stack exchange,提问作者Albert Berty
相关产品推荐
相关产品推荐

