그림으로 공부하는 IT인프라 구조 - Tirrilee/TechTalk GitHub Wiki
수직 분할, 수평 분할
- 수평 분할 : Sharding, Partitioning
수평 분할로하면 분리된 DB에 데이터 공유가 되지 않는다.
즉 데이터 동기 처리를 위해서 Oracle Database 에서는 내부적으로 클러스터 기능 (Real Application Clusters) 를 한다.
- 연산을 실행하고 결과를 반환한다
- 여러개의 코어가 존재하기 때문에 각자가 독립적인 처리를 할 수 있다.
- 메모리에 저장되는 정보는 영구성이 없다.
- 메모리 엑세스가 매우 빠르게 이루어지기 때문에 사용한다. > 전기적인 처리만으로 데이터를 저장하기 때문에
- CPU에는 L1(초고속), L2(고속), L3(준고속), Register Cache가 존재한다.
- 메모리 인터리빙 : 메모리에 미리 데이터를 CPU에 전달해서 처리 지연을 줄인다. (예상을 해서 미리 읽는다.)
- Channel : 메모리와 CPU간 데이터 경로를 의미한다.
- 데이터 입출력을 담당
- 자기 원반이 여러개 들어있어 읽기/쓰기를 처리하나 속도는 느리다.
- 요새는 빠르게 SSD를 사용하고, 전기가 없어도 데이터가 사라지지 않는다.
- HDD가 많이 탑재되어있는 저장소는 Storage라고 한다.
- Write Back VS Write Through
- Write Back : 쓰기 시에 캐시에만 데이터를 기록하고 완료했다고 한다.
- Write Through : 쓰기 시 캐시와 디스크를 모두 읽어서 라이트백과 비교하고 확실한 쪽에 쓰기 처리를 하기 위해 엑세스한다.
- HDD와 네트워크 인터페이스는 I/O 핸들러라는 컨트롤러에 연결되어있다.
- IOH(I/O Handler) : Quick Path Interconnect라는 고속 버스로 연결한다.
- ICH(I/O Controller) : 속도가 느려도 괜찮은 DVD나 USB 등의 I/O 제어를 담당한다.
- 서버 내부의 컴포넌트들을 서로 연결시키는 회선이다.
- 대역은 Throughput이라고 부른다.
-
프로세스
- 메모리가 각각 할당되어 있다.
- 프로세스가 시작전 커널이 요청 분량만큼 메모리를 할당한다.
- 웹서버는 프로세스(httpd)로 동작한다. 프로세스 안에는 메모리 공간을 점유하는 스레드가 동작하고 있다.
- 프로세스는 독자 메모리 공간을 가지기 때문에 CPU 부하가 높아진다.
-
스레드
- 공유 메모리가 할당되어 있다.
- 에를 들어 JVM 프로세스 안에 수많은 스레드가 동작하고 있다.
-
오라클 DB
- 각 프로세스별 메모리 공간(PGA)과 프로세스 전체가 공유하는 메모리 공간(SGA)이 나누어져있다.
- SGA에는 디스크상의 데이터 캐시나 실행 완료된 SQL 캐시, 인덱스 등이 저장된다.
- PGA는 SQL이 이용하는 소트 영역이나 테이블에 결합에 사용하는 메모리 영역이 저장되 있다.
- 시스템콜 인터페이스 : 데이터 읽기/쓰기, 네트워크 I/O
- 프로세스 관리
- 메모리 관리
- 네트워크 스택
- 파일 시스템 관리
- 프로세스는 편리성 때문에 모든 것을 파일 단위로 생각한다.
- 파일 시스템은 여러 프로세스가 공유한다.
- 자주 사용하는 내용을 캐시로 관리한다.
- 커널이 파일 시스템의 인터페이스로 동작한다.
- 장치 드라이버 : 물리 장치용 인터페이스 (디스크, NIC 등)
+) 모놀리식 커널 VS 마이크로 커널
- 모놀리식 커널 : 하나의 메모리 공간을 통해 제공한다.
- 마이크로 커널 : 최소한의 기능만 커널에서 제공하고 다른 기능은 커널 밖에서 제공한다.
- 웹 브라우저가 특정 사이트에 요청을 보낸다.
- DNS 서버에서 해당 Domain Name을 IP로 변환하고 웹서버에 요청을 보낸다.
- httpd 프로세스가 요청을 접수한다.
- httpd 받은 요청 내용을 분석해서 AP 서버에 보낼지, 디스크에서 읽을지 판단한다.
- 시스템 콜로 실행되며, 커널을 통해서 NIC에 대한 네트워크 통신이 요청된다. or 물리 디스크의 내용을 취득한다.
- 스위치를 경유해서 AP 서버에 질의한다.
- 웹 브라우저도 OS의 프로세스로 실행한다.
- 프로그램을 디스크에 저장되어있고, OS는 프로그램을 메모리에 상주시키고 실행한다.
- 웹 브라우저에서 클릭하면 웹 서버로 요청을 보낸다. > System call로 실행되고 NIC에 네트워크 통신을 요청한다.
- 네트워크 경유로 웹서버에 질의한다.
- 정적 콘텐츠 : 변경할 필요가 없는 데이터
- 동적 콘텐츠 : AP서버가 HTML 파일 동적으로 생성한다.
- NIC를 통해 Kernel Interrupt를 처리한다.
- 스레드가 요청을 접수한다. DB 조회가 필요하면 대기한다. (데이터가 캐시되어있으면 바로 데이터 반환)
- DB 접속은 드라이버를 통해서 연결 풀로 관리되고, JVM 전체가 리소스를 관리하기 때문에 DB와의 접속성도 유지한다.
- DB의 접속 요청은 System call로 진행되고, NIC에 대한 네트워크 통신이 이루어진다. (캐시 전용 서버가 있으면 그쪽에서 접속)
- 네트워크 경유로 DB 서버에 대한 질의가 이루어진다.
- DB서버에서는 DB프로세스가 요청을 접수한다.
- 캐시를 확인하기 위해 공유메모리에서 검색한다.
- 공유메모리에 없으면 System call을 통해 디스크에서 읽는다.
- 디스크의 데이터 요청을 통해 반환된다.
- AP서버로 요청을 보낸다.
- CPU 코어가 하나인 CPU는 프로세스가 많이 돌아도 프로세스는 1개밖에 동작하지 않는다.
- 4개의 프로세스 중 2개의 프로세스는 CPU를 이용해서 처리하고, 나머지는 대기 행렬에 있다. (run-queue)
- 내부적으로 CPU 코어 2개가 각가 처리하고 있다.
- 모두가 공유하는 데이터를 변경하면, 데이터를 읽고 싶지만 변경중이기 때문에 기다려야한다.
- DBMS의 배타적제어는 매우 짧은 시간동안만 lock을 거는 latch가 있다. (CPU에서 의미없는 처리를 하면서 대기하는 방식이다.)
- 비교적 장시간의 락을 유지해야하면, sleep lock을 건다.
- 상황에 따라 스핀할지 슬립할지를 판단하는 adaptive lock이 있다.
- 리눅스 커널은 빅 커널락이라 불리는 하나의 스핀락으로 구성되어있다.
- 가변 길이 : 공간을 유용하게 활용할 수 있지만 성능면에서 불안정하다.
- 고정 길이 : 쓸데없는 공간이 생기지만 성능 면에서는 안정적이다.
- SQL을 발행한다.
- 인덱스가 없으면 Full Scan을 한다.
- 공유 메모리에서 모든 데이터 블록을 꺼내서 읽은 결과를 가져온다.
- SQL을 발행한다.
- 인덱스에서 필요한 데이터가 있는 곳을 조사해서 필요한 데이터 블록만 읽는다.
- 원하는 한 건의 데이터가 들어있는 데이터 블록만 선택적으로 읽는다.
- B 트리 인덱스가 DBMS에서 자주 사용되는 것은 트리 계층이 깊어지지 않도록 디스크 I/O를 최소한으로 제어한다.
- T 트리 인덱스(2개의 가지)는 인메모리 DB에서 자주 사용되는데, 디스크 I/O를 신경쓸 필요가 없기 때문에 깊이 들어가도 상관없기 때문이다.
-
httpd process는 HTTP 요청시 socket (IP + Port)을 열어, 통신을 대기한다.
-
socket에는 필요한 데이터만 기록하며 통신은 모두 TCP/IP에서 위임한다.
-
HTTP는 한번 요청/응답이 완료되면, 세션을 종료하는데 너무 일찍 종료면 오버헤드가 발생한다. 따라서
Keep-alive를 이용하여 단시간 동안 세션을 남겨둘 수 있다. -
클라이언트 측의 포트는 OS에서 자동으로 할당해준다.
-
TCP에서 최대로 전송할 수 있는 데이터 크기 MSS(Maximum Segment Size)
-
Link 계층에서 최대로 전송할 수 있는 데이터 크기 MTU(Maximum Transfer Unit) = IP Header + TCP Header + MSS