[대규모 서비스를 지탱하는 기술] 8장. OS의 캐시 구조

June·2021년 12월 23일
0

디스크와 메모리의 속도차가 10^5~10^6배가 나는데, OS에는 디스크 내의 데이터에 빠르게 접근할 수 있는 구조가 갖춰져 있다. 그 원리가 바로 캐시다.

Linux의 경우에는 페이지 캐시(page cache)나 파일 캐시(file cache), 버퍼 캐시(buffer cache)라고 하는 캐시 구조를 갖추고 있다. 여기서는 '페이지 캐시'라고 하겠다.

OS는 가상 메모리 구조를 갖추고 있다. 가상 메모리 구조는 논리적인 선형 어드레스를 물리적인 어드레스로 변환하는 것이며, 이 기능을 위 그림이 나타낸다.

가상 메모리 구조

가상 메모리 구조가 존재하는 가장 큰 이유는 물리적인 하드웨어를 OS에서 추상화하기 위해서이다.

OS는 메모리를 직접 프로세스로 넘기는 것이 아니라 커널 내에서 메모리를 추상화하고 있다. 이것이 가상 메모리 구조다.

그림에서 보면 메모리를 4KB씩 블록으로 프로세스에 넘기고 있는데 이 블록을 '페이지'라고 한다.

VFS

디스크의 캐시는 페이지 캐시에 의해 제공되지만, 실제 이 디스크를 조작하는 디스크 드라이버와 OS 사이에는 파일시스템이 끼어있다.

Linux에는 ext3, ext2, ext4, xfs 등 몇몇 파일시스템이 있는데 그 하위에 디바이스 드라이버가 있으며, 이 디바이스 드라이버가 실제로 하드디스크 등을 조작한다. 파일 시스템 위에는 VFS(Virtual File System, 가상 파일시스템)이라는 추상화 레이어가 있다. 파일시스템은 다양한 함수를 갖고 있는데, 그 인터페이스를 통일하는 것이 VFS의 역할이다. 또한 VFS가 페이지 캐시의 구조를 지니고 있다. 어떤 파일시스템을 이용하더라도, 어떤 디스크를 읽더라 반드시 동일한 구조로 캐싱된다.

VFS의 역할은 파일시스템 구현의 추상화와 성능에 관련된 페이지 캐시 부분이다.

Linux는 페이지 단위로 디스크를 캐싱한다

페이지 = 가상 메모리의 최소단위

어떻게 캐싱될까?

Linux는 파일을 i노드 번호라고 하는 번호로 식별하며, 해당 파일의 i노드 번호와 해당 하일의 어느 위치부터 시작할지를 나타내는 오프셋, 이 두 가지 값을 키로 캐싱한다. 이 두 가지를 키로 하면 '어떤 파일의 어느 위치를'이라는 쌍으로 캐시의 키를 관리할 수 있으므로 결과적으로 파일 전체가 아닌 파일의 일부를 캐싱해갈 수 있다.

파일이 아무리 크더라도 이 키로부터 해당 페이지를 찾을 때의 데이터 구조는 최적화되어 있다. OS 내부에서 사용되고 있는 데이터 구조는 Ratix Tree라고 하며, 파일이 아무리 커지더라도 캐시 탐색속도가 떨어지지 않도록 개발된 데이터 구조다.

리눅스는 메모리에 여유 공간이 있으면 디스크 캐싱한다.

0개의 댓글