Стандартные инструменты Unix
В большинстве платформ Unix QHB изменяет заголовок своей команды, выводимый на экран программой ps, поэтому отдельные процессы сервера можно легко идентифицировать. Пример вывода:
$ ps auxww | grep ^qhb
qhb 15551 0.0 0.1 57536 7132 pts/0 S 18:02 0:00 qhb -i
qhb 15554 0.0 0.0 57536 1184 ? Ss 18:02 0:00 qhb: background writer
qhb 15555 0.0 0.0 57536 916 ? Ss 18:02 0:00 qhb: checkpointer
qhb 15556 0.0 0.0 57536 916 ? Ss 18:02 0:00 qhb: walwriter
qhb 15557 0.0 0.0 58504 2244 ? Ss 18:02 0:00 qhb: autovacuum launcher
qhb 15582 0.0 0.0 58772 3080 ? Ss 18:04 0:00 qhb: joe runbug 127.0.0.1 idle
qhb 15606 0.0 0.0 58772 3052 ? Ss 18:07 0:00 qhb: tgl regression [local] SELECT waiting
qhb 15610 0.0 0.0 58772 3056 ? Ss 18:07 0:00 qhb: tgl regression [local] idle in transaction
(Допустимый формат вызова ps, как и детали отображаемой информации, отличаются на разных платформах. Этот пример приведен для одной из последних версий системы Linux.) Первым из перечисленных здесь процессов является процесс главного сервера. Выведенные для него аргументы команды те же, что использовались при запуске. Следующие четыре процесса являются фоновыми рабочими процессами, автоматически запускаемыми главным процессом. (Процесса «autovacuum launcher» (процесс запуска автовакуума) не будет в этом списке, если в системе выключена автоочистка.) Каждый из оставшихся процессов — это серверный процесс, обрабатывающий одно клиентское подключение. Для каждого такого процесса устанавливается отображение командной строки в виде
qhb: пользователь база_данных хост активность
Элементы пользователь, база данных и хост остаются неизменными на протяжении всего
жизненного цикла клиентского соединения, а индикатор активности меняется. Он может
принимать значение idle (т. е. ожидание команды клиента), idle in transaction
(ожидание клиента внутри блока BEGIN) или имя типа команды, например SELECT.
Кроме того, если в настоящее время серверный процесс ожидает освобождения
блокировки, которую удерживает другой сеанс, то к индикатору активности добавляется
waiting. В приведенном выше примере мы можем сделать вывод, что процесс 15606
ожидает, пока процесс 15610 завершит свою транзакцию и тем самым освободит некоторую
блокировку. (Процесс 15610 должен быть блокирующим, потому что нет другого активного
сеанса. В более сложных случаях для определения, кто кого блокирует, понадобилось
бы обратиться к системному представлению pg_locks.)
Если установлен параметр instance_name, имя кластера также будет показано в выводе ps:
$ psql -c 'SHOW instance_name'
instance_name
--------------
server1
(1 row)
$ ps aux|grep server1
qhb 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 qhb: server1: background writer
...
Если выключить параметр update_process_title, то индикатор активности не меняется; заголовок процесса устанавливается только один раз при запуске нового процесса. На некоторых платформах это существенно снижает затраты на выполнение команды, на других это влияние незначительно.
Совет
Solaris требует особого обращения. Вместо /bin/ps нужно использовать /usr/ucb/ps. Также нужно использовать не один, а два флага w. Кроме того, у исходного вызова командыqhbотображение статуса в ps должно быть короче, чем у предоставляемого каждым серверным процессом. Если не сделать все эти три вещи, выводом ps для каждого серверного процесса будет исходная командная строкаqhb.