Назад | Перейти на главную страницу

Как поднять максимальное количество файловых дескрипторов для демонов, работающих на Debian Jessie?

Я играю с pgBouncer в качестве системы пула соединений для PostgreSQL. Моя система - 12-ядерная с 64 ГБ ОЗУ и сетевым интерфейсом 1 Гбит / с под управлением Debian 8.1. Теперь я хочу поднять лимит для открытых сокетов, скажем, до 10.000 одновременных клиентов. При выполнении тестов БД pgbench утилита блокирует около 950 одновременных клиентов, что, кажется, достигает предела в 1024 открытых файловых хранилища, как это было в старые добрые времена. Я проверил fs.file-max параметр ядра и pgbench ограничение ресурсов запущенного пользователя:

# sysctl fs.file-max
fs.file-max = 6598264
# su - postgres
$ ulimit -Sn
65536
$ fgrep files /proc/self/limits
Max open files            65536                65536                files
$ 

Однако пределы от proc показать, что мягкий предел для максимального количества открытых файлов для pgBouncer (работает как пользователь postgres) составляет не более 1024 открытых файлов:

$ ps -e | fgrep pgbouncer
 9840 ?        00:00:00 pgbouncer
$ fgrep files /proc/9840/limits
Limit                     Soft Limit           Hard Limit           Units
Max open files            1024                 4096                 files
$

Я попытался поднять лимит, вставив ulimit -S -n 5000 в /etc/default/pgbouncer (читается сценарием запуска / остановки в /etc/init.d), но это не сработало. Потом я попробовал nofile установка в /etc/security/limits.conf и убедился, что он включен в PAM, но безрезультатно.

Итак, где именно находится start-stop-daemon понизить nofile предел для процессов демона? Я наткнулся на это старый отчет об ошибке для Debian, но похоже, что патч никогда не применялся.

Кстати: есть fs.file-max действительно замена бывшей системы nofiles (обратите внимание на множественное число) переменную ядра, как это предлагается во многих статьях блогов, касающихся настройки? Заставляет меня задуматься, что это в fs раздел параметров. В моей системе IRIX это называется rlimit_no_files_max в разделе ресурсов, что для меня имеет гораздо больше смысла, чем помещать его в fs раздел..

Что я здесь делаю не так? Где лучше всего изменить этот параметр для демонов в Debian 8.1?

Заранее спасибо,

Стефан

Вы можете использовать "ulimit" в разделе "start" сценария инициализации pgbouncer:

/etc/init.d/pgbouncer:

    [... snip ...]
    case "$1" in
      start)
        # Check if we are still disabled in /etc/default/pgbouncer
        [ "${START:-}" = "0" ] && exit 0
        log_daemon_msg "Starting PgBouncer" $NAME
        test -d $PIDDIR || install -d -o postgres -g postgres -m 2775 $PIDDIR

        ### set whatever limits you want ###
        ulimit -n 20000

        $SSD --start --chuid $RUNASUSER --oknodo -- $OPTS 2> /dev/null
        log_end_msg $?
        ;;
    [... snip ...]

После добавления этой строки эффекты должны иметь место после перезапуска:

Сделайте это, иначе на вас накричат:

# systemctl daemon-reload

Затем:

# /etc/init.d/pgbouncer restart

ОБНОВИТЬ:

Мой первоначальный ответ, который показал, что вы можете добавить «ulimit» в сценарий инициализации, работает в Debian 8. Несмотря на то, что Deb8 является дистрибутивом systemd, похоже, что при установке по умолчанию pgbouncer по-прежнему используется сценарий инициализации.

Для Centos7, который полностью управляет pgbouncer с помощью systemd, вы хотите использовать файл systemd.service.

Во-первых, похоже, есть ошибка в служебном файле по умолчанию для pgbouncer на Centos7, где вам нужно, чтобы «Type = forked» был «Type = simple».

В файле pgbouncer.service вы также можете добавить «LimitNOFILE = ##» в раздел [Service] ... таким образом

/etc/systemd/system/pgbouncer.service

    ## good practice to include the default service file as it may change with future updates
    .include /lib/systemd/system/pgbouncer.service

    ## change the Type= per this bug
    ## http://www.postgresql.org/message-id/554A7105.1050002@gmx.net
    Type=simple

    ## Add a service section and set the max number of open files
    [Service]
    LimitNOFILE=12345

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

/var/log/postgresql/pgbouncer.log

ERROR S: login failed: FATAL: could not open relation mapping file (...): Too many open files in system
ERROR S: login failed: FATAL: could not open file (...): Too many open files in system
ERROR S: login failed: FATAL: pipe() failed: Too many open files in system
WARNING sbuf_connect failed: Too many open files in system

/var/log/postgresql/postgresql-9.4-main.log

LOG:  out of file descriptors: Too many open files in system; release and retry
PANIC:  could not open file (...): Too many open files in system
LOG:  server process (...) was terminated by signal 6: Aborted
DETAIL:  Failed process was running: END;
LOG:  terminating any other active server processes

Нам не нужно беспокоиться о доступных FD для pgbench, потому что, если их недостаточно, pgbench не запустится:

$ ulimit -S -n 100
$ pgbench -h 192.168.122.69 -p 6432 -U postgres -d booktown -c 200 -t 10000
You need at least 202 open files but you are only allowed to use 100.
Use limit/ulimit to increase the limit before using pgbench.

Можете добавить ulimit -n 20000 в файл /etc/default/pgbouncer для увеличения мягкого лимита.

echo "ulimit -n 20000" >> /etc/default/pgbouncer
systemctl restart pgbouncer

Это применимо для debian-10 (buster) и PgBouncer 1.12.0