Gravatar is an online service that allows Internet users to maintain a consistent image on most websites.

Иван Колдаев

2

Не создаётся core dump в PostgreSQL

Мой PostgreSQL начал внезапно падать, и я хотел сгенерировать core dump, но файл не создаётся.

Вот что я сделал:
1. Настроил:

    ulimit -S -c unlimited

2. Добавил строку в /etc/security/limits.conf:

    * soft core unlimited 

3. Задал путь для core dump:

    kernel.core_pattern="/coredumps/core-%e-%s-%u-%g-%p-%t"

4. Дал права на каталог:

    chmod 777 /coredumps

5. Тестировал:

    perl -MPOSIX -e '$0="test"; pause' &
kill -ABRT 

Файл создавался в нужной директории.

Когда падает PostgreSQL, в логах вижу:

    Resource limits disable core dumping for process 3607766 (postmaster).
Process 3607766 (postmaster) of user 26 dumped core.
systemd-coredump@13-140614-0.service: Succeeded.

Заметил, что у тестового процесса через cat /proc/pid/limits «Max core

    file size" — "unlimited", а у PostgreSQL — "0".

Что может быть не так?

Ответы

  • Gravatar is an online service that allows Internet users to maintain a consistent image on most websites.

    Захар Романов

    (Изменено)

    Если сервис уже запущен и ты не хочешь его перезапускать, можно попробовать изменить лимиты для работающего процесса с помощью команды prlimit:

        sudo prlimit --pid  --core=unlimited

    Это установит лимиты на core dump для уже запущенного процесса. Однако это временное решение — после перезапуска PostgreSQL нужно будет снова применить команду, поэтому лучше настроить лимиты через systemd, как описано выше.

    0
  • Gravatar is an online service that allows Internet users to maintain a consistent image on most websites.

    Пётр Беляков

    (Изменено)

    Проблема в том, что лимиты на core dump не глобальные для системы, а применяются к каждому процессу отдельно. Когда ты делаешь ulimit, это влияет только на текущую сессию Bash, а не на другие процессы или сервисы, такие как PostgreSQL.

    Так как сервисы не используют обычный процесс логина, они не наследуют настройки из /etc/security/limits.conf.

    Для настройки лимитов для PostgreSQL нужно добавить параметр LimitCORE=infinity в файл его сервиса через systemd.

    Вот как это сделать:

        sudo systemctl edit postgresql.service

    Затем добавь:

        [Service]
    LimitCORE=infinity

    Сохрани и перезапусти сервис:

        sudo systemctl restart postgresql

    1