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

ishijima ishijima @ sw-network.co.jp
2010年 4月 28日 (水) 19:04:40 JST


はじめまして。石嶋と申します。
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) ここまで---

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



pgsql-jp メーリングリストの案内