You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何提升pgbench客户端数量上限?解决“invalid number of clients”报错

解决pgbench客户端数量上限的问题

嘿,这个问题我之前帮好几个开发者解决过——你遇到的invalid number of clients: "10000"错误,根源是pgbench本身有默认的客户端数量硬限制,再加上系统和PostgreSQL的资源配额卡着。咱们一步步来搞定:

1. 突破pgbench自身的客户端上限(重新编译)

pgbench源码里默认把最大客户端数设为了1024(定义在MAX_CLIENTS常量里),要支持10000级别的客户端,得先修改这个值再重新编译:

  • 找到对应版本的PostgreSQL源码包(如果没存,直接从官方源码仓库拉取即可)
  • 进入源码目录下的src/bin/pgbench文件夹
  • 打开pgbench.c文件,找到类似这样的代码行:
    #define MAX_CLIENTS 1024
    
    把数值改成你需要的大小,比如#define MAX_CLIENTS 10000(建议设得比目标值大一点,留些余量)
  • 回到源码根目录,执行make完成编译,再用make install(需要sudo权限)安装新的pgbench

2. 调整系统级文件描述符限制

每个pgbench客户端都会占用一个文件描述符,系统默认的配额肯定不够支撑10000个连接,得先调整这个:

临时生效(当前会话)

在运行pgbench的终端里执行:

ulimit -n 65535

把当前会话的最大文件描述符数拉到65535,足够覆盖10000个客户端的需求。

永久生效(重启后依然有效)

  • 编辑/etc/security/limits.conf,添加或修改以下两行(如果用root跑pgbench就把postgres换成root):
    postgres soft nofile 65535
    postgres hard nofile 65535
    
  • 检查/etc/pam.d/common-session里是否有这一行,没有就加上:
    session required pam_limits.so
    
  • 重启系统或者重新登录用户,让配置生效

3. 调整PostgreSQL的连接参数

就算pgbench能发起请求,PostgreSQL本身的最大连接数不够也会拒绝,所以得同步调整数据库配置:

  • 找到PostgreSQL的配置文件postgresql.conf(通常在/var/lib/postgresql/<版本>/main/或者源码编译的data目录下)
  • 修改以下核心参数:
    max_connections = 10000  # 至少要大于等于你要测试的客户端数量
    shared_buffers = 8GB     # 建议设为服务器内存的1/4,根据实际硬件调整
    work_mem = 4MB           # 每个连接的工作内存,避免大量连接耗尽内存
    
  • 重启PostgreSQL服务让配置生效:
    sudo systemctl restart postgresql
    

4. 额外优化(可选但建议)

10000个客户端会消耗大量系统资源,建议再调整下内核参数避免网络队列阻塞:

  • 临时设置:
    sysctl -w net.core.somaxconn=65535
    
  • 永久设置:编辑/etc/sysctl.conf,添加net.core.somaxconn=65535,然后执行sysctl -p生效

验证配置

完成以上步骤后,重新运行你的测试命令:

pgbench -t 1000 -c 10000 -S pgbench_test -C -n -p 5433

应该就能正常执行了。

注意

10000个客户端会吃掉大量CPU、内存和网络带宽,确保你的服务器硬件能扛得住(比如至少32GB以上内存、多核心CPU),否则测试过程中可能出现卡顿甚至崩溃。

内容的提问来源于stack exchange,提问作者Eng.Bassel

火山引擎 最新活动