В большинстве Unix-подобных операционных систем
Digital Q.DataBase
изменяет заголовок своей
команды, сообщаемый утилитой
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: background writer postgres 15555 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: checkpointer postgres 15556 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: процесс записи журнала WAL (walwriter) postgres 15557 0.0 0.0 58504 2244 ? Ss 18:02 0:00 postgres: процесс запуска автоочистки (autovacuum launcher) 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
различается на разных платформах, равно как и состав отображаемых данных. Этот пример приведен для современной системы Linux.) Первый из перечисленных процессов — это основной процесс сервера. Аргументы команды, указанные для него, соответствуют тем, что использовались при его запуске. Следующие четыре процесса — это фоновые рабочие процессы, автоматически запущенные основным процессом. (
«autovacuum launcher»
процесс будет отсутствовать, если в настройках системы отключен запуск автоочистки.) Каждый из остальных процессов представляет собой процесс сервера, обрабатывающий одно клиентское соединение. Каждый такой процесс формирует отображение своей командной строки в формате
postgres:
пользователь
база данных
хост
активность
Параметры «пользователь», «база данных» и «хост (клиента)» остаются неизменными в течение всего времени клиентского соединения, в то время как индикатор активности меняется. Активность может принимать значения
idle
(т. е. ожидание команды клиента),
idle in transaction
(ожидание клиента внутри блока
BEGIN
),
или имя типа команды, такое как
SELECT
. Кроме того, к состоянию
waiting
добавляется пояснение, если процесс сервера в данный момент ожидает освобождения блокировки, удерживаемой другим сеансом. Из приведенного выше примера можно сделать вывод, что процесс 15606 ожидает завершения транзакции процессом 15610 для освобождения соответствующей блокировки. (Процесс 15610 является блокирующим, так как
другие активные сеансы отсутствуют. В более сложных случаях для
определения источника блокировки потребовалось бы изучить системное представление
pg_locks
system view to determine who is blocking whom.)
Если параметр
cluster_name
был сконфигурирован, имя кластера также будет отображаться в выводе команды
ps
ps:
$ psql -c 'SHOW cluster_name' cluster_name -------------- server1 (1 row) $ ps aux|grep server1 postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: server1: background writer ...
Если вы отключили параметр update_process_title то индикатор активности не обновляется; заголовок процесса устанавливается только один раз при запуске нового процесса. На некоторых платформах это позволяет заметно сократить накладные расходы на выполнение каждой команды; на других этот эффект незначителен.
Solaris
требует специальной обработки. Необходимо
использовать
/usr/ucb/ps
, а не
/bin/ps
. Также необходимо использовать два
w
флага вместо одного. Кроме того, исходный вызов команды
postgres
должен иметь более короткую
ps
строку состояния, чем та, которая предоставляется каждым процессом сервера. Если не выполнить все три условия, то
ps
выводом для каждого процесса сервера будет исходная
postgres
командная строка.