2장 - 느려진 서비스, 어디부터 봐야 할까
TPS(초당 트랜잭션 수)로 처리량을 나타낼 수 있다.
TPS를 높여 응답 시간을 줄이려면 서버가 동시에 처리할 수 있는 요청 수를 늘려 대기 시간을 줄이는 방법과, 처리 시간 자체를 줄여 대기 시간 줄이는 방법이 있다.
현재 서버의 TPS와 응답 시간을 알아야 목표를 세우고 효과적인 성능 개선안을 도출해낼 수 있다.
만약 트래픽이 증가하면서 성능 문제가 발생하면, 먼저 그 문제가 발생하는 지점을 찾는다. 이를 빠르게 해결하는 방법은 수직 확장을 하는 것이다. 수직 확장은 CPU, 메모리, 디스크 등의 자원을 증가시키는 것을 말한다.
대신 수직 확장은 비용 문제가 크기 때문에, 수평 확장을 하는 방법도 고려해야한다. 수평 확장은 서버를 추가로 투입해 TPS를 높이는 방법이다.
로드 밸런서
- 서버가 두 대 이상이면 로드밸런서는 사용자 트래픽을 각 서버에 골고루 분배해서 한 서버에 사용자 트래픽이 몰리지 않도록 한다. 이를 통해 전체 서버 자원을 효율적으로 사용할 수 있다.
하지만 만약 DB에 성능 문제가 발생하고 있는데 서버를 추가로 투입하면 DB에 가해지는 부하가 더 커지고 성능 문제가 악화된다.
DB 커넥션 풀은 네트워크에서 DB를 연결하고 종료하는 시간을 줄이기 위해서 사용한다. DB에 연결된 커넥션을 미리 생성해서 보관하는 것이다.
커넥션 풀의 크기는 트래픽이 적은 시간대는 최소 크기로 유지, 높은 시간대에는 최대 크기로 확장해서 필요한 만큼 유지한다.
하지만 DB 서버의 CPU 사용률이 80%에 육박하는 상황같은 경우 커넥션 풀의 크기를 늘리면 DB에 가해지는 부하가 더 커지니 주의해야한다.
대부분의 커넥션 풀은 대기 시간을 설정할 수 있다. 대기 시간이란 풀에 사용할 수 있는 커넥션이 없을 때 커넥션을 얻기 위해 기다릴 수 있는 최대 시간을 의미한다. 응답 시간이 중요한 서비스는 커넥션 대기 시간을 0.5~3초 이내로 지정하는 것이 좋다.
그 이유는, 커넥션 풀이 모두 사용 중일 때 '일시적 오류' 같은 에러 응답을 사용자에게 보여줄 수 있다. 대기 시간 때문에 긴 시간 동안 무응답 상태로 유지되는 것보다는 빠르게 에러를 반환하는 것이 더 낫다. 대기 시간 도중 사용자가 재요청을 하게 된다면 서버 부하를 일으킬 수 있기 때문이다.
그런데 커넥션이 사용되지 않는 시간이 길어지면 연결이 끊길 수 있다. 따라서 최대 유휴 시간과 최대 유지 시간을 적절한 값으로 지정해야한다.
DB 서버를 확장하지 않고도 응답 시간과 처리량을 개선하고 싶다면 캐시 사용을 고려할 수 있다. 캐시는 일종의 키, 값 쌍을 저장하는 Map과 같은 형태의 데이터 저장소다. 캐시에 데이터를 저장해두면 동일한 데이터를 요청할 때 DB가 아닌 캐시에서 데이터를 읽어와 응답할 수 있다. DB뿐만이 아니라 복잡한 계산 결과나 외부 api 연동 결과도 캐시에 보관하여 응답 시간을 줄일 수 있다.
캐시가 얼마나 효율적으로 사용되는지는 적중률(캐시에 존재한 건수/캐시에서 조회를 시도한 건수)으로 알 수 있다.
캐시에 보관할 수 있는 데이터는 제한이 있으므로, 가장 오래된/가장 적게 사용된/먼저 추가된 데이터를 먼저 삭제하는 방식으로 관리한다.
서버가 사용하는 캐시에는 로컬 캐시와 리모트 캐시가 있다. 로컬 캐시는 서버 프로세스와 동일한 메모리를 캐시 저장소로 활용한다. 반면 리모트 캐시는 별도의 프로세스를 캐시 저장소로 활용한다.
리모트 캐시의 가장 큰 장점은 캐시 크기를 유연하게 확장할 수 있다는 것이다.
'독서' 카테고리의 다른 글
| 우아한 타입스크립트 with 리액트 (0) | 2025.03.22 |
|---|