Запускают бенчмарк на 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.