OS 캐쉬 구조

메모리, 디스크, OS 캐쉬 구조

  • 메모리는 디스크보다 만배에서 십만배 이상빠르다
  • 메모리를 이용해서 디스크 엑세스를 줄이고자 함
    • OS 는 캐쉬 구조를 가지고 있다.

페이징 구조

  • 가상 메모리 구조의 기반
  • 논리적인 선형 어드레스(0xbffff444)를 물리적인 물리 어드레스(0x00002123)로 변환 

가상 메모리, 스왑

  • 가상 메모리
    • OS는 가상 메모리 구조를 가지고 있다.
    • 가상 메모리 구조는 논리적인 선형 어드레스를 물리적인 물리 어드레스로 변환하는 것
  • 스왑
    • 가상 메모리를 응용한 기능 중 하나. 물리 메모리가 부족할 때 2차 기억장치(디스크)를 메모리로 간주해서 외형상의 메모리 부족을 해소하는 원리

가상 메모리 구조

가상 메모리가 존재하는 이유?   

프로세스에서 메모리를 필요로 하게되면, 메모리의 어느 부분이 아니라 특정 번지를 가져온다.

이때, 물리적인 하드웨어를 OS 에서 추상화하기 위해 존재한다.

 

가상 메모리

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

이것이 가상메모리이다.

 

Linux 의 페이지 캐시 원리

커널이 한 번 할당한 메모리를 해제하지 않고 계속 남겨두는 것이 페이지 캐시의 기본

  • 페이지 캐시의 친숙한 효과  : 디스크에서 데이터를 읽으러 가면 꼭 한번은 메모리로 가서 데이터가 반드시 캐싱 → 두 번째 이후의 액세스가 빨라짐

< 과정 >

디스크의 내용을 일단 메모리에 읽어들인다.(페이지가 작성된다)

→ 작성된 페이지는 파디되지 않고 남는다.(페이지 캐시)

→ 예외의 경우를 제외하고 모든 I/O에 투과적으로 작용 (페이지 캐시의 친숙한 효과)

     - 디스크의 캐시를 담당하는 곳(VFS)

 

VFS( Virtual File System)

- 파일 시스템 위에 있는 추상화 레이어

- 페이지 캐시의 구조를 가짐 

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

*추상화 : 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다.

 

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

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

 

OS 는 디스크를 블록(페이지) 단위로 캐싱,

 파일 단위로 캐싱 하지 않는다.

    - 파일 단위로 캐싱한다고 하면 파일 1개 단위로 캐싱하고 있다는 이미지이기 때문

 

LRU (Least Recently Used)

가장 오래된 것을 파기하고 가장 새로운 것을 남겨놓은 형식

 

캐싱이 되는 방식

해당 파일의 i 노드 번호, 어느 위치 부터 시작 할지를 나타내는 오프셋두 가지 값을 키로 캐싱

 

메모리가 비어 있으면 캐싱

Linux 는 비어있는 메모리 공간에 계속해서 디스크 내용을 캐싱한다.

 

프로세스에서 메모리를 요청하면 -> 오래된 캐시를 버리고 프로세스에 메모리를 확보

 

즉, 캐시 이외의 메모리가 필요해지면 오래된 캐시가 파기가 된다.

 

메모리를 늘려서 I/O 부하 줄이기

메모리가 늘린다 ▶  캐시에 사용할 수 있는 용량이 증가    많은 데이터를 캐싱    디스크를 읽는 횟수가 줄어든다.

 

I/O 부하를 줄이는 방법

캐싱를 전제로 한 I/O 줄이는 방법

(데이터의 크기에 주목) 데이터 규모 < 물리 메모리 전부 캐싱 가능 

경제적 비용과 밸랜스 고려 → 물리 메모리를 증가시킬 것인지 소프트웨어로 메모리 사용을 줄인 것인지 결정 필요

복수서버로 확장 시키기  ( 캐시로 해결될 수 없는 규모일 경우)

  • CPU 부하분산에는 단순히 서버를 늘린다.
  • I/O 분산에는 국소성을 고려한다.

예를 들어 AP 서버를 늘리는 것과 DB 서버를 늘리는 것은 다르다.

  • AP 서버를 늘리는 이유 : CPU 부하를 낮추고 분산시키기 위함
  • DB 서버를 늘리는 이유
    • 반드시 부하 때문은아님  → 캐시 용량증가 혹은 효율을 높이고자 할 때 인 경우가 많다.

단순히 대수만 늘려서는 확장성을 확보할 수 없다.

캐시 용량을 늘려야하는데 대수를 늘리면

→ 부족한 부분까지 동일하게 늘어남

→ 캐싱할 수 없는 비율은 변함 없이 그대로 유지됨

→ 다시 병목이 된다.

 

해결방법

  • 메모리 증설 
    • I/O 바운드한 서버에서는 처리할 데이터 량에 비례해서 메모리를 증설하는 것이 I/O 부하를 경감시키는데 효과적
  • 메모리 증설을 할 수 없는 경우
    • 데이터를 분할해서 각각의 서버에 위치시키는 것을 검토 (서버 증설)
      • 대수를 늘린 만큼 I/O 횟수가 줄어듬
      • 캐시에 올릴 데이터의 비율이 늘어남 → 전송량 향상을 기대할 수 있음 

* I/O 바운드인 서버가 높은 I/O 부하로 인해 전송량이 제대로 나오지 않을 경우 → 페이지 캐시가 최적화되기 이전인지 이후인지 확인 필요

 

국소성을 살리는 분산

국소성(locality) 을 고려한 분산이란

데이터에 대한 액세스 패턴을 고려해서 분산시키는 것 = 국소성을 고려한 분산

( 데이터를 그대로 복제하는 것은 국소성을 고려한 분산이 아님)

위와 같이 분배하면 서버 1 이 데이터영역 2 를 캐싱해야 할 필요가 없다.

액세스 패턴 A 는 서버 1 의 데이터영역 1 에만 엑세스하면된다.

 

국소성을 고려한 분산의 결과

메모리에 올라간 데이터량 증가 -> 데이터 엑세스 속도 향상

파티셔닝

  • 테이블 단위 분할
    • 테이블 종류 : entry, bookmark, tag, keyword
      • entry, bookmark : 같이 액세스하는 경우가 많으므로 같은 서버에 위치
      • tag, keyword : 많은 데이터를 가지고 있는 테이블을 같은 서버에 위치
      • 테이블 요청에 맞게 서버에  보내면 된다.
  • 테이블 데이터 분할
    • 테이블 하나를 여러 개의 작은 테이블로 분할
      • (ex) id 의 첫문자 기준 파티셔닝 : (a~c) (d~f) ,...
    • 문제점 : 분할의 입도를 크거나 작게 조절할 때 데이터를 한 번 병합해야 한다

요청 패턴을 '섬(islands)'으로 분할

  • 용도 별로 시스템을 섬으로 나누는 방법
    • 캐시하기 쉬운 요청 :  국소성으로 인해 안정되고 높은 캐시 적중률
    • 캐시하기 어려운 요청 : 캐시하기 쉬운 요청의 캐시를 어지럽히므로 섬으로 나누는 경우에 비해 전체적으로 캐시 효울이 떨어짐

(예시) 일반적인 요청 , 봇/feed, 이미지 API 등

페이지 캐시를 고려한 운용의 기본 규칙

  • OS 기동 후에 서버를 곧바로 투입하지 않는다 
    • (이유) 아직 캐시가 쌓여 있지 않기 때문
  •  성능평가는 캐시가 최적화되었을 때 해야 한다.

요약

분석은 국소성을 고려해서 실시해야 한다.

데이터 규모에 맞게 탑재 메모리를 조정한다.

        메모리 증설로 대응할 수 없다면 분산을 고려한다.

부하분산 학습에 있어서 기초지식으로 OS 의 동작원리를 아는 것이 중요하다.

OS 동작원리

  • OS 캐시 
  • 멀티스레드 멀티 프로세스
  • 가상메모리 구조
  • 파일시스템

등을 통해서 알게되는 OS의 장단점을 고려하여 시스템 전체를 최적화 할 수 있다.

+ Recent posts