Actix-web почему перформанс деградирует при 1000 соединений?

Запускают бенчмарк на 100 соединений
ab -c 100 -n 1000000000 -t 60 localhost:8080/
получаю результаты 9500 RPS

и на 1000 соединений
ab -c 1000 -n 1000000000 -t 60 localhost:8080/
получаю результаты 1900 RPS

На golang например разницы в 100 и 1000 соединений нет.

Почему перформанс Actix-web деградирует? Можно ли это как-то пофиксить? Если нет то какой фреймворк не имеет такой проблемы?

use std::str::FromStr;

use actix_web::{get, web, App, HttpResponse, HttpServer, Responder};
use serde::Serialize;
use deadpool_postgres::{ManagerConfig, Manager, Pool, RecyclingMethod};
use tokio_postgres::{NoTls, Config};


#[derive(Debug, Serialize)]
pub struct Word {
    pub id: i32,
    pub title: String,
    pub content: String,
}

#[get("/")]
async fn index(pool: web::Data<Pool>) -> impl Responder {
    let client = pool.get().await.unwrap();

    let rows = client.query(
        "SELECT id, title, content FROM words LIMIT 100", &[]
    ).await.unwrap();

    let words: Vec<Word> = rows
        .iter()
        .map(
            |row|
            Word{
                id:row.get(0),
                title:row.get(1),
                content:row.get(2),
            }
        )
        .collect();

    HttpResponse::Ok().json(words)
}

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    dotenv::dotenv().expect(".env not found");
    let database_url = std::env::var("DATABASE_URL")
        .expect("DATABASE_URL must be set");

    let pg_config = Config::from_str(&database_url).unwrap();

    let mgr_config = ManagerConfig {
        recycling_method: RecyclingMethod::Fast
    };
    let mgr = Manager::from_config(pg_config, NoTls, mgr_config);
    let pool = Pool::builder(mgr).max_size(10).build().unwrap();

    println!("Starting server at 8080");

    HttpServer::new(move || {
        App::new()
            .app_data(web::Data::new(pool.clone()))
            .service(index)
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}


UPDATE:
Проблема была в этом:
Error accepting connection: Too many open files (os error 24)

Решилось через ulimit.
  • Вопрос задан
  • 236 просмотров
Решения вопроса 1
un1t
@un1t Автор вопроса
Добавил логирование, по советам из комментариев.
Обнаружилась такая ошибка

Error accepting connection: Too many open files (os error 24)


Решил проблему через
ulimit -n 2000
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы