You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

高并发下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:51:15