Я играю с 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