애플리케이션 서버 성능 늘리기

[#🐬Board] 보다 더 빠른 애플리케이션 서버를 만드는 방법

Board 프로젝트 개발의 핵심은 최대한 많은 클라이언트 요청을 서버가 빠르게 응답할 수 있도록 설계하는 것입니다. 따라서 Board 서버 부하 테스트 이후 어떤 지표들을 이용해야 서버의 성능을 평가할 수 있는지 알 필요가 있습니다.


💡서버 성능은 뭘 보고 알 수 있나?

서버의 성능을 나타내는 대표적인 기본 지표로 크게 다음 2가지를 꼽을 수 있습니다.

  • 응답 시간(Response Time): 클라이언트가 요청을 한 후 응답을 받을 때까지의 시간을 의미합니다. 응답 시간은 크게 2가지, 클라이언트와 서버 간 주고받는 대기 시간(Latency Time)과 실제로 서버에서 요청을 처리하는 시간을 뜻하는 처리 시간(Processing Time)으로 구성됩니다.

  • 처리량(Throughput): 서버가 단위 시간 당 처리할 수 있는 양을 뜻합니다. 흔히 TPS라는 수치로 표현합니다. 즉, TPS가 많을 수록 더 많은 요청을 처리할 수 있다는 뜻입니다.

Board 프로젝트 개발의 핵심은 최대한 많은 클라이언트 요청을 서버가 수용할 수 있도록 설계하는 것입니다. 따라서 부하 테스트를 통해 현재 서버가 어느정도의 볼륨까지 수용 가능한지 알아본 후 결과를 기록하며 개선하려 합니다.


💡TPS 늘리기

처리량, 즉 늘리는 가장 쉬운 방법은 단순히 스케일 아웃(Scale-out)으로 서버를 늘리는 것입니다. 서버가 1대가 10 TPS라면, 서버가 2대일 때 20 TPS가 되는 것이죠.

비슷한 방법으로 쓰레드 풀, DB 커넥션 풀을 늘리는 방법이 있습니다. 쓰레드 풀 5개에 처리 시간이 1초일 때 5 TPS라면, 쓰레드 풀이 10개에 처리 시간이 1초라면 10 TPS가 됩니다.

그런데 이렇게 서버를 늘리는만큼 TPS가 정비례하여 증가하지는 않습니다. 어느 시점이 되면, DB가 견딜 수 있는 임계치를 넘어가게 되고 먹통 증상이 발생합니다. 실제로 DB에 대한 부하가 증가하면 DB 쿼리 시간이 증가하게 되고, 처리 시간까지 길어지게 되고 오히려 TPS가 떨어지는 일이 발생하게 됩니다.


💡응답 시간(Response time) 줄이기

그래서 TPS를 줄이기 이전에 기본적으로 응답 시간 중 처리 시간 자체를 줄여야 합니다. 처리 시간에서 비중이 높은 대상을 찾아 줄여야 하는데, 보통의 웹 서비스에서는 DB 연동, API 호출, 데이터 집계/계산 쪽이 비중이 높습니다.

응답 시간을 구성하는 처리 시간(Processing Time)과 대기 시간(Latency Time)을 개선해봅시다.

🔧 DB에서 처리 시간(Processing Time) 줄이기

보통 다음 3가지 방법을 사용합니다.

  • 쿼리 튜닝: 가장 기본적이고 효율이 좋은 방법입니다.

  • 캐싱: 메모리에 데이터를 담아두고 DB 쿼리를 실행하지 않습니다. Board 서버에서는 Look-Aside를 이용한 Redis 캐싱을 지원하고 있습니다.

  • 장비 튜닝: Replication을 통한 읽기 전용 DB를 따로 두거나, DB 서버를 스케일 업을 하는 방법입니다. Board 서버에서는 MySQL 이중화를 이용해 쓰기 전용 Master DB와 읽기 전용 Slave DB를 나누었습니다.

🔧 API에서 처리 시간(Processing Time) 줄이기

흔히 다음 2가지 방법을 사용합니다.

  • 캐싱: 마찬가지로 캐싱을 이용하여 처리 시간을 줄일 수 있습니다.

  • 호출 제거: 데이터를 외부 시스템에 전달할 때, 직접 외부 시스템을 호출하여 데이터를 전달하기보다, 메시징 큐를 이용하여 비동기로 외부 시스템에 전달합니다.

🔧 데이터 집계/계산에서 처리 시간 줄이기

데이터 집계/계산 쪽에서는 통계류(좋아요 수 등) 계산을 미리 하여 캐시나 DB에 보관하면 처리 시간을 줄일 수 있습니다.

🔧 대기 시간(Latency Time) 줄이기

대기 시간을 줄이는 방법에는 여러가지가 있지만, 그 중에서도 크게 3가지 방법 정도가 있습니다.

  • 응답 크기 줄이기: 응답 크기 자체를 압축한 후 응답합니다.

  • 트래픽 분리하기: 이미지, 정적 파일을 CDN을 통해 응답을 제공합니다.

  • 대역폭 자체를 늘리기: 대역폭 자체를 늘릴 수 있는데, 비용적인 측면에서 CDN을 사용하는 편이 더 효율적입니다.


🎯정리

  • 서버의 성능을 나타내는 대표적인 기본 지표는 크게 응답 시간, 처리량입니다.

  • 처리량을 늘리려면 장비를 추가하여 스케일 아웃을 할 수 있지만, 처리 시간 자체를 줄이는 것이 핵심입니다.

  • 처리 시간을 줄이려면 스케일 아웃 or 스케일 업, 캐싱 등의 방법을 사용할 수 있습니다.

  • 대기 시간을 줄이려면 응답 크기를 압축하거나, CDN을 사용하는 방법이 있습니다.


🔖참고