7

私は(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の設定が足りないのではないかと思います。

ありがとう


編集クライアントが数秒間接続をブロックされていることがわかりましたが、他のクライアントは引き続きデータベースにアクセスできます。それは、同じクライアントが短時間にあまりにも多くのトランザクションを送信できないことを意味しますか?

4

4 に答える 4

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が表示されません。したがって、私はそれを見逃しました。次のコマンドでTCPwait_timeを調整した後、pgbenchは正しく機能します。

$ sudo sysctl -w net.inet.tcp.msl=1500
net.inet.tcp.msl: 15000 -> 1500

助けてくれてありがとう。

于 2012-11-30T03:25:59.067 に答える
1

実際、OSによって課される最大接続数には制限があります。ドキュメントのmax-connectionsを読んでください:(太字の関連部分)

データベースサーバーへの同時接続の最大数を決定します。デフォルトは通常100接続ですが、カーネル設定でサポートされていない場合(initdbで決定)はこれより少なくなる可能性があります。このパラメータは、サーバーの起動時にのみ設定できます。

このパラメーターを増やすと、PostgreSQLがオペレーティングシステムのデフォルト構成で許可されているよりも多くのSystemV共有メモリまたはセマフォを要求する可能性があります。必要に応じて、これらのパラメータを調整する方法については、セクション17.4.1を参照してください。

16381接続しか開くことができないことは、2 ^ 14(= 16384)の可能な最大接続からスーパーユーザー接続用にデフォルトで予約されている3接続を引いたものがあることで説明できます(ドキュメントを参照)。

于 2012-11-29T08:40:55.197 に答える
0

16381が2の累乗に非常に近いのは興味深いことです。

これは主に推測です:

OSのことなのかしら。TPSの数値を見ると、トランザクションごとに新しい接続が作成されていますか?[はい、あなたの質問を正しく読んだので、編集してください。]

おそらく、OSには使用できる接続リソースが非常に多く、最近16381(およびいくつかの追加の接続)を作成した後、すぐに新しい接続を作成することはできませんか?

使用可能にする接続リソースの数を指定するためのOS設定がある場合があります。これにより、より多くの接続を使用できるようになります。質問にOSの詳細を追加できますか?


特に、接続元のポート番号が常に増えていて、制限に達しているのではないかと思います。「lsof-i」を試して、接続をそのままキャッチできるかどうかを確認し、数が増えているかどうかを確認してください。

于 2012-11-28T03:27:05.637 に答える
0

/etc/sysctl.confに設定して解決しました:

net.ipv4.ip_local_port_range = 32768 65000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
于 2015-08-24T09:54:22.223 に答える