공통/인프라 & 시스템 설계

[그림으로 공부하는 IT인프라 구조] 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 인덱스

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