Расширенная диагностика ошибок памяти и аварийных сбоев
Описание
В СУБД СУБД 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]
Ограничения
- При повреждении структур общей памяти вывод информации о потребителях может быть неполным или некорректным.
- Представление
pg_anon_shmem_allocationsне отображает блоки памяти, выделенные через инфраструктуру динамической общей памяти (DSM). - При использовании системного журнала (
syslog) и отсутствии параметраlog_fileвывод стеков вызовов может отсутствовать. - 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, при этом изменяются системные каталоги.
Дополнительные метрики и точки трассировки не добавляются. Сообщения аудита не изменяются.