Mysql

數據庫連接限制是否應該等於連接的程序數?

  • May 30, 2011

我注意到 PostgreSQL 和 MySQL 預設有 100 個客戶端連接限制。我想知道我是否應該拒絕這個,因為網路伺服器在同一個盒子上,而且我只有大約 20 個需要連接的 PHP 程序。

此設置是否應該匹配或超過將嘗試連接的程序數?

在 PostgreSQL(我不知道 MySQL)中有max_connections屬性定義為:

確定與數據庫伺服器的最大並發連接數。預設值通常為 100 個連接,但如果您的核心設置不支持它可能會更少(在 initdb 期間確定)。此參數只能在伺服器啟動時設置。

增加此參數可能會導致 PostgreSQL 請求的 System V 共享記憶體或信號量超過作業系統預設配置所允許的數量。如有必要,請參閱第 17.4.1 節了解有關如何調整這些參數的資訊。

客戶端連接的有效限制定義為:

max_connections - superuser_reserved_connections

superuser_reserved_connections的預設值為3。

你需要採取一些透視圖。今天假設 40 max_connections 對您來說是安全的,並且它可以保持一些作業系統資源免費(如文件中所述的信號量和共享記憶體),但明天可能還不夠:

psql: FATAL:  sorry, too many clients already

讓我們計算一下您獲得的利潤:

minSemaphoresSets = ceil((max_connections + autovacuum_max_workers)/16)

autovacuum_max_workers的預設值為3,因此:

prevSets = ceil((100 + 3)/16) = 7
newSets = ceil((40 + 3)/16) = 3

每個(Postgres)集合總是有 17 個信號量,所以你有 68 個信號量安全:

ipcs -s | grep postgres
0x0052e2c1 589824     postgres  600        17        
0x0052e2c2 622593     postgres  600        17        
0x0052e2c3 655362     postgres  600        17        
0x0052e2c4 688131     postgres  600        17        
0x0052e2c5 720900     postgres  600        17        
0x0052e2c6 753669     postgres  600        17        
0x0052e2c7 786438     postgres  600        17
# changing max_connections from 100 to 40
pg_ctlcluster 8.3 main restart
ipcs -s | grep postgres
0x0052e2c1 819200     postgres  600        17        
0x0052e2c2 851969     postgres  600        17        
0x0052e2c3 884738     postgres  600        17

對於共享記憶體,它約為 1 MiB(有關詳細資訊,請參見表 17-2 ):

ipcs -m | grep postgres
0x0052e2c1 0          postgres  600        29368320   4
# changing max_connections from 100 to 40
pg_ctlcluster 8.3 main restart
ipcs -m | grep postgres
0x0052e2c1 425984     postgres  600        28270592   4

如您所見,它並不算多,因此如果您不需要此類優化,則可以使用預設限制。

引用自:https://serverfault.com/questions/275287