1. Cache
캐시(cache)란 무엇일까?
Cache는 프랑스어로 '숨기다'라는 뜻을 가지는 단어인 'cacher'에서 파생된 단어로, '물건을 일시적으로 저장, 보관하기 위해 사용하는 곳'이라는 의미로 많이 사용된다..
컴퓨터에서는 기술적인 의미로 Cache를 많이 사용한다
'자주 필요한 데이터나 값의 복사본을 일시적으로 저장, 보관하기 위해 사용하는 곳'이라는 의미로 컴퓨터에서 cache를 사용하게 된다.
이를 사용하는 것을 캐싱(caching)이라고 한다.
아래의 그림은 컴퓨터의 간단한 동작 흐름이다.
RAM(메인 메모리)는 하드 디스크로 부터 필요한 데이터를 불러오고, CPU는 RAM에 저장되어 있는 데이터를 가져와서 연산 작업을 수행하는 구조이다.
위 그래프는 CPU와 RAM 간의 성능 차이 그래프이다.
CPU는 시대가 지날 수록 성능이 뛰어나다. 반면 RAM은 CPU의 성장 속도에 못미치는 결과를 볼 수 있는데, 그 이유는 RAM은 저장 용량에 중점을 두고 있기 때문이다.
결국은 CPU는 데이터를 처리하기 위해 메모리와 끊임없이 데이터를 주고 받는 구조인데, 메모리가 CPU의 데이터 처리 속도를 쫒아가지 못해 CPU가 메모리를 기다려야 하는 병목 현상이 발생되게 된다.
따라서, 이 병목 현상을 완화하기 위해 CPU와 메인 메모리 사이에서 크기는 작지만 속도가 빠른 캐시 메모리를 두고, 캐시 메모리에 향후 재사용할 가능성이 클 것으로 예상되는 데이터의 복사본을 저장해둔 후 CPU가 요청하는 데이터를 바로바로 전달할 수 있도록 해준다.
여기서 !! 그러면 캐시 메모리의 용량을 크게 쓰거나, 아예 메인 메모리로 사용하면 되지 않을까?
-> 캐시 메모리를 메인 메모리로 사용하면 장점이 늘어나긴 하지만, 가장 큰 문제점은 비용이다. 캐시 메모리는 너무너무 비싸다.. DRAM 메인 메모리보다 트랜지스터가 5개 더 많은 구조를 하고 있고, 복잡하기에 비쌀 수 밖에 없다.
(1). 메모리 계층 구조
- 데이터를 저장하는 공간의 속도와 용량은 반비례 관계이다.
- 속도가 빠른 메모리 일수록 용량이 작다.
- 용량이 큰 저장장치 일수록 속도가 느리다.
- 둘 다 잡기에는 비용이 너무 많이 든다.
- 비용이 많이 들기에 저장 공간은 속도와 용랴엥 따른 특성에 맞게 역할을 나누어서 사용한다.
(2). 파레토의 법칙
- 이탈리아 경제학자 빌프레도 파레토가 발견한 현상
- 원인 중 상위 20%가 전체 결과의 80%를 만든다는 법칙
- 2대 8법칙 이라고도 한다.
- 여러 곳에서 관찰할 수 있다.
- 인구의 20%가 전체 부의 80%를 가지고있다.
- 잘 팔리는 제품 20%가 매출의 80%를 차지한다.
- 많이 쓰이는 단어 20%가 언어 사용빈도의 80%를 차지한다.
2. 데이터 지역성의 원리
자주 쓰이는 데이터는 시간적 혹은 공간적으로 한 곳에 몰려 있을 가능성이 높다.
- 한 번 참조된 변수는 잠시 후에 또 참조될 가능성이 높다.
- 어떤 데이터에 접근할 때, 그 데이터 근처에 있는 다른 데이터도 참조될 가능성이 높다.
- ex. for, while문의 조건 변수 i
- 변수 i를 선언 후 재접근 : 시간 지역성
- data[0]에 접근 -> data[1]에 접근 -> data[2]에 접근 : 공간 지역성
3. 캐시의 작동 방식
- 원본 데이터(System-of-Record)와는 별개로 자주 쓰이는 데이터(Hot Data)들을 복사해둘 캐시 공간을 마련한다.
- 캐시 공간은 상수 시간등 낮은 시간 복잡도로 접근 가능한 곳을 주로 사용한다.(HashMap 같은)
- 데이터를 달라는 요청이 들어오면, 원본 데이터가 담긴 곳에 접근하기 전에 먼저 캐시 내부부터 찾는다.
- 캐시에 원하는 데이터가 없거나 너무 오래되어 최신성을 잃게 될 경우 그때 원본 데이터가 있는 곳에 접근하여 데이터를 요청해 가져온다. 이때 데이터를 가져오면서 캐시에도 해당 데이터를 복사하거나 갱신한다.
- 캐시에 원하는 데이터가 있으면 원본 데이터가 있는 공간에 접근하지 않고 캐시에서 바로 해당 데이터를 제공한다.(Cache hit)
- 캐시 공간은 작으므로, 공간이 모자라게 되면 안쓰는 데이터부터 삭제하여 공간을 확보한다.
4. 캐시가 쓰이는 사례
(1) CPU의 캐시메모리
- 현대의 CPU는 1초에 최고 수십억 번 작동 가능
- 아무리 빠른 주기억장치라도 CPU를 따라가기 어렵다.
- 그래서 SRAM이라는 특수한 메모리를 CPU에 넣어 캐시메모리로 사용
(2) 하드디스크, 데이터베이스
- 하드디스크나 ssd나 주기억 장치에 비하면 매우 느리다.
- 처리 효율을 올리려면 자주 쓰이는 데이터를 캐싱해두는 것이 좋다.
- 데이터베이스 또한 쿼리를 실행하여 하드디스크에서 데이터를 읽고 쓰는 것은 시간이 오래 걸리는 작업
- 대개 데이터베이스는 쓰기보다는 읽기가 많으므로, 자주 요청받는 쿼리의 결과를 캐싱해두면 효율이 오른다.
- 따라서 데이터베이스 자체에서 별도의 캐시를 운영한다.
(3) CDN(Content Delivery Network)
- 유튜브의 메인 서버는 미국에 있다.
- 한국과 미국을 잇는 국제 인터넷 회선은 비싸고 용량을 늘리기도 어렵다.
- 구글은 각 통신사마다 Google Global Cache를 두어 인기 있는 유튜브 동영상은 미국 서버까지 접속할 필요 없이 국내 서버에서 처리하도록 하였다.
- 비싼 국제 회선 비용이 절감되고, 버퍼링이 줄어 고화질 서비스의 이용 경험이 개선되었다.
- 이처럼 세계 각지에 캐시 서버를 두어 전송속도를 높이고 부하를 분산하는 시스템이 CDN이다.
(4) 웹 캐시
- 네트워크를 통해 데이터를 가져오는 것은 하드디스크보다도 느릴 때가 많다.
- 그래서 웹 브라우저는 웹 페이지에 접속할 때 HTML, CSS, 자바스크립트, 이미지 등을 하드디스크나 메모리에 캐싱해 뒀다가 다음 번에 다시 접속할 때 이를 재사용한다. (브라우저 캐시)
- 웹 서버 또한 상당수의 경우 동적 웹 페이지라 할지라도 매번 내용이 바뀌지 않는 경우가 더 많으므로, 서버에서 생성한 HTML을 캐싱해 뒀다가 다음 번 요청에 이를 재활용 한다. (응답 캐시)
- 이와 유사하게, 클라이언트에서 자주 요청받는 내용은 웹 서버로 전달하지 않고 웹 서버 앞단의 프록시 서버에서 캐싱해둔 데이터를 바로 제공하기도 한다. (프록시 캐시)
(5) 브라우저 캐시
- 엡 서버에서 클라이언트에 보내는 HTTP 헤더에 캐시 지시자를 삽입하면, 클라이언트 웹 브라우저에서는 해당 지시자에 명시된 캐시 정책에 따라 캐싱을 실시한다.
- 캐시의 유효 시간(max-age)이 지나도 캐시된 데이터가 바뀌지 않은 경우를 확인하기 위해 ETag라는 유효성 검사 토큰을 사용한다.
- 때로는 캐시 유효시간을 최대한 길게 잡으면서도 정적(static) 파일의 업데이트를 신속히 적용하기 위해 정적 파일의 이름 뒤에 별도의 토큰이나 버전 번호를 붙여야 하는 경우도 있다.
- 캐시 정책은 해당 웹페이지의 전반적인 상황에 따라 각 파일마다 다르게 적용되어야 한다. 적어도 정적 파일과 동적인 부분의 브라우저 캐싱 정책은 달라야한다. 비공개 정보가 담긴 페이지는 보안상 아예 캐싱을 막아야 할 수도 있다.
(6) Redis
- 메모리 기반 오픈소스 NoSQL DBMS일종으로 웹 서비스에서 캐싱을 위해 많이 쓴다.
- Redis라는 이름은 Remote Dictionary Server의 약자이다.
- 여기서 Dictionary는 Python의 <Key: Value>의 구조이다.
- 기본적으로 모든 데이터를 메모리에 저장하여 처리하므로 속도가 빠르다.
- 서버 재부팅 때 메모리의 데이터가 휘발되지 않게끔 데이터를 하드디스크에 기록할 수 있다.
- DBMS의 일종이므로, 명시적으로 삭제하지 않는 한 메모리에서 데이터를 삭제하지 않는다.
- 자체적으로 여러 가지 자료형을 지원한다.
[참고]
https://www.youtube.com/watch?v=c33ojJ7kE7M
'CS 백엔드 > 네트워크' 카테고리의 다른 글
[네트워크] 네트워크의 통신 방식 (0) | 2023.01.08 |
---|---|
[네트워크] 네트워크란 무엇인가? (0) | 2023.01.08 |
Forward Proxy, Reverse Proxy (0) | 2022.10.25 |
HTTP/0.9, 1.0, HTTP/1.1, HTTP/2, 그리고 QUIC (0) | 2022.10.24 |
HTTP (0) | 2022.10.23 |