我正在使用(PostgreSQL)9.2.1并使用pgbench测试数据库。
pgbench -h 192.168.39.38 -p 5433 -t 1000 -c 40 -j 8 -C -U admin testdb
当我使用-C参数(为每个事务建立新连接)时,事务总是在第16381个事务之后丢失。
Connection to database "testdb" failed
could not connect to server: Can't assign requested address
Is the server running on host "192.168.39.38" and accepting
TCP/IP connections on port 5433?
Client 19 aborted in establishing connection.
Connection to database "testdb" failed
could not connect to server: Can't assign requested address
Is the server running on host "192.168.39.38" and accepting
TCP/IP connections on port 5433?
Client 19 aborted in establishing connection.
....
transaction type: TPC-B (sort of)
scaling factor: 30
query mode: simple
number of clients: 40
number of threads: 8
number of transactions per client: 1000
number of transactions actually processed: 16381/40000
tps = 1665.221801 (including connections establishing)
tps = 9487.779510 (excluding connections establishing)
每次测试中实际处理的交易次数始终为 16381 。 但是,pgbench可以成功,并且在
的情况下处理所有事务-C未使用
或
总交易量小于16381
删除这些事务后,数据库可以在几秒钟内继续接受连接。 我想知道我是否错过了PostgreSQL的一些配置。
由于
编辑我发现客户端被阻止连接几秒钟,但其他人仍然可以访问数据库。这是否意味着同一个客户端不能在短时间内发送太多交易?
答案 0 :(得分:4)
我找到了大约16000次交易后丢失连接的原因。 TCP wait_time承担了这个错误的责任。以下命令将显示TCP连接的状态:
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
尽管如此,它并没有在MAC OS X中显示TIME_WAIT。因此我错过了它。通过以下命令调整TCP wait_time后,pgbench正常工作。
$ sudo sysctl -w net.inet.tcp.msl=1500
net.inet.tcp.msl: 15000 -> 1500
感谢您的帮助。
答案 1 :(得分:1)
操作系统确实存在最大连接限制。阅读文档中的max-connections :(粗体相关部分)
确定与数据库服务器的最大并发连接数。 默认值通常为100个连接,但如果您的内核设置不支持它(在initdb期间确定),则可能会更少。此参数只能在服务器启动时设置。
增加此参数可能会导致PostgreSQL请求比操作系统的默认配置允许的更多System V共享内存或信号量。 如有必要,请参阅第17.4.1节,了解如何调整这些参数。
您只能打开16381个连接,可以通过2 ^ 14(= 16384)个可能的最大连接减去默认为超级用户连接保留的3个连接来解释(参见文档)。
答案 2 :(得分:0)
有趣的是,16381非常接近2的幂。
这主要是猜测:
我想知道这是否是操作系统的事情。查看TPS数据,是否为每笔交易创建了一个新连接? [编辑是的,现在我正确地读了你的问题。]
也许操作系统只有很多可以使用的连接资源,并且在最近过去制作了16381(加上一些额外的连接)后无法立即创建新的连接?
可能存在用于指定要使用的连接资源的数量的OS设置,这可以允许使用更多连接。你能在问题中添加一些操作系统细节吗?
特别是我怀疑你连接的端口号一直在增加而且你达到了极限。尝试“lsof -i”,看看你是否可以抓住连接,看看数字是否正在上升。
答案 3 :(得分:0)
我设置为/etc/sysctl.conf:
net.ipv4.ip_local_port_range = 32768 65000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10