Você pode usar "ulimit" na seção "start" do script de inicialização do 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 ...]
Com esta linha adicionada, os efeitos devem ocorrer após o reinício:
Faça isso ou receba gritos:
# systemctl daemon-reload
Então:
# /etc/init.d/pgbouncer restart
ATUALIZAÇÃO:
Minha resposta original, que mostrou que você pode adicionar "ulimit" ao script init, funciona no Debian 8. Mesmo que Deb8 seja uma distribuição systemd, parece que a instalação padrão do pgbouncer ainda usa o script init.
Para o Centos7, que gerencia o pgbouncer completamente com o systemd, você quer usar um arquivo systemd.service.
Primeiro, parece haver um bug no arquivo de serviço padrão do pgbouncer no Centos7, onde você precisa ter "Type = forked" como "Type = simple".
No arquivo pgbouncer.service, você também pode adicionar um "LimitNOFILE = ##" na seção [Service] ... assim
/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/[email protected]
Type=simple
## Add a service section and set the max number of open files
[Service]
LimitNOFILE=12345
Pode valer a pena verificar se o número máximo de arquivos abertos é o gargalo. Você pode verificar seus logs para, essencialmente, mensagens de erro "muitos arquivos abertos". Em cada caso em que excedeu o número máximo de arquivos abertos permitidos, o processo reclamou ...
/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
Não precisamos nos preocupar com os FDs disponíveis para o pgbench, porque se eles não forem suficientes, o pgbench não será executado:
$ 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.