2010年4月28日

[pgsql-jp: 40256]同時接続数を増やすとサービス停止

はじめまして。石嶋と申します。
PostgreSQLは初心者です。よろしくお願いします。

PostgreSQLの同時接続数を300に増やす必要があり、postgresql.conf
の内容をすこし変更して試したのですがうまくいきませんでした。
よくよく調べたところ、Windowsのレジストリを変更することで問題を
回避できるように見えるのですが、本当にこの方法が正しいのか迷って
います。

他にもっと良い解決方法がありましたら、アドバイスを頂けたらと思い
ます。

1. 環境
WindowsXP Professional SP3
PostgreSQL 8.4.3 (Windows版インストーラでインストール)
Npgsql 2.0.8 (VisualBasic2005でNpgsqlを使用しています)
メモリ 2GB

2. postgresql.conf の内容について
max_connections を 100 から 300 に変更しています。
shared_buffers は 32MB のまま。試しに 64MB にしても同じ症状で
した。
これ以外は変更していません。

3. 症状
PostgreSQLへの接続を繰り返すプログラム(A)を実行したところ、
150回までは正常に接続し、151回目で例外(B)が発生しました。
この時点でpostgresqlのサービスが停止しており、
PostgreSQL\8.4\data\pg_log\ フォルダのファイルに(C)の内容が残っ
ていました。
postgresqlのサービスを起動しなおして同じことを試すと同じ症状に
なります。

4. 当方で発見した回避方法
レジストリエディタ(regedt32.exeなど)で
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\
Session Manager\SubSystems\Windows の、
SharedSection=1024,3072,512 の部分を
SharedSection=1024,3072,1024 に
書き換えて、Windowsを再起動。
再起動後、プログラム(A)を実行すると300個の接続が成功します。

---プログラムの内容(A) ここから---
Private Sub Hoge()
Dim connections As New System.Collections.Generic.List(Of
Npgsql.NpgsqlConnection)
Dim connectionString As String = "Server=hoge;Port=5432;UserId=fuga;
Password=piyo;Database=postgres;Pooling=true;MaxPoolSize=300"

'300個のPostgreSQLサーバへの接続を用意する
For i As Integer = 1 To 300
Dim conn As New Npgsql.NpgsqlConnection(connectionString)
Try
conn.Open()
Catch ex As Exception
Dim errorMessage As String = i.ToString() + "回目の
接続に失敗" + Environment.NewLine + ex.ToString()
MessageBox.Show(errorMessage)
Exit For
End Try

connections.Add(conn)
Next

'接続を閉じる
For i As Integer = 0 To connections.Count - 1
connections(i).Close()
Next
End Sub
---プログラムの内容(A) ここまで---

---プログラムで起きる例外(B) ここから---
System.IO.IOException: 転送接続からデータを読み取れません: 既存の接続はリ
モート ホストに強制的に切断されました。。 --->
System.Net.Sockets.SocketException: 既存の接続はリモート ホストに強制的に切
断されました。
場所 System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32
size, SocketFlags socketFlags)
場所 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset,
Int32 size)
--- 内部例外スタック トレースの終わり ---
場所 System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset,
Int32 size)
場所 System.IO.BufferedStream.ReadByte()
場所 Npgsql.NpgsqlState.<ProcessBackendResponses_Ver_3>d__a.MoveNext() 場
所 C:\projects\Npgsql2\src\Npgsql\NpgsqlState.cs:行 665
場所 Npgsql.NpgsqlState.IterateThroughAllResponses(IEnumerable`1 ienum)
場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlState.cs:行 319
場所 Npgsql.NpgsqlState.ProcessBackendResponses(NpgsqlConnector context)
場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlState.cs:行 314
場所 Npgsql.NpgsqlConnectedState.Startup(NpgsqlConnector context) 場所 C:
\projects\Npgsql2\src\Npgsql\NpgsqlConnectedState.cs:行 52
場所 Npgsql.NpgsqlConnector.Open() 場所
C:\projects\Npgsql2\src\Npgsql\NpgsqlConnector.cs:行 648
場所 Npgsql.NpgsqlConnectorPool.GetPooledConnector(NpgsqlConnection
Connection) 場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlConnectorPool.cs:行
423
場所
Npgsql.NpgsqlConnectorPool.RequestPooledConnectorInternal(NpgsqlConnection
Connection) 場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlConnectorPool.cs:行
226
場所 Npgsql.NpgsqlConnectorPool.RequestPooledConnector(NpgsqlConnection
Connection) 場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlConnectorPool.cs:行
178
場所 Npgsql.NpgsqlConnectorPool.RequestConnector(NpgsqlConnection
Connection) 場所 C:\projects\Npgsql2\src\Npgsql\NpgsqlConnectorPool.cs:行
158
場所 Npgsql.NpgsqlConnection.Open() 場所
C:\projects\Npgsql2\src\Npgsql\NpgsqlConnection.cs:行 543
場所 ConnTest.frmConnTest.Hoge() 場所
D:\zzz\ConnTest\ConnTest\frmConnTest.vb:行 17
---プログラムで起きる例外(B) ここまで---

---ログの内容(C) ここから---
2010-04-28 16:04:03 JST LOG: サーバプロセス (PID 4196)は例外C0000142で終了
しました
2010-04-28 16:04:03 JST ヒント: 16進値の説明についてはC インクルードファイ
ル"ntstatus.h"を参照してください。
---ログの内容(C) ここまで---

以上です。どうぞよろしくお願いします。


投稿者 xml-rpc : 2010年4月28日 19:04
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/95491
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。