如何提升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




