개발관련 도서/대규모 서비스를 지탱하는 기술

3-1. OS 캐시

prden 2021. 5. 3. 09:16

1. OS 캐시의 구조 

메모리를 이용해서 디스크 액세스를 최대한 줄여야 한다. 이를 위해 OS 캐시를 이용.

예를 들어 리눅스 페이지 캐시를 살펴보자

'프로세스 1'은 데이터를 읽어오기 위해 직접 디스크에 액세스 할 수 없고 가상 메모리에 접근해서 데이터를 읽어와야 한다. OS가 읽어온 블록을 메모리에 쓰고 OS는 그 메모리 주소를 프로세스 1에게 전달한다. 그러면 '프로세스 1'이 그 데이터에 접근할 수 있는 것이다. 

반면, '프로세스 2'가 동일한 데이터에 접근하기 위해서 위와 같은 작업을 반복하는 것이 아니라 커널은 한 번 할당한 메모리를 해제하지 않고 남겨두기 때문에 '프로세스 1'이 데이터를 읽어올 때 남겨둔 페이지를 사용하면 된다. 이 개념이 페이지 캐시인 것이다. (파일 캐시가 아니고 페이지 캐시이다. )

 페이지 = 가상 메모리의 최소 단위(OS가 물리 메모리를 확보/관리하는 단위) OS는 블록 단위로 메모리에 캐싱을 한다. 캐싱을 할 때는 파일의 i노드 번호와 해당 파일의 어느 위치부터 시작할지를 나타내는 오프셋 이 두 가지 값을 키로 캐싱한다. 즉, 파일 전체가 아닌 파일 일부를 캐싱해 가는 것이다. 리눅스는 메모리가 비어있으면 전부 캐싱을 하고, 메모리를 늘리면 캐싱할 수 있는 범위가 늘어나 I/O 부하를 줄일 수 있게 된다.  

 그러나 캐시로 해결할 수 없을 정도의 큰 규모의 데이터가 있을 경우 복수 서버로 확장시켜야 한다. 여기서 AP서버를 확장시키는 것과 DB서버를 확장시키는 것에는 차이가 있다. I/O 부하를 줄이기 위해서 DB서버를 확장시켜야 한다. 하지만 단순히 대수만 늘려서 확장성을 확보할 수 없다. 여서 국소성을 살리는 분산이라는 개념이 등장한다. 국소성을 살리는 분산이란 쉽게 말해 액세스 패턴을 고려해 디비 서버에 분산시켜준다는 의미이다. 이를 통해 메모리에 올라갈 수 있는 데이터 량이 늘어난다. 

 구체적으로 국소성을 고려한 분산에는 파티셔닝이 있다. 이는 한 대였던 DB서버를 여러 대의 서버로 분할하는 방법을 말한다. 

ex)

 1. 파티셔닝

 1) 테이블 단위 파티셔닝 : 1,2,3,4의 테이블이 있다고 가정할 경우 1,2 테이블에 같이 액세스 하는 경우가 많으면 1,2 테이블을 같은 서버에 위치시키고 3,4 테이블에 같이 액세스 하는 경우가 많으면 3,4 테이블을 같은 서버에 위치시킨다. 그 후 애플리케이션을 변경해 그쪽으로 로직을 이어준다. 

 2) 테이블 데이터 분할 : 하나의 테이블을 여러 작은 테이블로 분할하는 방법을 의미한다. 예를 들어 id가 들어있는 테이블이 있을 경우 a~c로 시작하는 id는 서버 1에 할당하고 d~f로 시작하는 id는 서버 2에 할당하고 n~p로 시작하는 id는 서버 3에 할당하는 등의 방식

 

2. 요청 패턴을 '섬'으로 분할 : Http 요청의 User-Agent나 URL을 보고 통상의 사용자면 섬1로 일부 api요청이면 섬 3으로 google bot같이 로봇이면 섬 2로 분할하는 방식 이렇게 캐싱하기 쉬운 요청과 캐싱하기 어려운 요청을 처리하는 섬을 나누면 국소성으로 안정되고 높은 캐시 적중률을 낼 수 있다. 

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

1. OS 기동직후 서버를 투입하지 않아야 한다.

캐시가 없이 갑자기 배치할 경우 오직 디스트 액세스만 발생하여 시스템이 다운될 수도 있다. 방법: OS를 시작한 후 기동 하면 자주 사용하는 DB파일을 한 번 cat 해준다. 그러면 전부 메모리에 올라가니 그 후에 로드밸런서에 편입시키면 된다. 

2. 성능평가나 부하시험

성능평가나 부하시험을 실시할 필요가 있을 때 초깃값을 버려야 한다. 이 말은 최초의 캐시가 최적화되어 있지 않은 단계에 캐시가 올라가 있지 않을 때와 올라가 있을 때 낼 수 있는 속도는 완전히 다르다. 따라서 성능평가나 부하시험도 캐시가 최적화된 후에 실시

3. OS의 동작원리와 부하분산의 관계

1. os의 동작원리인 OS 캐시, 멀티스레드나 멀티프로세스, 가상 메모리 구조, 파일시스템 등 을 알아야 시스템 전체를 최적화할 수 있다. 이것이 부하분산의 기초지식이다. 단순히 여러 대의 호스트로 작업을 분산시키는 것만이 다가 아니다. (요청 분배에 LVS사용법 알아야)