27.1. 표준 유닉스 도구들

대부분의 유닉스 환경에서는 PostgreSQL 서버의 동작 상태를 ps 쉘 명령어만으로도 대략적으로 살펴 볼 수 있다. 왜냐하면 서버는 자신 하고 있는 각각의 하위 프로세스들의 명령어 이름들을 동적으로 바꾸어서 운영체제가 그것을 볼 수 있도록 하기 때문이다. 그래서 다음과 같은 간단한 명령어로 서버 상태를 살펴 볼 수 있다:

$ ps auxww | grep ^postgres
postgres  15551  0.0  0.1  57536  7132 pts/0    S    18:02   0:00 postgres -i
postgres  15554  0.0  0.0  57536  1184 ?        Ss   18:02   0:00 postgres: writer process
postgres  15555  0.0  0.0  57536   916 ?        Ss   18:02   0:00 postgres: checkpointer process
postgres  15556  0.0  0.0  57536   916 ?        Ss   18:02   0:00 postgres: wal writer process
postgres  15557  0.0  0.0  58504  2244 ?        Ss   18:02   0:00 postgres: autovacuum launcher process
postgres  15558  0.0  0.0  17512  1068 ?        Ss   18:02   0:00 postgres: stats collector process
postgres  15582  0.0  0.0  58772  3080 ?        Ss   18:04   0:00 postgres: joe runbug 127.0.0.1 idle
postgres  15606  0.0  0.0  58772  3052 ?        Ss   18:07   0:00 postgres: tgl regression [local] SELECT waiting
postgres  15610  0.0  0.0  58772  3056 ?        Ss   18:07   0:00 postgres: tgl regression [local] idle in transaction

(이 명령은 여러 유닉스 제각각이다. 윗 예제는 요즘 사용하는 리눅스 시스템에서 사용하는 명령어다. ps 명령의 옵션에 대한 자세한 설명은 사용하고 있는 유닉스 운영체제 설명서를 설펴보는 것이 좋다.) 윗 예제 출력 결과의 첫번째 줄은 데이터베이스 서버의 최상위 프로세스이며, 서버를 실행 할 때 사용했던 옵션들도 함께 보인다. (PostgreSQL 서버는 쓰레드 방식이 아니라, 다중 프로세스 방식으로 운영된다. 다중 프로세스 방식이란, 서버 관리자가 서버 실행 명령어를 OS 쉘에서 실행하면, 서버 최상위 프로세스 실행되고, 그 프로세스를 필요한 여러 프로세스를 실행하는 방식이다. - 옮긴이) 다음 다섯 줄은 이 최상위 프로세스가 실행한 서버 운영에 필요한 하위 프로세스들이다. 이것을 서버 백그라운드 프로세스라고 한다. 이 프로세스들은 윗 예제와 꼭 같지는 않다. "autovacuum launcher" 프로세스는 autovacuum 기능을 사용하지 않으면 보이지 않을 것이며, 서버 로그를 stderr 쪽으로 보내지 않고 따로 보관하는 기능을 사용한다면, "postgres: logger process" 같은 프로세스도 보일 것이다. 나머지는 클라이언트가 접속해서 서버측에서 만든 세션 프로세스들이다. 이 세션 프로세스들은 다음과 같은 양식으로 보여준다:

postgres: 사용자 데이터베이스 호스트 현재작업상태

사용자, 데이터베이스, (클라이언트) 호스트 정보는 그 프로세스가 종료 될 때까지 항상 같지만, 현재작업상태 정보는 그 세션의 작업 상태에 따라 바뀐다. 현재작업상태에 idle은 이 세션이 클라이언트의 명령을 대기하고 있음을 뜻한다. idle in transaction으로 표시되는 것은 그 세션이 현재, BEGIN 명령을 사용해서, 트랜잭션 영역 안에 있지만, 클라이언트 측에서 아무 작업도 안하고 있는 상태이다. SELECT과 같이 명령어 종류를 보여 주는 경우도 있고, 그 뒤에, waiting이 붙어 있는 경우도 있다. 이 경우는 다른 프로세스가 어떤 작업을 하고 있어, 이 세션이 해당 작업을 대기하고 있는 상태를 나타낸다. 윗 예제를 보면, 15610 프로세스 때문에, 15606 프로세스가 작업을 대기하고 있음을 알 수 있다. (윗 예제 화면에서는 다른 세션들이 없기 때문에, 15610 프로세스가 잠금 문제를 일으킨 프로세스로 파악 할 수 있다. 어떤 잠금을 사용하고 있기에, 다른 프로세스가 기다리고 있는지에 대한 자세한 정보는 pg_locks 뷰를 통해서 알 수 있다.)

update_process_title 환경 설정값을 off로 지정했다면, 프로세스 현재작업상태 자리에는 그 프로세스의 첫 작업에 대한 이름으로 지정되면, 그 프로세스가 종료될 때까지 그대로 유지된다. 몇몇 OS에서는 이 프로세스 이름을 바꾸는 작업이 부하를 유발한다고 사용하지 않는 경우도 있고, 또 몇몇 OS에서는 이 작업에 대해서 전혀 신경 쓰지 않는 경우도 있다.

작은 정보: Solaris에서는 이 부분 처리가 독특하다. 먼저 /bin/ps 명령 대신에, /usr/ucb/ps 사용하고, w 옵션을 두 개 지정하고, 서버 시작 최상위 프로세스의 이름이 각 세션 프로세스의 이름보다 짧게 지정한다면, 세션 프로세스들의 이름이 동적으로 바뀌는 것을 살펴볼 수 있다. 하지만, 이 세가지 조건 중 하나라도 만족하지 않는다면, 모든 프로세스 이름은 서버 최상위 프로세스의 이름과 같게 보인다.