1. 작업 스레드 수 최적화
서버 CPU 코어 수에 맞게 작업 스레드 수를 조정하면 기본적인 성능 향상을 기대할 수 있습니다. 일반적으로 CPU 코어 수의 1~2배로 설정하는 것이 효과적입니다.
Server::workers() 메서드를 사용해 스레드 수를 설정함으로써 CPU 자원을 효율적으로 활용할 수 있습니다.
2. 연결 유지 시간 설정
TCP 연결의 생성 및 종료 비용을 줄이기 위해 적절한 Keep-Alive 시간을 설정해야 합니다.
ServiceConfig::keep_alive() 메서드를 통해 5~10초의 유지 시간을 지정하면 고부하 환경에서 성능 향상을 얻을 수 있습니다.
use actix_web::server::Server;
use actix_web::keep_alive::KeepAlive;
Server::new(|| App::new())
.keep_alive(KeepAlive::Timeout(5))
.bind("127.0.0.1:8080")?
.run();
3. 응답 압축 활성화
응답 데이터 크기를 줄여 네트워크 전송 효율을 높이려면 압축 기능을 활성화해야 합니다. gzip, brotli, zstd 등 여러 압축 알고리즘을 지원하며, brotli를 우선적으로 사용하는 것이 효과적입니다.
4. 부하 분산 설정 조정
client::ConnectorConfig를 통해 연결 풀 크기와 타임아웃 시간을 조정함으로써 부하 분산 설정을 최적화할 수 있습니다. 네트워크 환경에 따라 기본값(5초)을 조정해 안정성과 응답 속도를 균형 있게 관리해야 합니다.
5. 요청 처리 파라미터 최적화
요청 본문 크기와 버퍼 크기를 제한해 서버 자원 과부하를 방지할 수 있습니다.
App::data()에
PayloadConfig를 설정하면 전역적으로 적용할 수 있습니다.
6. HTTP/2 지원 활성화
HTTP/2를 사용하면 동시 연결 처리 능력과 데이터 전송 효율이 크게 향상됩니다. TLS 설정을 통해 HTTP/2를 활성화하면 다중 경로 전송(Multiplexing) 기능을 활용해 모바일 및 고지연 환경에서도 성능을 극대화할 수 있습니다.
7. 비동기 처리를 통한 처리량 증대
Actix Web은 비동기 I/O 모델 기반으로 설계되어 있어, 요청 처리 과정에서 블로킹 연산을 피하고 비동기 데이터베이스 드라이버 및 I/O를 사용하는 것이 중요합니다. 이는 이벤트 루프의 차단을 방지해 처리량을 극대화할 수 있습니다.
8. 정적 파일 서비스 최적화
정적 파일 전송 성능을 높이려면 버퍼 크기를 조정해야 합니다.
actix-files 라이브러리의
Files 서비스는 전송 파일 크기와 접근 패턴에 맞게 버퍼 크기를 설정할 수 있도록 지원합니다.
use actix_files::Files;
App::new()
.service(Files::new("/static", "static")
.buffer_size(1024 * 1024)) // 1MB 버퍼 크기
9. 타임아웃 설정 최적화
요청 처리 중 오랜 시간 소요되는 작업이 자원을 낭비하지 않도록 적절한 타임아웃을 설정해야 합니다.
ServiceConfig::client_timeout()을 통해 연결 및 요청 처리 타임아웃을 조정해 응답 속도와 자원 사용률을 균형 있게 관리해야 합니다.
10. 연결 풀 재사용 활성화
외부 서비스를 자주 호출하는 경우, 연결 풀 재사용을 통해 TCP 연결 생성 비용을 절감할 수 있습니다.
awc 클라이언트는 기본적으로 연결 풀을 지원하며, 풀 크기와 타임아웃을 조정해 성능을 최적화할 수 있습니다.