느려진 서비스 어디부터 봐야할까? (2)

2025. 5. 20. 20:03·CS

서버캐시

DB 서버를 확장하지 않고 응답 시간과 처리량을 개선하고 싶다면 캐시 사용을 고려해보자.

캐시에 데이터를 읽어오면 DB의 연동시간이 줄어 응답시간이 단축된다.

 

적중률 과 삭제 규칙

  • 캐시가 얼마나 효율적으로 사용되는지는 적중률도 판단할 수 있다. 100건의 요청중ㅇ 80건이 데이터가 캐시가 존재했다 그럼 이 적중률은 80퍼가 된다.

그럼 캐시에 모두 넣으면 적중률이 높아져서 빨라지겠네?

  • 하지만 캐시는 메모리 자원을 사용하여 사용할 수 있는 용량의 한계가 있다.

서버가 사용하는 캐시에는 크게 두가지가 있다

  1. 로컬 캐시
  2. 리모트 캐시 (우리가 주로 캐시할떄 사용하는 레디스 케시가 여기에 해당한다)

로컬 캐시의 경우 서버 프로세스와 캐시가 동일한 메모리 공간에 사용되기때문에 빠르게 접근할 수 있따.

하지만 서버와 같이 사용하기 때문에 사용할 수 있는 물리적 양에 한계가 있다. 또한 서버 재시작시 캐시가 모두 사라져 캐시 효율이 순간적으로 떨어진다는 단점이 있다.

 

리모트 캐시는 로컬 캐시와 정반대로 캐시 크기를 유연하게 확장할 수 있다. 다만 네트워크 통신을 해야서 로컬 캐시보다는 속도가 떨어진다.

 

 

가비지 컬렉터와 메모리 사용

  • 가비지 컬렉터를 사용하는 언어는 알아서 힙에서 메모리를 삭제해준다.
  • 가비지 컬렉터가 실행되는 동안 애플리케이션 실행은 일시 중단된다. 메모리가 크면 클수록 실행시간 증가한다.

 

한번에 대량으로 객체를 생성하는 것도 주의해야한다

ex) 한번에 10만개의 게시글을 반환하다고 하자. 게시글 하나가 0.5kb 총 50mb를 사용하게 된다. 100명의 사용자가 요청하게 되면 4.9kb의 메모리가 필요하다. 하지만 서버의 메모리는 4GB인데..? 

  • 메모리가 부족하 GC를 실행하지만 메모리는 여전히 부족한 상태다..ㅠㅠㅠ 

대량의 데이터를 한번에 올리면 서버가 중지될 수 있다.

jvm에 할당된 최대 메모리를 넘어갈 경우 gc가 실행되어도 메모리가 계속 포화상태로 메모리 부족 오류가 발생한다.

 

즉 우리는 응답데이터를 압축하거나 쪼개서 응답해야한다. 

 

 

정적자원과 캐시/CDN

  • 웹페이지 경우 image와 js가 80퍼 이상의 응답 데이터를 사용하고 있다.
  • 10번 방문했을때 동일한 이미지와 JS를 10번 다운 받는 면 그만큼 불필요한 트래픽이 발생하고 트래픽 비용도 증가할 수 밖에 없다.
    • 이를 해결하기 위해  클라이언트 캐시를 활용하는것이다.
    • http 프로토클에서 데이터를 응답할때 cache-controll이나 expires 헤더를 이용해 클라이언트가 응답 데이터를 일정 시간동안 저장할 수 있도록 설정할 수 있다.

but...  브라우저 캐시를 사용하면 네트워크 트래픽을 줄일 수 있지만 여전히 문제가 발생할 수 있다. 브러우저 캐시는 브러우저 단위르 동작하기 때문에 동시에 많은 사용자가 접속하면 순간적으로 많은 양의 js와 이미지를 전송하게된다. 이로 인해 빠르게 네트워크가 포화되어 응답시간이 급격히 느려진다.

 

이런 문제를 해결하는 방법은 CDN을 이용하는것이다.

CDN은 콘텐츠를 제공하지 위한 별도의 네트워크를 의미한다. 사용자는 CDN에 제공하는 URL을 통해 콘텐츠에 접근한다 CDN 서버에 요청한 콘테츠가 없느면 오리진 서버에서 읽어와 제공한다. 오리진 서버에서 읽어온 콘텐츠는 캐시에 보관한 데이터를 응답한다. 동일한 콘턴체는 여러번 요청해도 오리진 서버 한번만 처리하면 되는것이다. 나머지는 CDN이 받는다. 

'CS' 카테고리의 다른 글

비동기 연동 언제 어떻게 써야할까?  (2) 2025.06.10
외부 연동이 문제일 때 살펴봐야 할 것들  (4) 2025.06.05
성능을 좌우하는 DB 설계와 쿼리 최적화 (2)  (2) 2025.05.26
성능을 좌우하는 DB 설계와 쿼리 최적화 (1)  (1) 2025.05.25
느려진 서비스 어디부터 봐야할까?  (0) 2025.05.20
'CS' 카테고리의 다른 글
  • 외부 연동이 문제일 때 살펴봐야 할 것들
  • 성능을 좌우하는 DB 설계와 쿼리 최적화 (2)
  • 성능을 좌우하는 DB 설계와 쿼리 최적화 (1)
  • 느려진 서비스 어디부터 봐야할까?
슈가솔트
슈가솔트
  • 슈가솔트
    소금과 설탕
    슈가솔트
  • 전체
    오늘
    어제
    • 분류 전체보기 (31)
      • Database (10)
      • TDD (11)
      • Java (0)
      • 회고 (1)
      • 코테 (1)
      • CS (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    티스토리챌린지
    TDD
    DB
    순차i/o
    mocking
    sql 안티패턴
    랜덤i/o
    testcode
    아키텍처레이어
    Mockito
    asciidoc
    B+Tree
    반정규화
    컨트롤러테스트
    데이터베이스
    pagination
    단위테스트
    CQRS
    spring rest docs
    stubbing
    테스트작성
    db데드락
    릴레이션
    db회복
    오블완
    인덱스
    통합테스트
    백엔드
    db #datebase #dbms
    튜플
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
슈가솔트
느려진 서비스 어디부터 봐야할까? (2)
상단으로

티스토리툴바