Mysql
數據庫連接限制是否應該等於連接的程序數?
我注意到 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
如您所見,它並不算多,因此如果您不需要此類優化,則可以使用預設限制。