我正在玩保镖作为 PostgreSQL 的连接池系统。我的系统是 12 核,具有 64GB RAM 和 1Gbps 网络接口,运行 Debian 8.1。现在我想将开放套接字连接的限制提高到 10,000 个并发客户端。在进行 DB 基准测试时,该pgbench
实用程序在大约 950 个并发客户端时阻塞,这似乎达到了 1024 个开放 fd 的限制,就像过去一样。我检查了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
显示,保镖(以用户身份运行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 中,更改守护进程的此参数的正确位置在哪里?
提前致谢,
斯蒂芬
答案1
您可以在 pgbouncer 初始化脚本的“start”部分使用“ulimit”:
/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
更新:
我最初的回答表明,您可以在 init 脚本中添加“ulimit”,这在 Debian 8 上有效。尽管 Deb8 是一个 systemd 发行版,但 pgbouncer 的默认安装似乎仍然使用 init 脚本。
对于 Centos7,它完全使用 systemd 管理 pgbouncer,您需要使用 systemd.service 文件。
首先,Centos7 上 pgbouncer 的默认服务文件中似乎存在一个错误,您需要将“Type=forked”改为“Type=simple”。
在 pgbouncer.service 文件中,您还可以在 [Service] 部分添加“LimitNOFILE=##”...因此
/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
可能值得验证的是,打开文件的最大数量是瓶颈。您可以检查日志,本质上是“打开文件太多”错误消息。每次我超出允许打开文件的最大数量时,进程都会抱怨...
/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
我们不需要担心 pgbench 的可用 FD,因为如果不够的话,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.
答案2
您可以添加ulimit -n 20000
到文件/etc/default/pgbouncer
来增加软限制。
echo "ulimit -n 20000" >> /etc/default/pgbouncer
systemctl restart pgbouncer
这适用于 debian-10 (buster) 和 PgBouncer 1.12.0