高并发下MongoDB查询停滞,Rust服务无法恢复问题求助
压测登录接口后MongoDB查询停滞问题
我使用Gatling对登录接口进行压测,该接口需要顺序查询两个MongoDB集合以返回用户信息。当请求量提升至1500次/秒时,Gatling出现如下提前关闭警告:
17:18:39,281 [WARN] i.g.h.e.r.DefaultStatsProcessor - 'Auth Prod' request for user 12053 failed: j.i.IOException: premature close 17:18:39.281 [WARN] i.g.h.e.GatlingHttpListener - 'Auth Prod' request for user 12077 failed
更严重的是,停止压测后服务器无法再正常响应登录请求,查询陷入停滞,无错误返回,需等待很长时间才能恢复。压测报错后我用Postman请求该接口,耗时5分35秒才返回(正常仅需15ms),但Rust服务仍处于运行状态。
推测问题与连接池大小及最大连接数相关,但目前暂不想修改这些参数,仅希望解决查询停滞问题。
相关Rust代码
MongoDB客户端配置
let mut client_options = ClientOptions::parse_async(uri).await?; client_options.max_idle_time = Some(Duration::new(10, 0)); let client = Client::with_options(client_options)?;
获取集合的函数
pub fn get_service<T>(&self, service: Services) -> Collection<T> { let client = self.cliente.clone(); let database = client.database(&self.database); match service { Services::User => database.collection::<T>("users"), Services::GrupoEmp => database.collection::<T>("emps"), } }
查询代码
let find_options = FindOneOptions::builder().max_time(Duration::from_secs(5)).build(); let user: User = match user_service .find_one( doc! {"login": &user_name}, Some(find_options), ) .await // Dead
使用的技术栈
- Mongodb Rust Driver
- Axum
- Docker
补充信息:容器ulimit输出
Rust及MongoDB容器的ulimit -a输出如下:
# rust and mongodb container # ulimit -a time(seconds) unlimited file(blocks) unlimited data(kbytes) unlimited stack(kbytes) 8192 coredump(blocks) 0 memory(kbytes) unlimited locked memory(kbytes) 64 process unlimited nofiles 1024 vmemory(kbytes) unlimited locks unlimited rtprio 0
注:虽可通过负载均衡、副本集等优化服务并发能力,但当前核心问题是查询停滞。
内容的提问来源于stack exchange,提问作者rick
相关产品推荐
相关产品推荐

