Book

[그림으로 공부하는 IT 인프라 구조] 3-4장

  • -
728x90

3장. 3계층형 시스템을 살펴보자

1. 프로세스와 스레드

프로세스 및 스레드는 프로그램 실행 파일 자체가 아니라 OS상에서 실행돼서 어느 정도 독립성을 가지고 동작하는 것.
프로세스 및 스레드가 활동하려면 메모리 공간이 필요한데, 이것은 커널에 의해 메모리상에 확보된다.

 

프로세스 vs 스레드
프로세스는 전용 메모리 공간을 이용해서 동작하는 반면, 스레드는 다른 스레드와 메모리 공간을 공유하고 있는 운명 공동체이다.
프로세스는 개별 처리 독립성이 높은 반면, 독자 메모리 공간을 가지기 때문에 생성 시 CPU 부하가 스레드와 비교해서 높아진다.

 

2. OS 커널

OS에서 커널은 심장이자 뇌이며 척수이다.
커널은 다양한 역할을 갖지만, 가장 중요한 것은 뒤에서 무슨 일이 벌어지는지 은폐하면서도 편리한 인터페이스를 제공하는 것이다. (이러한 이유로 커널이 존재하기 때문에 개발자는 하드웨어나 다른 애플리케이션에 끼치는 영향을 의식하지 않고 애플리케이션을 만들 수 있는 것이다.)

 

2-1. 시스템 콜 인터페이스
프로세스/스레드에서 커널로 연결되는 인터페이스.
애플리케이션이 OS를 통해서 어떤 처리를 하고 싶으면 시스템 콜이라고 하는 명령을 이용해서 커널에 명령을 내린다. 이때 명령이 인터페이스를 통해 전달된다.
시스템 콜을 호출해서 뒤에서 구체적으로 어떤 처리를 하고 있는지 프로세스가 의식할 필요 없이 기능을 이용할 수 있다.

 

2-2. 프로세스 관리
OS상에서는 수백, 수천 개의 프로세스를 가동할 수 있다. 이에 비해 물리 서버의 CPU 코어 수는 많아야 수십 개 정도밖에 되지 않는다.
언제 어떤 프로세스가 어느 정도의 CPU 코어를 이용할 수 있는지, 처리 우선순위를 어떻게 결정할 것인지 등을 관리.

 

2-3. 메모리 관리
물리 메모리 공간의 최대치를 고려한다.
프로세스가 이용하는 독립 메모리 공간을 확보하거나 상호 간의 참조 영역을 지키기 위해 독립성을 관리하는 등의 메모리 관리 역할을 수행.

 

2-4. 네트워크 스택

6장으로 생략.

 

2-5. 파일 시스템 관리
물리 디스크에 제공되는 데이터를 관리하는 기능
물리 디스크에 기록된 데이터는 0101과 같은 이진수 집합에 불과하다. 구분 표시도 없을뿐더러 그대로 사용하기는 매우 어려운 형태이다.
파일 시스템 덕분에 애플리케이션은 파일이라는 단위로 데이터를 작성하거나 삭제할 수 있다.

 

2-6. 장치 드라이버
NIC나 디스크는 다수의 제조사가 독자 제품을 제공하고 있다. 각각에 대응하는 애플리케이션을 개발하는 것은 현실적이지 못하기 때문에 커널은 장치 드라이버를 이용해서 그 아래에 있는 물리 장치를 은폐한다.

각 장치 제조사가 OS에 대응하는 장치 드라이버를 제공해서 해당 OS의 표준 장치로서 커널을 경유해 이용할 수 있게 하는 것이다.

 

커널 설계 및 구현 방식
모놀리식 방식
OS의 주요 구성 요소를 모두 하나의 메모리 공간을 통해 제공

 

마이크로 커널
최소한의 기능만 커널이 제공하고 그 외 기능은 커널 밖에서 제공.

 

3. 웹 데이터 흐름
3계층형 시스템에서의 흐름

 

3-1. 클라이언트 PC ~ 웹 서버
웹 브라우저가 요청을 발행한다. - DNS를 통해 이름 해석을 한다. - 웹 서버가 요청을 접수한다. - 웹 서버가 정적 콘텐츠인지 동적 콘텐츠인지 판단한다. - 필요한 경로로 데이터를 액세스 한다.

 

3-2. 웹 서버 ~ 웹 애플리케이션 서버
동적 콘텐츠에 대한 요청을 처리하는 것이 AP서버이다. - 웹 서버로부터 요청이 도착한다. - 스레드가 요청을 받으면 자신이 계산할 수 있는지, 아니면 DB 접속이 필요한지를 판단. - DB 접속이 필요하면 연결 풀에 액세스 후, DB 서버에 요청을 던진다.

 

3-3. 웹 애플리케이션 서버 ~ DB 서버
AP 서버로부터 요청이 도착한다. - 프로세스가 요청을 접수하고 캐시가 존재하는지 확인 후, 캐시에 없으면 디스크에 액세스 한다. - 디스크가 데이터를 반환하면, 데이터를 캐시 형태로 저장한다. - 결과를 AP 서버에 반환. - 서버 메모리에 캐시가 있는지 먼저 확인하고 없으면 디스크에 액세스 해서 필요한 데이터를 가지고 온다.
* 참고로 인메모리 DB 등 에서는 디스크 자체를 사용하지 않고 모든 처리를 메모리 내에서 완료하는 구조라서 고속화를 실현할 수 있다.

 

3-4. AP 서버 ~ 웹 서버
DB 서버로부터 데이터가 도착.
스레드가 데이터를 가지고 계산 등을 한 후에 파일 데이터를 생성.
결과를 웹 서버로 반환.

 

3-5. 웹 서버 ~ 클라이언트
AP 서버로부터 데이터가 도착한다.
프로세스는 받은 데이터를 그대로 반환.
결과가 웹 브라우저로 반환되고 화면에 표시

 

공통점
각 서버의 동작은 다르지만 다음과 같은 공통점이 있다.

프로세스나 스레드가 요청을 받는다.
도착한 요청을 파악해서 필요에 따라 별도 서버로 요청을 보냄.
도착한 요청에 대해 응답.

 

4. 가상화

가상화란, 컴퓨터 시스템에서 물리 리소스를 추상화하는 것.

물리 리소스에는 서버, 네트워크, 저장소 등이 있지만 이 책에서는 서버 가상화에 대해 알아본다.

 

4-1. OS도 가상화 기술의 하나
하드웨어를 의식하지 않고 애플리케이션을 실행할 수 있는 운영체제는 가상화 기술 중 하나라고 볼 수 있다.

OS 등장 이전에는 하드웨어를 의식한 프로그래밍이 필요했고 매우 복잡한 작업이었다. OS의 커널에 의해 하드웨어가 추상화되면서, 컴퓨터에 연결된 기억 장치나 네트워크를 통한 데이터 교환이 하드웨어를 의식하지 않고 이루어지고 있다.

 

4-2. 가상 머신
가상 머신 방식에는 호스트 OS형과 하이퍼바이저형이 있다.

 

호스트 OS형
윈도우나 리눅스 등의 호스트 OS상에 가상화 소프트웨어를 설치해서 이용하는 것.
소프트웨어를 에뮬레이터 하는 것으로 성능면에서 제한이 있다.

 

하이퍼바이저형
하드웨어상에서 직접 가상화 소프트웨어를 실행하고 그 위에 가상 머신을 동작시키는 기술.
호스트 OS를 거치지 않으므로 호스트형보다 성능이 우수해서 서버 가상화의 대표 기술로 자리 잡음.
하이퍼바이저형 가상화 구조에는 완전 가상화와 준가상화가 있다.

 

완전 가상화
물리 머신상에서 동작하는 OS나 드라이버를 그대로 게스트로 이용할 수 있는 장점.
소프트웨어로 에뮬레이션 하기 때문에 성능이 저하된다는 문제

 

준가상화
실존하는 하드웨어를 에뮬레이션 하는 것이 아니라, 가상 환경용 가상 하드웨어를 소프트웨어적으로 에뮬레이션 한다.

 

4-3. 컨테이너
도커 등장 이후 컨테이너가 급속도로 유행하기 시작.

 

컨테이너
리소스가 격리된 프로세스.
하나의 OS상에서 여러 개를 동시에 기동 할 수 있음.
각각 독립된 루트 파일 시스템, CPU/메모리, 프로세스 공간 등을 사용할 수 있음.

 

chroot
프로세스가 OS의 루트 디렉터리 아래에 있는 특정 계층에 접근하지 못하도록 하는 기능.

 

4-4. 도커의 등장

가상 머신과 비교해서 도커가 지니는 장점

컨테이너는 호스트 OS와 OS 커널을 공유하므로 컨테이너 실행이나 정지 속도가 빠름.
호스트 OS의 커널을 공유하므로 VM만 사용하는 경우와 비교해 한 대의 호스트 머신상에서 훨씬 많은 컨테이너를 실행할 수 있다. 이를 통해 리소스를 한 곳에서 쉽게 관리할 수 있음

 

4-5. 클라우드와 가상화 기술
하이퍼바이저 및 컨테이너 등의 가상화 기술은 구글이나 페이스북, 아마존 등에 대규모 웹 서비스에서 사용되고 있음.
AWS, GCP, Azure 등의 클라우드 서비스에서는 가상 머신 서비스, 컨테이너 서비스, Function as a Service 서비스나 다른 기타 서비스를 지탱하는 기술로 이용되고 있다.

4장. 인프라를 지탱하는 기본 이론

1.직렬/병렬
CPU 관점에서의 병렬
최근 서버는 물론 PC에도 여러 개의 CPU가 탑재되어 있다.
이런 배경에는 소비 전력과 발열 문제를 들 수 있다.
CPU 제조사가 클럭 속도를 올리는 대신에 코어 수를 늘려서 이 문제를 해결하려고 방침을 전환하였기 때문.

 

시스템 관점에서의 병렬
대규모 웹 서비스에서는 방대한 수의 사용자 요청을 처리해야 하므로 수많은 서버를 배치해서 병렬로 처리하고 있다.

이처럼 주변에는 병렬 처리가 넘쳐나고 있지만, 무조건 병렬화한다고 해서 성능이 향상되는 것이 아니다.ㅋ

 

직렬 vs 병렬
여러 개의 물건이 일직선으로 나열돼 있는 것을 직렬, 두 줄 이상으로 나열돼 있는 것을 병렬이라고 한다.

 

컴퓨터에서의 병렬
성능이 아무리 좋은 하드웨어라도 혼자서 처리할 수 있는 양이 정해져 있다.
특정 기간 내에 하나의 CPU로 처리할 수 있는 양에는 한계가 있지만, 여러 개의 CPU를 배치하면 처리량을 늘릴 수 있다.

 

주의사항
처리 특성에 따라 병렬화할 수 있는 것과 없는 것이 있다. 따라서 직렬 처리가 분기해서 병렬로 되거나, 다시 합류해서 직렬로 되기도 한다.
병렬 처리에서는 합류점, 직렬화 구간, 분기점이 병목 지점이 되기 쉽다.
병렬화할 때는 일을 분담해서 처리를 한 후 다시 집약할 때 오버헤드가 걸린다. 그래서 이 오버헤드를 감안하더라도 효과가 있을 경우 병렬화를 해야 한다.

 

어디에 사용되나?
웹 서버와 웹 애플리케이션 서버의 병렬화
웹 서버에는 다수의 이용자가 접속하기 때문에 복수의 프로세스가 분담해서 병렬 처리를 하고 있다.
웹 애플리케이션 서버에서는 JVM 프로세스가 하나이지만 복수의 스레드가 병렬로 처리하고 있다.

 

DB 서버에서의 병렬화
오라클 DB에서는 클라이언트 요청을 접수하는 서버 프로세스가 클라이언트 접속 수만큼 생성된다.
데이터 파일 생성 시에 병목 현상이 발생하는 경우, 메모리에 캐시 된 갱신 완료 데이터를 HDD에 기록하는 DBWR 프로세스 수를 늘려서 병렬화할 수도 있다.
DBWR 프로세스 수를 늘리는 방법 외에도 비동기 I/O를 사용해서 OS 측에서의 쓰기 처리를 병렬화 하는 방법도 있다.

 

2. 동기/비동기
동기 vs 비동기란?
동기란 누군가에게 일을 부탁하고 그 일이 끝나기까지 잠자코 기다리는 것
비동기란 끝나면 말해라고 말해두고 다른 일을 하는 것.

 

어디에 사용되나?
Ajax 비동기 통신
Ajax에서는 비동기 통신을 이용한 병렬 처리가 가능하다.
Ajax가 등장하기 이전에는 링크나 버튼을 클릭할 때마다 화면 전체가 바뀌는 것을 기다려야 했다. 하지만 Ajax를 사용한 웹 페이지에서는 비동기 통신이 가능해져서 화면을 보거나 입력하면서 필요한 부분만 갱신할 수 있게 됐다.

 

DBMS에서 사용되는 비동기 I/O
DBMS는 HDD 등의 저장소에 비동기로 쓰기 처리를 할 수 있다. (비동기 I/O라고 한다)
동기 I/O에서는 I/O가 끝날 때 까지 프로세스가 다음 처리를 하지 않지만 비동기 I/O에서는 I/O가 끝나지 않아도 다음 처리를 할 수 있다.
비동기 I/O는 대량의 I/O를 효율적으로 처리해야 하는 DBMS에 적합하다고 할 수 있다. 공유 메모리에 있는 다수의 데이터를 프로세스가 HDD에 기록하는 경우, 비동기 I/O라면 하나의 I/O가 끝나기까지 기다리지 않고 다음 I/O를 발행할 수 있기 때문에 저장소 성능을 충분히 활용할 수 있다.

cf) DBMS
일반적으로 DBMS에는 I/O를 전문으로 하는 프로세스나 스레드가 존재한다.
I/O 병렬화에는 프로세스나 스레드를 복수 사용하는 방식과 비동기 I/O 방식이 있다
DBMS에서는 비동기로 I/O를 요구한 후에 I/O가 끝났는지 여부를 확인하는 방식을 사용.

 

주의 사항
비동기 I/O를 발행하더라도 저장소 성능 이상으로는 빨라지지 않는다.

 

C10K 문제
하드웨어 성능상에 문제가 없어도 클라이언트 수가 많아지면 서버가 고장 나는 문제이다.
클라이언트 접속마다 프로세스를 생성하면 OS 파일 디스크립터나 프로세스 수가 최대치에 이르거나, 1 프로세스 당 소비 메모리 크기는 작지만 이것이 쌓여서 문제가 될 수 있다.
또한 프로세스 수가 만 단위 이상이 되면 컨텍스트 스위칭 등에 사용되는 CPU 사용률도 무시할 수 없게 된다. 게다가 프로세스 수가 너무 많으면 프로세스를 관리하는 OS 커널 내의 관리용 데이터 크기도 커진다.

 

해결 방법
하나의 프로세스로 복수의 접속을 처리하는 방법

클라이언트 통신은 정말로 필요한 경우에만 처리한다. (1 프로세스 = 복수 접속)
이런 기법을 논블로킹 I/O라고 한다.
논블로킹 I/O는 OS 시스템 콜로 구현돼 있어서, 그것을 그대로 사용한다.
논블로킹 I/O의 주의점은 모든 접속을 완전히 동기로 처리할 수 없기 때문에 동기 처리 수를 고려해야 한다는 것이다.

 

3. 큐

큐란?
큐는 대기 행렬로, 먼저 들어온 데이터가 먼저 나가는 방식으로, FIFO 방식이라고 한다.
순서대로 처리를 하고 싶은 경우나 행렬이 생기는 경우 큐를 사용하는 것이 좋다.

 

어디에 사용되나?
CPU 처리를 기다리고 있는 프로세스나 스레드 행렬
하드 디스크 등의 저장소 읽기 처리를 기다리고 있는 I/O 요구 행렬
네트워크 접속 성립을 기다리고 있는 접속 요구 행렬

웹 서버의 CPU 처리를 기다리고 있는 아파치 프로세스
웹 서버인 아파치의 내부에 코어 두개를 탑재한 CPU 하나가 있다.
아파치 프로세스는 네 개이며, 두개는 CPU에서 처리 중, 나머지 두 개는 대기 상태다.
이처럼 CPU를 기다리고 있는 프로세스 행렬을 런큐라고 한다.
런큐에 쌓인 프로세스 수를 코어 수로 나누어서 1이라면 문제없다는 것이 일반적이다.

 

데이터베이스의 디스크 I/O
기본 개념은 CPU와 같지만 프로세스나 스레드가 사용하는 대상이 CPU가 아닌 HDD인 점만 다르다.

 

메시지 큐
메시지 큐를 사용하면 애플리케이션 간 상호 운용성을 향상해서 시스템 전체 안정성을 향상할 수 있다.
어딘가가 먼춘다고 해서 시스템 전체가 멈추는 것은 아니기 때문이다.
대기 시간 절약이나 버퍼링용 리소스 절약 등에 의해 성능이 향상되는 경우도 있다.
비동기 처리에서는 처리를 의뢰한 후 끝날 때까지 기다리지 않고 다음 처리를 진행하지만, 의뢰를 받은 쪽에서는 처리가 쌓여서 순서를 기다리고 있는 경우도 있다. 이 경우에도 큐가 사용된다.

 

4. 배타적 제어

복수의 처리가 공유자원 (CPU, 메모리 , 디스크)에 동시에 액세스 하면 불일치가 발생할 수 있기 때문에 배타적 제어로 보호해 주어야 한다.
일반적으로 OS나 DBMS는 병렬 처리를 위해 배타적 제어를 사용한다.
병렬 처리 시에 각 처리가 서로 관계없이 동작하는 경우에는 배타적 제어가 필요 없지만, 대부분은 공유 데이터를 이용하며, 부분적으로 직렬 처리를 사용해야만 되는 경우가 있다. 이때 배타적 제어가 필요하다.
병렬 처리 관련 성능 문제에 배타적 제어가 영향을 주는 경우가 꽤 있다. (병목 현상이 발생하기 쉽다)

 

어디에 사용되나?
DBMS에 사용되는 배타적 제어
오라클 DB에서는 여러 프로세스가 동시에 병행으로 처리를 하고 있지만, 특정 프로세스가 공유 데이터를 변경하고 있는 도중에 다른 프로세스가 해당 공유 데이터를 읽거나 공유 데이터를 동시에 변경하지 못하도록 배타적 제어를 하고 있다.
DBMS의 배타적 제어에서는 매우 짧은 시간 동안만 락을 유지하는 방식.

 

OS 커널에 사용되는 배타적 제어
리눅스 커널은 빅 커널락이라 불리는, 하나의 스핀 락으로 유지된다.

클러스터 데이터베이스의 배타적 제어
여러 대의 DB 서버를 조합해서 하나의 데이터베이스로 사용하는 액티브-액티브 클러스터 DB에서도 동일한 것이 가능하다.
각 서버에서 병렬 처리를 하면 처리 속도가 올라가지만, 서버 간 배타적 제어에 의해 대기 처리가 늘어나면 아무리 서버가 많아도 병렬 처리를 할 수 없다.
클러스터 DB에서는 서버 간 데이터 교환을 얼마나 줄일 수 있는지, 배타적 제어에 의한 대기 상태를 얼마나 줄일 수 있는지가 중요하다.

 

5.상태 저장/상태 비저장

Stateful, Stateless
상태 정보를 가지는 Stateful, 상태 정보를 가지지 않는 Stateless.

상태를 가진다는 것.
상태를 가진다는 것은 과거에 부여한 정보를 저장해서 계속 활용할 수 있다는 것을 의미.
반대의 상태를 가지고 있지 않으면, 과거 정보를 알 수 없다.

 

ssh vs http
ssh는 상태 저장 프로토콜인 반면, http는 상태 비저장 프로토콜이다.

어디에 사용되나?

 

컴퓨터 내부 구조
컴퓨터 내에서는 거의 모든 곳에 상태 저장이 사용되고 있다.
복잡한 처리를 구현하기 위해 상태 저장은 필수부 가결이다.
일반 CPU는 하나의 CPU에서 복수의 프로세스를 조금씩 처리한다. 이 때문에 특정 시점에 진짜로 처리를 하고 있는 프로세스는 ICPU(코어) 당 하나다. 처리를 하지 않는 프로세스는 대기 상태로 있어야 한다. 어떤 명령이나 애플리케이션을 실행하면 프로세스가 생성된다.

가장 먼저 실행 큐에 불리는 순서 대기 행렬에 줄을 서야 한다. (이 상태를 실행 가능 상태라고 한다)
차례가 돌아오면 실행 상태로 전이하고 (Dispatch), 애플리케이션 처리를 한다.
하나의 프로세스가 CPU를 독점하는 것이 아니라 일정량을 처리하면 CPU를 다시 열며, 이때 프로세스는 다시 순서 행렬로 돌아가 줄을 선다.
만약 디스크 액세스 등 I/O 대기가 발생하는 처리를 실행한 경우 대기 상태로 전이한다.
처리가 전부 끝나면 종료 상태가 된다.

 

네트워크 통신 구조
브라우저가 HTTP 서버에 접속할 때는 HTTP라 불리는 프로토콜을 사용한다.
이 HTTP는 기본적으로 Stateless 프로토콜이다. 따라서 인증 상태를 유지할 수 없음.
HTTP에서는 세션이라는 개념을 사용해서, 로그인 등의 인증을 거치면 서버는 그 상태를 저장함과 동시에 인증 완료 세션 정보를 반환한다.
인증을 끝낸 사용자는 통신 시에 이 세션 정보를 서버에 건네기만 하면 이전 처리 상태를 유지하면서 접속할 수 있다.

 

6. 가변 길이/고정 길이

고정 길이
데이터의 크기가 미리 크기가 정해져 있는 경우

 

가변 길이
데이터의 크기가 미리 정해져 있지 않은 경우

 

특징
가변 길이
공간을 유용하게 활용할 수 있지만 성능 면에서 불안정하다.

 

고정 길이
쓸데없는 공간이 생기지만 성능 면에서는 안정적이다.

 

어디에 사용되나?

 

파일 시스템
NTFS라 불리는 파일 시스템에서는 각종 파일을 고정 길이로 저장하고 있다.

 

네트워크
이더넷: 가변 길이

일반적인 이더넷의 MTU는 1500바이트로, TCP/IP 헤더 합계가 40바이트이기 때문에 TCP/IP로 데이터를 전송할 때 1460바이트 정도의 세그먼트로 분할하고, 마지막 남은 1~1460바이트 크기로 전송된다.

 

ATM

ATM이라는 데이터 링크 층의 프로토콜에서는 셀이라 불리는 53바이트 고정 길이 형식을 사용한다.

 

7. 데이터 구조 (배열, 연결 리스트)

배열
데이터를 빈틈없이 순서대로 나열한 데이터 구조
탐색이 빠르지만 O(1), 데이터 추가, 삭제가 느림 O(n)

 

연결 리스트
데이터를 선으로 연결한 데이터 구조
데이터 추가, 삭제가 빠르지만 O(1), 탐색이 느림 O(n)

 

8. 탐색 알고리즘 (해시, 트리)

자료구조 vs 알고리즘
데이터 정리 방법을 자료 구조라 하고, 처리 순서를 알고리즘이라고 한다.
처리 순서에 맞추어 데이터 구조를 정리할 필요가 있기 때문에 알고리즘과 데이터 구조는 자주 함께 다뤄진다.

 

어디에 사용되나?

DBMS 인덱스
인덱스가 있으면 검색이 빨라지지만 대신, 데이터 추가, 갱신, 삭제 시에 테이블뿐만 아니라 인덱스 데이터도 갱신해야 한다.
인덱스 갱신 때문에 불필요한 오버헤드가 발생할 수 있다.

'Book' 카테고리의 다른 글

[그림으로 공부하는 IT 인프라 구조] 1-2장  (0) 2024.01.12
[SQL 레벨업] 7-8장  (0) 2023.12.01
[SQL 레벨업] 5 - 6장  (0) 2023.12.01
[SQL 레벨업] 3-4장  (0) 2023.11.25
[SQL 레벨업] 2장  (0) 2023.11.25
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.