DataBase/그림으로 공부하는 오라클 구조

2장 오라클의 여러 프로세스

우드의개발개발 2023. 9. 20. 15:55

데이터베이스가 여타 다른 어플리케이션 프로그램과 다른점

어플리케이션은 같은 어플리케이션이 여러개가 실행되어도 프로그램 간 데이터를 공유하지 않습니다. 이와는 다르게 데이터베이스는 여러 프로세스가 하나의 데이터베이스를 사용할 수 있습니다. 이로 인해 여러프로세스가 데이터베이스의 데이터에 I/O 작업을 수행할 수 있습니다. 여러 사용자와 프로그램이 데이터베이스를 공유하고 있는 형국입니다.

프로세스와 스레드의 차이

실행 중인 프로그램을 프로세스라고 합니다. 스레드는 프로세스내 실행 단위입니다. 둘다 병렬로 처리하기 위한 구조이지만 차이점은 부하의 크기와 메모리 공유 여부입니다. 프로세스는 부하가 크고 프로세스끼리 메모리를 공유하지 않습니다. 스레드는 부하가 적고 스레드끼리 데이터를 공유합니다. 여기서 부하가 크다라는 말은 프로세스 생성은 쓰레드 생성에 비해 상대적으로 많은 자원이 들어간다는 의미입니다.

 

프로세스는 각 프로세스 별 각자만의 메모리를 할당받습니다. 그리고 그 메모리 안에서 필요한 자원들을 할당받습니다. 그에 반해 쓰레드는 프로세스 내 메모리를 공유합니다. 해당 부문만 살펴보더라도 각각의 생성에 있어 들어가는 자원의 양이 다릅니다. 이런 점들로 인해 프로세스 간 컨텍스트 스위칭, 프로세스간 통신에도 쓰레드와 비교했을 때 비용이 큽니다.

오라클 데이터베이스가 여러개의 프로세스로 이루어진 이유

좀전에 데이터베이스는 여타 앱과는 다르게 여러 프로그램이 데이터베이스를 공유한다고 했습니다. 공유한다는 의미는 여러 프로그램이 데이터에 접근할 수 있다는 의미입니다. 이것이 가능하기 위해선 프로그램의 요청이 들어왔을 때 해당 요청을 처리할 수 있는 프로세스가 있어야 한다는 의미입니다. 즉 병렬처리를 하기위해 오라클에는 여러개의 프로세스가 있습니다. 보통 오라클 클라이언트 하나당 서버 프로세스 하나가 대응되게 됩니다.

자원이 아깝다고 생각하는 것에 대하여

아깝다는 것은 가지고 있는 스펙에 비해 해당 대상이 잘 활용되지 못할 때 얘기합니다. 본문에서는 한대의 PC를 여러 사람이 사용하는 일은 없으니 자원이 아깝다고 생각하는 것은 옳지 않은 생각이라고 말합니다. 필자는 여러 사람이 동시에 데이터베이스를 사용하는 상황에서만 CPU 자원이 아까울 수 있는 상황에 놓일 수 있다는 것입니다. 예를 들어 누군가 CPU 시간을 많이 잡는 클라이언트가 존재한다면 그 시간 동안 한명의 클라이언트의 요구만 처리해줄 수 있습니다. 만약 그 시간에 CPU 시간을 많이 소모하지 않는 다른 여러 사용자들의 요구를 처리 한다면 그런 관점에서 자원이 아깝다고 생각할 수 있습니다. 그러한 이유로 한대의 PC를 여러 사람이 사용하는 일은 없으니 CPU 소요시간이 많이 걸리는 작업을 요청한들 CPU는 다른 클라이언트 요청을 받을 일이 없으므로 자원이 아깝다고 생각하는 것은 옳지 않다는 필자의 생각입니다.

 

오라클 프로세스 유형

오라클에는 여러 프로세스가 있습니다. 대표적으로 보면 오라클 클라이언트의 요청(SQL 요청) 처리를 담당하는 서버 프로세스와 서버 프로세스를 돕는 백그라운드 프로세스가 있습니다. 백그라운드 프로세스의 일부로 다음과 같은 프로세스가 있습니다. 데이터베이스라이터, 로그라이터, 피몬, 아카이버. 데이터베이스라이터는 데이터를 디스크에 기록합니다. 로그라이터는 로그(데이터 갱신 이력)을 디스크에 기록합니다. pmon은 이상 프로세스를 감지하고 이를 처리합니다. 아카이브는 장기보관을 위해 로그데이터를 파일로 처리합니다. 

 

클라이언트 요청시 데이터베이스에서 처리되는 단계들

  • SQL문 수신 (1)
  • SQL문 파싱 (2)
  • 데이터 읽기(디스크에서 읽기) (3)
  • 데이터 쓰기(디스크에  기록) (4)
  • SQL 회신 (5)
  • 로그 기록(데이터 갱신 로그를 디스크에 기록) (6)
  • 각종 정리(프로세스 비정상 종료로 인한 처리) (7)
  • 로그 보관(로그 데이터 아카이브) (8)

 

위 과정의 각 단계를 서버프로세스 또는 백그라운드 프로세스가 하는 일로 매칭시킬 수 있습니다. 즉 각각의 단계는 두개의 프로세스 중 어느 하나에만 귀속됩니다. 그렇게 역할이 구분되어 있는 이유는 클라이언트의 처리를 보다 빠르게 하기 위해서입니다.  (1, 2, 3, 5) 부문이 서버 프로세스가 하는 일이고 나머지 (4, 6, 7, 8)이 백그라운드 프로세스가 하는 일입니다.

 

요약

해당 장에서는 1장에서 병렬처리를 가능케 하고 응답을 중시하기 위한 오라클 데이터베이스의 구조에 대해서 살펴보았습니다. 여러개의 서버프로세스를 둠으로써 병렬처리를 가능케 합니다. 빠른 처리를 위해 서버프로세스(섀도우 프로세스, 포그라운드 프로세스)와 백그라운드 프로세스로 나누어 일을 처리합니다.

 

생각해 볼만한 질문들

튜닝할 때는 어떤 프로세스를 보아야 할까?

서버 프로세스를 보아야한다. 데이터베이스 설계 자체가 클라이언트 응답에 최적화되게 설계되어있다. 여러 프로세스의 존재와 프로세스를 크게 서버프로세스와 백그라운드 프로세스로 나눈 것이 그 대답이 되어준다. 그랬을 때 성능이 현재 나오고 있지 않다는 것은 전체적인 구조에 문제가 있다라기 보다는 서버프로세스가 하는 여러가지 일 중에 특정 일을 제대로 잘 수행하고 있는지를 보아야한다. 위 글에서 (1,2,3,5) 부문이 그에 해당하였고 여기서 특히 2번 부문을 눈여겨 보아야한다.