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

Поставка сборки с отладочными пакетами

Описание​

Для улучшения качества и скорости исследования инцидентов, возникших в промышленной среде, начиная с версии продукта СУБД Pangolin 6.4.0 производится поставка отладочных символов. Отладочная информация отделяется от исполняемых/библиотечных объектов и сохраняется в отдельных файлах. Данные файлы поставляются отдельным пакетом (далее отладочным пакетом) с каждым компонентом решения, для которых их поставка предусмотрена.

В корневой каталог дистрибутива продукта добавлена директория debug, содержащая отладочные пакеты всех компонентов, для которых предусмотрена поставка. Скрипты автоматизации установки расширены дополнительными конфигурационными параметрами, позволяющие производить установку отладочных символов в момент установки решения.

Перечень компонентов решения для которых предусмотрена поставка отладочных символов:

  • Серверная часть СУБД (pangolin-dbms);
  • Клиентская часть СУБД (pangolin-dbms-client);
  • Интерфейс программирования libpq (pangolin-dbms-libpq);
  • Компонент Pangolin Pooler (pangolin-pooler);
  • Компонент Pangolin Manager (pangolin-manager);
  • Утилита резервного копирования (pangolin-backup-tools);
  • Утилита ротации сертификатов (pangolin-certs-rotate);
  • Утилиты настройки безопасности (pangolin-security-utilities).
Сведения

Установка отладочного пакета не оказывает влияния на производительность решения. Принятие решения о моменте установки отладочной информации принимается пользователем.

Установка отладочных пакетов позволяет:

  • получать информативный стек вызовов (с адресами и именами функций);
  • производить рассекречивание дампов памяти процесса (core dump), в том числе сформированных автоматически до момента установки отладочных пакетов;
  • сократить срок расследования инцидентов.

Настройка​

Установка отладочных пакетов доступна следующими способами:

Установка отладочных символов производится в стандартную директорию модуля, для которого они собраны, и размещается в одном каталоге с исполняемыми файлами/библиотеками. Отладочная информация собирается только для исполняемых файлов и библиотек.

Сведения

Для корректного сбора информации в момент возникновения инцидента, необходимо произвести дополнительную настройку операционной системы (ОС) для автоматического формирования снимков памяти процесса (core dump) в случае аварийного завершения процесса.

Установка отладочной информации не влияет на процесс создания снимков памяти процесса (core dump) и последующую информативность содержащих в них данных. Однако необходимо, чтобы в момент исследования дампов, отладочные символы были установлены (функциональность позволяет формировать информативный стек вызовов из дампов, сформированных до установки отладочной информации).

Ручная установка отладочных пакетов​

Для установки отладочного пакета используйте пакетный менеджер. Далее приведен пример установки отладочного пакета компонента Pangolin Manager.

sudo dnf install pangolin-manager-debuginfo-{version_component}-{OS}.x86_64.rpm

Пример заполненной команды:

sudo dnf install -y ~/distributive/debug/pangolin-manager-debuginfo-2.1.9-sberlinux9.x86_64.rpm

Автоматическая установка отладочных пакетов​

Установка отладочных символов компонента происходит автоматически в момент установки компонента при установке соответствующего флага в файле конфигурации скриптов автоматизации.

Имена переменных для установки пакетов debuginfo (пакеты будут установлены в случае флагов в значении true) в custom_config_initial:

setup_debug_symbols:
pangolin_backup_tools: false # Install backup-tools-debuginfo package, contain debug symbols for origin backup-tools package
pangolin_dbms: false # Install dbms-debuginfo package, contain debug symbols for origin dbms-client package
pangolin_dbms_client: false # Install dbms-client-debuginfo package, contain debug symbols for origin dbms-client package
pangolin_manager: false # Install manager-debuginfo package, contain debug symbols for origin manager package
pangolin_pooler: false # Install pooler-debuginfo package, contain debug symbols for origin pooler package
pangolin_certs_rotate: false # Install certs-rotate-debuginfo package, contain debug symbols for origin certs-rotate package
pangolin_security_utilities: false # Install security-utilities-debuginfo package, contain debug symbols for origin security-utilities package

Мета-пакет pangolin-full-debuginfo​

Дополнительно реализован мета-пакет pangolin-full-debuginfo, который предполагает установку отладочных символов следующих компонентов:

  • серверная часть СУБД (pangolin-dbms-debuginfo);
  • клиентская часть СУБД (pangolin-dbms-client-debuginfo);
  • компонент Pangolin Pooler (pangolin-pooler-debuginfo);
  • компонент Pangolin Manager (pangolin-manager-debuginfo);
  • утилита резервного копирования (pangolin-backup-tools-debuginfo);
  • утилита ротации сертификатов (pangolin-certs-rotate-debuginfo);
  • утилиты настройки безопасности (pangolin-security-utilities-debuginfo).

Обновление отладочных пакетов​

Существует несколько сценариев обновления отладочных символов:

  • Установку отладочных символов при обновлении с версий ниже 6.4.0 пользователь производит вручную (в т.ч. при выполнении обновления средствами скриптов автоматизации) путем запуска установки соответствующего отладочного пакета, хранящегося в дистрибутиве продукта.

  • При выполнении обновления средствами скриптов автоматизации, начиная с версии 6.4.0, обновление ранее установленных отладочных символов производится автоматически до версии, аналогичной устанавливаемым модулям, для которых они собраны. Обновление производится в том объеме, в котором отладочные символы были установлены ранее. При этом значения переменных словаря setup_debug_symbols, установленных в custom_config_initial, при обновлении игнорируются и вычисляются на основе ранее установленных пакетов.

  • При выполнении ручного обновления, начиная с версии 6.4.0, отладочные символы должны быть удалены перед выполнением обновления модулей, для которых они собраны и установлены вручную.

Управление​

Настройка ОС для автоматического формирования core dump​

С целью обеспечения автоматического формирования дампа памяти процесса (core dump) средствами операционной системы необходимо выполнить ее дополнительную настройку.

Как правило, выполнения ulimit -c unlimited перед запуском процесса достаточно для включения автоматического формирования снимков памяти (core dump) аварийно завершенного процесса. Однако также рекомендуется выполнить дополнительную настройку имен и путь расположения файлов, для чего перед запуском процесса дополнительно необходимо выполнить:

  1. Добавить в файл /etc/sysctl.conf параметры:

    kernel.core_uses_pid = 1
    kernel.core_pattern = /tmp/core-%e-%s-%p-%t
    fs.suid_dumpable = 2

    где kernel.core_pattern - паттерн расположения и имени core-файла. В имени файла можно использовать следующие %-спецификаторы:

    • %% - один % символ;
    • %p - PID процесса для которого создан файл;
    • %u - UID процесса для которого создан файл;
    • %g - GID процесса для которого создан файл;
    • %s - номер сигнала повлекшего создание файла;
    • %t - время создание файла (количество секунд с 00:00 1 января 1970 года);
    • %h - имя узла;
    • %e - имя исполняемого файла.
  2. Перезагрузить настройки в /etc/sysctl.conf, выполнив команду:

    sudo sysctl -p

Формирование стека вызова из core-файлов​

При возникновении инцидента с генерацией снимка памяти процесса (core dump) необходимо самостоятельно или с привлечением службы технической поддержи сформировать информативный стек вызовов в текстовом формате для его дальнейшего передачи разработчикам.

Под информативным стеком вызовов понимается стек с именами внутренних функций.

Пример неинформативного стека вызовов:

#0 0x00007fbc791d1b6f in ?? ()
#1 0x000000000080ef62 in ?? ()
#2 0x0000000000811070 in ?? ()
#3 0x000000000055cb93 in ?? ()

Пример максимально информативного стека вызовов:

#0 0x00007efe1d229b6f in select () from /lib64/libc.so.6
#1 0x0000000000811192 in ServerLoop ()
#2 0x0000000000813013 in PostmasterMain ()
#3 0x000000000055f0f3 in main ()
Примечание

Отладочные пакеты компонентов решения не включают символы ряда используемых библиотек (не включенных в поставку), библиотек операционной системы (ОС), файлов ядра ОС.

При возникновении потребности в данных символах пользователь производит их поиск и установку самостоятельно.

Перед началом работ по получению стека вызовов из core-файла необходимо убедиться, что отладочные символы установлены.

Для формирования стека вызовов:

  1. Запустите gdb с передачей имени исполняемого файла (для которого сформирован core-файл) и имя core-файла. Пример:

    gdb /usr/pangolin-{short_version}/bin/postgres /tmp/core-postgres-6-1550075-1727167676
  2. В интерактивном режиме gdb выполните команду для формирования трассы вызовов:

    (gdb) bt

Определение исполняемого файла для которого сформирован core-файл​

Сore-файл содержит информацию об исполняемом файле, для которого он был сформирован. Для получения этой информации достаточно запустить gdb с передачей только core-файла. В момент загрузки файла gdb выведет информацию. Пример подобного вывода:

Core was generated by `/usr/pangolin-x.x/bin/postgres -D /pgdata/0x/data'.

Где /usr/pangolin-x.x/bin/postgres - имя исполняемого файла и путь к нему.

Наименование пакетов с отладочной информацией​

Наименование пакетов, содержащих отладочную информация, совпадают с именами оригинальных пакетов и добавлением постфикса: -debuginfo. Например, оригинальный пакет: pangolin-dbms-x.x. Пакет с отладочной информацией: pangolin-dbms-x.x-debuginfo.

Наименование файлов, содержащих отладочную информацию​

Наименование файлов, содержащих отладочные символы для исполняемых объектов, совпадают с именами файлов, для которых они собраны с добавлением суффикса: .debug. Пути расположения отладочных файлов полностью совпадают с путями расположения исполняемых файлов, для которых они были созданы.

Например, отладочный файл для /usr/pangolin-x.x/bin/postgres будет назван /usr/pangolin-x.x/bin/postgres.debug.

Сценарии использования​

Установки отладочного пакета после установки пакета с исполняемыми файлами​

  1. Выполните установку пакета pangolin-dbms-{short_version}-{product_version}-{OS}.x86_64.rpm версии не ниже 6.4.0.

  2. Выполните установку отладочного пакета pangolin-dbms-{short_version}-debuginfo-{product_version}-{OS}.x86_64.rpm.

  3. Проверьте установку пакета, содержащего исполняемые файлы. Например, при установке через rpm (sudo rpm -i ...):

    rpm -q pangolin-dbms-{short_version}

    Ожидаемый результат: Вывод для приведенной команды:

    pangolin-dbms-{short_version}-7.3.2-{OS}.x86_64

  4. Проверьте установку отладочного пакета. Например,при установке через rpm (sudo rpm -i ...):

    rpm -q pangolin-dbms-{short_version}-debuginfo

    Ожидаемый результат: Вывод для приведенной команды:

    pangolin-dbms-{short_version}-debuginfo-7.3.2-{OS}.x86_64

  5. Проверьте наличие файлов с отладочными символами в директории /usr/pangolin-{short_version}/bin, для этого выполните команду:

    sudo find /usr/pangolin-{short_version}/bin/ -name "*.debug"

    Ожидаемый результат: Пример вывода команды:

    /usr/pangolin-{short_version}/bin/trace_decode.debug
    /usr/pangolin-{short_version}/bin/pg_test_fsync.debug
  6. Проверьте наличие файлов с отладочными символами в директории /usr/pangolin-{short_version}/lib, для этого выполните команду:

    sudo find /usr/pangolin-{short_version}/lib/ -name "*.debug"

    Ожидаемый результат: Директория содержит файлы отладочного пакета. Пример вывода команды:

    /usr/pangolin-{short_version}/lib/pgcrypto.so.debug
    /usr/pangolin-{short_version}/lib/fasttrun.so.debug

Настройки автоматической генерации core-файлов​

  1. Выполните настройку ОС для автоматического формирования core дамп.

  2. Выполните установку пакета pangolin-dbms-{short_version}-{product_version}-{OS}.x86_64.rpm.

  3. Создайте служебные каталоги БД для пользователя postgres, выполнив последовательно команды:

    sudo mkdir -p /pgdata/0<base_version>/data
    sudo chown -R postgres:postgres /pgdata/0<base_version>/
    sudo mkdir /pgerrorlogs
    sudo chown postgres:postgres /pgerrorlogs/
  4. Смените текущего пользователя на пользователя postgres:

    sudo su - postgres
  5. Проинициализируйте каталоги БД, выполнив команду:

    initdb -k -D /pgdata/0<base_version>/data/

    Ожидаемый результат: Инициализация выполнена успешно (отсутствуют сообщения об ошибках в процессе работы утилиты initdb), пример вывода:

    The files belonging to this database system will be owned by user "postgres".
    This user must also own the server process.

    The database cluster will be initialized with locale "en_US.utf8".
    The default database encoding has accordingly been set to "UTF8".
    The default text search configuration will be set to "english".

    Data page checksums are enabled.

    fixing permissions on existing directory /pgdata/0<base_version>/data ... ok
    creating subdirectories ... ok
    selecting dynamic shared memory implementation ... posix
    selecting default max_connections ...
    "/usr/pangolin-6.3/bin/postgres" --check -F -c log_checkpoints=false -c is_initdb=true -c max_connections=100 -c shared_buffers=1000 -c dynamic_shared_memory_type=posix < "/dev/null" > "/dev/null" 2>&1
    100
    selecting default shared_buffers ... 128MB
    selecting default time zone ... Europe/Moscow
    creating configuration files ... ok
    running bootstrap script ... ok
    performing post-bootstrap initialization ... ok
    syncing data to disk ... ok

    initdb: warning: enabling "trust" authentication for local connections
    initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.

    Success. You can now start the database server using:

    pg_ctl -D /pgdata/0<base_version>/data/ -l logfile start
  6. Запустите сервер PostgreSQL:

    pg_ctl -D /pgdata/0<base_version>/data/ -l /pgerrorlogs/postgresql.log start

    Ожидаемый результат: Сервер PostgreSQL запущен, пример вывода:

    waiting for server to start.... done
    server started
  7. Получите PID запущенного процесса сервера запуском команды:

    ps -aux | grep pangolin

    Ожидаемый результат: PID процесса сервера СУБД получен. Пример вывода команды:

    postgres 1549833 0.0 0.3 603844 39612 ? Ss 11:37 0:00 /usr/pangolin-<short_version>/bin/postgres -D /pgdata/0<base_version>/data
    postgres 1549868 0.0 0.0 221940 1200 pts/1 S+ 11:40 0:00 grep --color=auto pangolin

    Где 1549833 - PID запущенного процесса сервера СУБД.

  8. Завершите процесс сервера путем вызова команды:

    kill -ABRT <PID_SERV_PROC>

    Где <PID_SERV_PROC> – идентификатор запущенного процесса сервера (полученный на предыдущем шаге).

    Ожидаемый результат: Сформирован core-файл, имя и расположение которого соответствуют паттерну, указанному для параметра kernel.core_pattern в файле /etc/sysctl.conf.

    Пример для приведенных настроек:

    ls /tmp/core*

    /tmp/core-postgres-6-1549833-1727167676

Вывод стека вызова работающего процесса»​

  1. Выполните установку пакета pangolin-dbms-{short_version}-{product_version}-{OS}.x86_64.rpm версии не ниже 6.4.0.

  2. Выполните установку отладочного пакета pangolin-dbms-{short_version}-debuginfo-{product_version}-{OS}.x86_64.rpm для установленной на предыдущем шаге версии.

  3. Создайте служебные каталоги БД для пользователя postgres, выполнив команды:

    sudo mkdir -p /pgdata/0<base_version>/data
    sudo chown -R postgres:postgres /pgdata/0<base_version>/
    sudo mkdir /pgerrorlogs
    sudo chown postgres:postgres /pgerrorlogs/
  4. Смените текущего пользователя на пользователя postgres:

    sudo su - postgres
  5. Проинициализируйте каталоги БД, выполнив:

    initdb -k -D /pgdata/0<base_version>/data/

    Ожидаемый результат: Инициализация выполнена успешно (отсутствуют сообщения об ошибках в процессе работы утилиты initdb).

  6. Выполните запуск сервера PostgreSQL:

    pg_ctl -D /pgdata/0<base_version>/data/ -l /pgerrorlogs/postgresql.log start

    Ожидаемый результат: Сервер PostgreSQL запущен:

    waiting for server to start.... done
    server started
  7. Получите PID запущенного процесса сервера:

    ps -aux | grep pangolin

    Ожидаемый результат: PID процесса сервера PostgreSQL получен. Пример вывода:

    postgres 1549833 0.0 0.3 603844 39612 ? Ss 11:37 0:00 /usr/pangolin-6.4/bin/postgres -D /pgdata/0<base_version>/data
    postgres 1549868 0.0 0.0 221940 1200 pts/1 S+ 11:40 0:00 grep --color=auto pangolin
  8. Подключитесь к процессу сервера утилитой pstack:

    pstack <PID_SERV_PROC>

    Где <PID_SERV_PROC> - идентификатор запущенного процесса сервера (полученный на предыдущем шаге).

    Ожидаемый результат: Утилита pstack успешно подключилась к процессу и вывела информативный стек вызовов (содержащий имена вызванных функций). Пример вывода:

    #0 0x00007fee61b71b6f in select () from /lib64/libc.so.6
    #1 0x0000000000811192 in ServerLoop ()
    #2 0x0000000000813013 in PostmasterMain ()
    #3 0x000000000055f0f3 in main ()