Расширенная диагностика ошибок памяти и аварийных сбоев
Описание
В СУБД СУБД 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 начиная с версии 7.2.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]
/opt/pangolin-dbms-server-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]
/opt/pangolin-dbms-server-7/lib/auto_explain.so(+0x17f5) [0x7f94c2ea07f5]
/opt/pangolin-dbms-server-7/lib/pg_stat_statements.so(+0x3940) [0x7f94c2c97940]
/opt/pangolin-dbms-server-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 функций, допускаемых к применению в обработчиках сигналов.
Пример для бэкенд-процесса:
[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]
/opt/pangolin-dbms-server-7/bin/postgres() [0x8c5d37]
/opt/pangolin-dbms-server-7/bin/postgres(PostmasterMain+0x192e) [0x8c8a7e]
/opt/pangolin-dbms-server-7/bin/postgres(main+0x813) [0x593303]
/lib64/libc.so.6(__libc_start_main+0xe5) [0x7fc430593575]
/opt/pangolin-dbms-server-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 автоматически выводится трассировка стека аварийно завершившегося процесса. Вывод выполняется в файл журнала, заданный параметрами конфигурации 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вывод стеков вызовов может отсутствовать. - Трассировка стека по сигналам
SIGSEGV,SIGILL,SIGBUSвыводится независимо от установленного уровня логирования.
Настройка
Конфигурационные параметры СУБД Pangolin
В шаблон конфигурации СУБД Pangolin (PostgreSQL / Pangolin Manager в зависимости от поставки) добавлены параметры, управляющие выводом расширенной диагностической информации в журнал при ошибках выделения общей памяти и аварийных сигналах. Параметры включены по умолчанию, изменения применяются после перечитывания конфигурации (reload).
Параметр | Значение по умолчанию | Описание |
|---|---|---|
|
| Управляет выводом расширенной диагностики при ошибке |
|
| Управляет выводом backtrace при |
Конфигурационные параметры Pangolin Pooler
В шаблон конфигурации Pangolin Pooler добавлен параметр, управляющий выводом backtrace при аварийных сигналах. Параметр включен по умолчанию, изменения применяются после перечитывания конфигурации (reload) или перезапуска сервиса.
Параметр | Значение по умолчанию | Описание |
|---|---|---|
|
| Управляет выводом backtrace при аварийных сигналах |
Включение функциональности
Задание параметров осуществляется в конфигурационных файлах СУБД 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 (для версий 6.x.x) и 7.2.0 (для версий 7.x.x).
При обновлении с более ранних версий в процессе pg_inplace_upgrade автоматически создаются функция pg_get_anon_shmem_allocations и представление pg_anon_shmem_allocations, при этом изменяются системные каталоги.
Дополнительные метрики и точки трассировки не добавляются. Сообщения аудита не изменяются.