如何提高在 Debian Jessie 上运行的守护进程的最大文件描述符数量?

如何提高在 Debian Jessie 上运行的守护进程的最大文件描述符数量?

我正在玩保镖作为 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-daemonnofile我偶然发现了这个旧错误报告适用于 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

相关内容