Перейти к основному содержимому

Расширенная диагностика ошибок памяти и аварийных сбоев

Описание

В СУБД СУБД Pangolin реализован механизм расширенной диагностики ошибок выделения общей памяти (out of shared memory) и аварийных завершений процессов по сигналам SIGSEGV, SIGILL, SIGBUS.

При возникновении ошибки out of shared memory и при обработке аварийных сигналов в системном журнале автоматически регистрируется расширенная диагностическая информация, включающая стек вызовов процесса, состояние общей памяти и детализацию потребителей анонимного блока <anonymous>.

Для анализа структуры потребления общей памяти в рабочем режиме доступно системное представление pg_anon_shmem_allocations.

Функциональность предназначена для оперативного выявления причин исчерпания общей памяти и анализа причин аварийного завершения процессов СУБД.

Схема процесса

На схеме показан механизм расширенной диагностики и этапы формирования диагностических сообщений при критических ошибках выполнения.

Диагностика ошибки «out of shared memory» в СУБД Pangolin

При возникновении ошибки out of shared memory и включенном параметре enable_extended_log_on_out_of_shmem в системный журнал автоматически выводятся:

  • backtrace процесса;
  • состояние распределения общей памяти (вывод совпадает с pg_shmem_allocations);
  • детализация потребителей блока <anonymous>.

Для получения детализации блока <anonymous> в СУБД доступна функция:

pg_get_anon_shmem_allocations()

На ее основе в системе доступно представление pg_anon_shmem_allocations, которое создается автоматически при инициализации кластера или при обновлении СУБД Pangolin начиная с версии 6.7.0.

Доступ к представлению по умолчанию имеют суперпользователь и пользователи роли pg_read_all_stats.

Представление содержит столбцы:

  • name — имя хеш-таблицы либо имя переменной структуры;
  • count — количество элементов (для хеш-таблиц), иначе пусто;
  • used_size — фактически используемая память;
  • allocated_size — выделенная память с учетом выравнивания.

В выводе может присутствовать строка Alignment. Это не имя хеш-таблицы и не имя переменной: при инициализации структур в общей памяти выполняется выравнивание по границе кеш-линии, и строка отражает объем памяти, использованный для выравнивания.

Пример вывода pg_anon_shmem_allocations:

            name            | count | used_size | allocated_size 
----------------------------+-------+-----------+----------------
pg_password policy hash | 21 | 263088 | 641792
PROCLOCK hash | 0 | 0 | 950272
AuthLastTokenHash | 0 | 0 | 61952
Activity History Hash | 0 | 0 | 3329408
Lock History Hash | 0 | 0 | 54513664
Shared Buffer Lookup Table | 612 | 280588 | 16785408
ETEHash | 0 | 0 | 131072
PREDICATELOCK hash | 0 | 0 | 1736704
shared hash table | 0 | 0 | 18560
pg_stat_statements hash | 34 | 12240 | 1945600
SERIALIZABLEXID hash | 0 | 0 | 67584
LOCK hash | 0 | 0 | 925696
AuthStatusCtxHash | 0 | 0 | 9088
pg_stat_kcache hash | 24 | 5376 | 1265536
PREDICATELOCKTARGET hash | 1 | 416 | 622592
AuthBunchCtxHash | 0 | 0 | 20608
ShmemIndex | 88 | 8448 | 16256
PGShmemHeader | | 56 | 56
sharedSemas | | 10149888 | 10149888
ShmemLock | | 1 | 8
Alignment | | 64 | 64
ShmemVariableCache | | 80 | 128
MainLWLockArray | | 43880 | 43904
PredXact->element | | 307200 | 307200
RWConflictPool->element | | 384000 | 384000
actualProcs | | 1138368 | 1138432
procs | | 1344 | 1408
ProcGlobal->xids | | 1344 | 1408
ProcGlobal->subxidStates | | 336 | 384
ProcGlobal->statusFlags | | 168 | 256
ProcStructLock | | 1 | 128
<total> | | 12596886 | 95069056
(32 rows)

Пример ошибки out of shared memory с расширенной диагностикой (backtrace):

2026-01-21 12:21:42 MSK [3041883]: [7-1] app=psql,user=postgres,db=postgres,client=<IP-Address>,type=client backend ERROR:  out of shared memory
2026-01-21 12:21:42 MSK [3041883]: [8-1] app=psql,user=postgres,db=postgres,client=<IP-Address>,type=client backend BACKTRACE:
postgres: postgres postgres <IP-Address>(52872) SELECT() [0x5734c2]
/usr/pangolin-6.7/lib/shared_mem_test.so(shared_mem_test+0x72) [0x7f94c052d022]
postgres: postgres postgres <IP-Address>(52872) SELECT() [0x7a37bf]
postgres: postgres postgres <IP-Address>(52872) SELECT() [0x7df9fd]
postgres: postgres postgres <IP-Address>(52872) SELECT(standard_ExecutorRun+0x113) [0x7a9403]
/usr/pangolin-6.7/lib/auto_explain.so(+0x17f5) [0x7f94c2ea07f5]
/usr/pangolin-6.7/lib/pg_stat_statements.so(+0x3940) [0x7f94c2c97940]
/usr/pangolin-6.7/lib/pg_stat_kcache.so(+0x28ae) [0x7f94c2a8c8ae]
postgres: postgres postgres <IP-Address>(52872) SELECT(pgaudit_ExecutorRun_hook+0x18) [0xbc0df8]
postgres: postgres postgres <IP-Address>(52872) SELECT() [0x982b60]
postgres: postgres postgres <IP-Address>(52872) SELECT(PortalRun+0x17c) [0x98442c]
postgres: postgres postgres <IP-Address>(52872) SELECT() [0x97fb6f]
postgres: postgres postgres <IP-Address>(52872) SELECT(PostgresMain+0x1855) [0x981db5]
postgres: postgres postgres <IP-Address>(52872) SELECT() [0x8c6767]
postgres: postgres postgres <IP-Address>(52872) SELECT(PostmasterMain+0x192e) [0x8c8a7e]
postgres: postgres postgres <IP-Address>(52872) SELECT(main+0x813) [0x593303]
/lib64/libc.so.6(__libc_start_main+0xe5) [0x7f94d67af575]
postgres: postgres postgres <IP-Address>(52872) SELECT(_start+0x2e) [0x59552e]

Состояние общей памяти (вывод совпадает с pg_shmem_allocations, фрагмент):

2026-01-21 12:21:42 MSK [3041883]: [9-1] app=psql,user=postgres,db=postgres,client=<IP-Address>,type=client backend SHMEM ALLOCATIONS:  
name off size allocated_size
--------------------------------------------- --------------- --------------- ---------------
pg_password policy hash 2254239872 2904 2944
Session tracing levels Storage 2253977728 9992 10112
Shared Memory Stats 2252932096 263312 263424
.............................................................................................
.............................................................................................
.............................................................................................
PREDICATELOCKTARGET hash 2236834944 2904 2944
Backend Status Array 2241466496 73440 73472
AuthBunchCtxHash 2254216192 2904 2944
hash_shared_state 2316447744 16 128
<anonymous> 110581120 110581120
2332012160 364928 364928

Детализация блока <anonymous>:

<anonymous>
name count used_size allocated_size
--------------------------------------------- --------------- --------------- ---------------
pg_password policy hash 21 263088 641792
PROCLOCK hash 0 0 950272
AuthLastTokenHash 0 0 61952
Activity History Hash 0 0 3329408
Lock History Hash 0 0 54513664
Shared Buffer Lookup Table 594 283472 16785408
ETEHash 0 0 131072
PREDICATELOCK hash 0 0 1736704
shared hash table 946 15503048 15530624
pg_stat_statements hash 31 11160 1945600
SERIALIZABLEXID hash 0 0 67584
LOCK hash 0 0 925696
AuthStatusCtxHash 0 0 9088
pg_stat_kcache hash 21 4704 1265536
PREDICATELOCKTARGET hash 1 416 622592
AuthBunchCtxHash 0 0 20608
ShmemIndex 88 8448 16256
PGShmemHeader - 56 56
sharedSemas - 10149888 10149888
ShmemLock - 1 8
Alignment - 64 64
ShmemVariableCache - 80 128
MainLWLockArray - 43880 43904
PredXact->element - 307200 307200
RWConflictPool->element - 384000 384000
actualProcs - 1138368 1138432
procs - 1344 1408
ProcGlobal->xids - 1344 1408
ProcGlobal->subxidStates - 336 384
ProcGlobal->statusFlags - 168 256
ProcStructLock - 1 128
<total> - 28101066 110581120

Вывод детализации блока <anonymous> соответствует выводу представления pg_anon_shmem_allocations.

Диагностика аварийных сигналов в СУБД Pangolin

В СУБД Pangolin реализованы встроенные обработчики сигналов SIGSEGV, SIGILL, SIGBUS.

При получении указанных сигналов и включенном параметре enable_extended_log_on_segfault в системный журнал автоматически выводится backtrace аварийно завершившегося процесса. Вывод выполняется с использованием async-signal-safe функций, допускаемых к применению в обработчиках сигналов.

Пример для backend-процесса:

[3044360] LOG: BACKTRACE:
/lib64/libpthread.so.0(+0x12cf0) [0x7f94d87f1cf0]
/lib64/libc.so.6(epoll_wait+0x57) [0x7f94d68889c7]
postgres: postgres postgres <IP-Address>(51422) idle(WaitEventSetWait+0x115) [0x949855]
postgres: postgres postgres <IP-Address>(51422) idle(secure_read+0xd2) [0x7fbf12]
postgres: postgres postgres <IP-Address>(51422) idle() [0x80436e]
postgres: postgres postgres <IP-Address>(51422) idle(pq_getbyte+0x15) [0x805335]
postgres: postgres postgres <IP-Address>(51422) idle(PostgresMain+0xe8b) [0x9813eb]
postgres: postgres postgres <IP-Address>(51422) idle() [0x8c6767]
postgres: postgres postgres <IP-Address>(51422) idle(PostmasterMain+0x192e) [0x8c8a7e]
postgres: postgres postgres <IP-Address>(51422) idle(main+0x813) [0x593303]
/lib64/libc.so.6(__libc_start_main+0xe5) [0x7f94d67af575]
postgres: postgres postgres <IP-Address>(51422) idle(_start+0x2e) [0x59552e]

Пример для postmaster:

[3044996]: LOG: BACKTRACE:
/lib64/libpthread.so.0(+0x12cf0) [0x7fc4325d5cf0]
/lib64/libc.so.6(__select+0x5f) [0x7fc430663b6f]
/usr/pangolin-6.7/bin/postgres() [0x8c5d37]
/usr/pangolin-6.7/bin/postgres(PostmasterMain+0x192e) [0x8c8a7e]
/usr/pangolin-6.7/bin/postgres(main+0x813) [0x593303]
/lib64/libc.so.6(__libc_start_main+0xe5) [0x7fc430593575]
/usr/pangolin-6.7/bin/postgres(_start+0x2e) [0x59552e]

Пример для checkpointer:

[3044543] LOG: BACKTRACE:
/lib64/libpthread.so.0(+0x12cf0) [0x7f94d87f1cf0]
/lib64/libc.so.6(epoll_wait+0x57) [0x7f94d68889c7]
postgres: checkpointer (WaitEventSetWait+0x115) [0x949855]
postgres: checkpointer (WaitLatch+0x74) [0x949c44]
postgres: checkpointer (CheckpointerMain+0x4b4) [0x8be924]
postgres: checkpointer (AuxiliaryProcessMain+0x156) [0x8bc6f6]
postgres: checkpointer () [0x8c3965]
postgres: checkpointer () [0x8c6203]
postgres: checkpointer (PostmasterMain+0x192e) [0x8c8a7e]
postgres: checkpointer (main+0x813) [0x593303]
/lib64/libc.so.6(__libc_start_main+0xe5) [0x7f94d67af575]
postgres: checkpointer (_start+0x2e) [0x59552e]

Пример для file system checker:

[3045011] LOG: BACKTRACE:
/lib64/libpthread.so.0(+0x12cf0) [0x7fc4325d5cf0]
/lib64/libc.so.6(epoll_wait+0x57) [0x7fc43066c9c7]
postgres: file system checker (WaitEventSetWait+0x115) [0x949855]
postgres: file system checker () [0x949dbd]
postgres: file system checker (FSCheckerProcMain+0x33b) [0x8d94eb]
postgres: file system checker (StartBackgroundWorker+0x201) [0x8bd531]
postgres: file system checker () [0x8c4a9f]
postgres: file system checker () [0x8c4cf1]
/lib64/libpthread.so.0(+0x12cf0) [0x7fc4325d5cf0]
/lib64/libc.so.6(__select+0x5f) [0x7fc430663b6f]
postgres: file system checker () [0x8c5d37]
postgres: file system checker (PostmasterMain+0x192e) [0x8c8a7e]
postgres: file system checker (main+0x813) [0x593303]
/lib64/libc.so.6(__libc_start_main+0xe5) [0x7fc430593575]
postgres: file system checker (_start+0x2e) [0x59552e]

Диагностика аварийных сигналов в Pangolin Pooler

В Pangolin Pooler реализован механизм обработки сигналов SIGSEGV, SIGILL, SIGBUS.

При включенном параметре enable_extended_log_on_segfault в журнал Pangolin Pooler автоматически выводится backtrace аварийно завершившегося процесса. Вывод выполняется в файл журнала, заданный параметрами конфигурации Pangolin Pooler.

Пример:

[3037763] LOG BACKTRACE:
/lib64/libpthread.so.0(+0x12cf0) [0x7f69bf225cf0]
/lib64/libc.so.6(epoll_wait+0x57) [0x7f69be3509c7]
/lib64/libevent-2.1.so.6(+0x2f8d9) [0x7f69bfbe08d9]
/lib64/libevent-2.1.so.6(event_base_loop+0x308) [0x7f69bfbd65b8]
/opt/pangolin-pooler/bin/pangolin-pooler() [0x42a49a]
/opt/pangolin-pooler/bin/pangolin-pooler() [0x4157f5]
/lib64/libc.so.6(__libc_start_main+0xe5) [0x7f69be277575]
/opt/pangolin-pooler/bin/pangolin-pooler() [0x4177ae]

Ограничения

  1. При повреждении структур общей памяти вывод информации о потребителях может быть неполным или некорректным.
  2. Представление pg_anon_shmem_allocations не отображает блоки памяти, выделенные через инфраструктуру динамической общей памяти (DSM).
  3. При использовании системного журнала (syslog) и отсутствии параметра log_file вывод стеков вызовов может отсутствовать.
  4. Backtrace по сигналам SIGSEGV, SIGILL, SIGBUS выводится независимо от установленного уровня логирования.

Настройка

Конфигурационные параметры СУБД Pangolin

В шаблон конфигурации СУБД Pangolin (PostgreSQL / Pangolin Manager в зависимости от поставки) добавлены параметры, управляющие выводом расширенной диагностической информации в журнал при ошибках выделения общей памяти и аварийных сигналах. Параметры включены по умолчанию, изменения применяются после перечитывания конфигурации (reload).

Конфигурационные параметры Pangolin Pooler

В шаблон конфигурации Pangolin Pooler добавлен параметр, управляющий выводом backtrace при аварийных сигналах. Параметр включен по умолчанию, изменения применяются после перечитывания конфигурации (reload) или перезапуска сервиса.

Включение функциональности

Задание параметров осуществляется в конфигурационных файлах СУБД Pangolin (postgresql.conf для конфигурации standalone, postgres.yml для конфигурации cluster), а также в конфигурации Pangolin Pooler.

Для включения механизма расширенной диагностики используются следующие параметры СУБД Pangolin:

  • enable_extended_log_on_out_of_shmem = on;
  • enable_extended_log_on_segfault = on.

Для Pangolin Pooler используется параметр enable_extended_log_on_segfault = 1.

примечание

Изменения параметров применяются после перечитывания конфигурации (reload). Перезапуск сервиса требуется только при изменении параметров запуска компонента.

Отключение функциональности

Отключение механизма расширенной диагностики производится путем установки параметров в значения:

Для СУБД Pangolin:

  • enable_extended_log_on_out_of_shmem = off;
  • enable_extended_log_on_segfault = off.

Для Pangolin Pooler enable_extended_log_on_segfault = 0.

После изменения параметров необходимо выполнить перечитывание конфигурации (reload) либо перезапуск соответствующего сервиса.

Изменения при обновлении

Функциональность доступна начиная с версии 6.7.0.

При обновлении с более ранних версий в процессе pg_inplace_upgrade автоматически создаются функция pg_get_anon_shmem_allocations и представление pg_anon_shmem_allocations, при этом изменяются системные каталоги.

Дополнительные метрики и точки трассировки не добавляются. Сообщения аудита не изменяются.