Skip to content

Latest commit

 

History

History
117 lines (87 loc) · 6.99 KB

2. 캐시의 동작 원리.md

File metadata and controls

117 lines (87 loc) · 6.99 KB

캐시의 동작 원리

이 문서는 2022년 11월 22일에 @sumin-dev에 의해서 작성되었습니다.

1. 캐시의 동작 원리
    1.1. 캐시의 종류
    1.2. 캐시 히트와 캐시 미스
    1.3. 캐시의 동작 방식
2. 캐싱 전략(Caching Strategies)
    2.1. Look-Aside (Lazy Loading)
    2.2. Read Through
    2.3. Write Through
    2.4. Write Back (Write Behind)
    2.5. Write Around

1. 캐시의 동작 원리

1.1. 캐시의 종류

image

  • 시스템에 장착된 캐시의 용량과 성능이 점점 증가하면서 캐시의 캐시로 사용되는 메모리가 추가됨

  • ▶ 이것을 적용된 순서대로 L(Level) 1, L2, L3 (1차 캐시, 2차 캐시, 3차 캐시 메모리)

    • L1캐시는 CPU와 가장 가까운 캐시. 가장 고성능이자 고가인 작은 용량의 집적회로가 사용
    • L1 캐시 메모리에는 속도를 위해 명령어 캐시와 데이터 캐시가 따로 존재
      • IC(Instruction Cache) : 메모리에서 text 영역의 데이터를 다루는 캐시
      • DC(Data Cache) : 메모리에서 text 영역을 제외한 데이터를 다루는 캐시
      • 명령어는 보통 공간 지역성이 높고, 데이터는 시간 지역성이 높아 둘을 나누어 서로 다른 지역성을 이용
    • L2는 L1 캐시에서 데이터를 퍼가기 위한 캐시로 사용하기 위해 그보다는 용량이 크지만 약간 더 느린 저장공간
      • 명령어 캐시와 데이터 캐시의 구분 없이 하나의 캐시 메모리로 구성
  • 예시1) ARM Cortext -A72 CPU : 프로세서가 단독으로 사용하는 L1 캐시, 모든 프로세서가 공유하는 L2 캐시 image

  • 예시2) Intel Core i7 3770K CPU : L1, L2, L3 캐시로 구성 image

1.2. 캐시 히트와 캐시 미스

  • CPU가 데이터를 요청하여 캐시 메모리에 접근했을 때, 캐시 메모리가 해당 데이터를 가지고 있다면 캐시 적중(cache hit), 해당 데이터가 없어서 메인 메모리에서 가져와야 한다면 캐시 부적중(cache miss)
    • 캐시 미스의 종류
      • cold miss : 해당 메모리 주소를 처음 불렀기 때문에 나는 미스
      • conflict miss : A 데이터와 B 데이터가 캐시 메모리에서 같은 주소에 할당되어 나는 미스
      • capacity miss : 캐시 메모리에 공간이 부족해서 나는 미스
  • 캐시 히트의 정도를 나타내는 지표인 캐시 적중률(cache hit ratio) 에 의해 캐시 메모리의 성능 결정

image image

1.3. 캐시의 동작 방식

  1. 원본 데이터와는 별개로 자주 쓰이는 데이터(Hot Data)들을 복사해둘 캐시 공간 마련
  2. 데이터 요청이 들어오면 원본 데이터가 담긴 곳에 접근하기 전 먼저 캐시 내부부터 탐색
  3. 캐시에 원하는 데이터가 없거나(cache miss), 너무 오래되어 최신성을 잃었을 때(expiration)
    • 원본 데이터가 있는 곳에 접근해 데이터를 가져옴
    • 이 때 데이터를 가져오며 캐시에도 해당 데이터를 복사하거나 갱신
  4. 캐시에 원하는 데이터가 있을 때(cache hit)
    • 원본 데이터가 있는 공간에 접근하지 않고 바로 해당 데이터 제공
  5. 캐시 공간은 작기 때문에 공간이 모자라면 안쓰는 데이터부터 삭제하여 공간 확보(Eviction)

2. 캐싱 전략(Caching Strategies)

캐시는 운영체제 뿐만 아니라 웹 애플리케이션 및 데이터베이스를 비롯한 다양한 기술 계층에 걸쳐 활용
캐싱을 통해 이루고자 하는 목적과 기본적인 원리는 차이가 없습니다~!
그래서 Redis cache를 이용한 캐싱 전략이 잘 소개되어 있어 가져왔습니다!
Application을 CPU, Database를 메인메모리, Redis를 캐시메모리로 이해해주시면 감사👍

2.1. Look-Aside (Lazy Loading)

  • 데이터를 찾을 때 우선 캐시에서 데이터를 찾고 데이터가 있다면 캐시에서 데이터를 가지고 오는 전략
  • 만약 캐시에 데이터가 없어 cache miss가 발생하면 앱은 DB에서 데이터를 가져온 뒤 캐시에 넣어주는 작업
    • DB에 직접 조회해서 입력되기 때문에 Lazy Loading
  • 장점) 캐시가 다운되더라도 DB에서 데이터를 가지고 올 수 있음
  • 단점) cache miss로 인해 많은 프로세스가 DB에 접근하기 때문에 DB 부하 발생

image

2.2. Read Through

  • 캐시에서만 데이터를 읽어오는 전략
  • cache miss가 발생하면 캐시는 DB에서 데이터를 검색하고 캐시에 자체 업데이트한 뒤 앱에 데이터를 보냄

image

2.3. Write Through

  • 데이터를 저장할 때 먼저 캐시에 저장한 다음 DB에 저장하는 방식
  • 장점) 캐시는 항상 최신 정보를 가지고 있음
  • 단점1) 저장할 때마다 두 단계를 거쳐야하므로 상대적으로 느림
  • 단점2) 저장하는 데이터가 재사용되지 않을 수도 있는데 무조건 캐시에 넣기 때문에 리소스 낭비 발생
    • 이를 방지하기 위해 캐시에 Expire time 설정

image

2.4. Write Back (Write Behind)

  • 먼저 캐시에 데이터를 저장했다가 특정 시점마다 DB에 저장하는 방식
  • 장점) 캐시에 데이터를 모았다가 한 번에 DB에 저장하므로 쓰기 비용을 절약
  • 단점) 데이터를 옮기기 전에 캐시 장애가 발생하면 데이터 유실이 발생

image

2.5. Write Around

  • 모든 데이터는 DB에 저장되고 읽은 데이터만 캐시에 저장되는 방식
  • cache miss가 발생하는 경우에만 캐시에 데이터를 저장하기 때문에 캐시와 DB 내의 데이터가 다를 수 있음
  • 주로 Look aside, Read through와 결합해서 사용

image

Reference