本節說明 MySQL 伺服器如何管理用戶端連線的各個方面。
伺服器能夠監聽多個網路介面上的用戶端連線。連線管理執行緒處理伺服器監聽的網路介面上的用戶端連線請求。
在所有平台上,一個管理執行緒處理 TCP/IP 連線請求。
在 Unix 上,同一個管理執行緒也處理 Unix 通訊端檔案連線請求。
在 Windows 上,一個管理執行緒處理共用記憶體連線請求,另一個管理執行緒處理具名管道連線請求。
在所有平台上,可以啟用額外的網路介面來接受管理 TCP/IP 連線請求。此介面可以使用處理「一般」TCP/IP 請求的管理執行緒,或單獨的執行緒。
伺服器不會建立執行緒來處理它不監聽的介面。例如,沒有啟用具名管道連線支援的 Windows 伺服器不會建立執行緒來處理它們。
個別伺服器外掛程式或組件可能會實作它們自己的連線介面。
X 外掛程式允許 MySQL 伺服器使用 X 通訊協定與用戶端通訊。請參閱 第 22.5 節「X 外掛程式」。
連線管理執行緒會將每個用戶端連線與專用於該連線的執行緒相關聯,該執行緒會處理該連線的驗證和請求處理。管理執行緒會在必要時建立新執行緒,但會先查詢執行緒快取以查看其中是否包含可用於連線的執行緒,以盡量避免這樣做。當連線結束時,如果快取未滿,則會將其執行緒返回到執行緒快取。
在此連線執行緒模型中,目前連線的用戶端有多少個,執行緒就有多少個,當伺服器工作負載必須擴展以處理大量連線時,這會有一些缺點。例如,執行緒的建立和處置會變得昂貴。此外,每個執行緒都需要伺服器和核心資源,例如堆疊空間。為了容納大量同時連線,每個執行緒的堆疊大小必須保持較小,導致堆疊空間太小或伺服器消耗大量記憶體的情況。其他資源也可能會耗盡,並且排程負擔會變得很大。
MySQL 企業版包含一個執行緒集區外掛程式,它提供了一個替代的執行緒處理模型,旨在減少負擔並提高效能。它實作一個執行緒集區,透過有效地管理大量用戶端連線的陳述式執行緒來提高伺服器效能。請參閱 第 7.6.3 節「MySQL 企業版執行緒集區」。
為了控制和監視伺服器如何管理處理用戶端連線的執行緒,有幾個系統和狀態變數是相關的。(請參閱第 7.1.8 節「伺服器系統變數」,以及第 7.1.10 節「伺服器狀態變數」。)
系統變數
thread_cache_size
決定了執行緒快取的大小。預設情況下,伺服器會在啟動時自動調整此值,但可以明確設定以覆蓋此預設值。值為 0 會停用快取,這會導致為每個新連線設定一個執行緒,並在連線終止時釋放該執行緒。若要啟用快取N
個非作用中的連線執行緒,請在伺服器啟動時或執行期間將thread_cache_size
設定為N
。當與其關聯的用戶端連線終止時,連線執行緒會變為非作用中。若要監控快取中的執行緒數量以及因無法從快取中取得執行緒而建立的執行緒數量,請檢查
Threads_cached
和Threads_created
狀態變數。當執行緒堆疊太小時,這會限制伺服器可以處理的 SQL 語句的複雜性、預存程序的遞迴深度以及其他耗用記憶體的動作。若要為每個執行緒設定
N
位元組的堆疊大小,請啟動伺服器並將thread_stack
設定為N
。
若要控制伺服器允許同時連線的最大用戶端數量,請在伺服器啟動時或執行期間設定 max_connections
系統變數。如果嘗試同時連線的用戶端數量超出伺服器配置可處理的數量,則可能需要增加 max_connections
(請參閱第 B.3.2.5 節,「連線過多」)。如果伺服器因達到 max_connections
限制而拒絕連線,則會遞增 Connection_errors_max_connections
狀態變數。
mysqld 實際上允許 max_connections
+ 1 個用戶端連線。額外的連線保留給具有 CONNECTION_ADMIN
權限(或已棄用的 SUPER
權限)的帳戶使用。透過將權限授予管理員而不是普通使用者(他們不需要此權限),管理員可以連線到伺服器並使用 SHOW PROCESSLIST
來診斷問題,即使已連線了最大數量的非特權用戶端。請參閱第 15.7.7.30 節,「SHOW PROCESSLIST 語句」。
伺服器還允許在管理網路介面上進行管理連線,您可以使用專用的 IP 位址和埠進行設定。請參閱第 7.1.12.2 節,「管理連線管理」。
Group Replication 外掛程式使用內部會話與 MySQL 伺服器互動,以執行 SQL API 操作。Group Replication 的內部會話與用戶端連線分開處理,因此它們不計入 max_connections
限制,並且如果伺服器已達到此限制,也不會被拒絕。
MySQL 支援的最大用戶端連線數(也就是說,max_connections
可以設定的最大值)取決於多個因素
給定平台上執行緒程式庫的品質。
可用的 RAM 容量。
每個連線使用的 RAM 容量。
每個連線的工作負載。
期望的回應時間。
可用的檔案描述符數量。
Linux 或 Solaris 應該能夠常規地支援至少 500 到 1000 個同時連線,如果您有多 GB 的可用 RAM,並且每個連線的工作負載很低或回應時間目標不嚴苛,則可以支援多達 10,000 個連線。
增加 max_connections
值會增加 mysqld 需要的檔案描述符數量。如果沒有可用的所需描述符數量,伺服器會減少 max_connections
的值。有關檔案描述符限制的評論,請參閱第 10.4.3.1 節,「MySQL 如何開啟和關閉表格」。
可能需要增加 open_files_limit
系統變數,這可能還需要提高作業系統對 MySQL 可以使用的檔案描述符數量的限制。請查閱您的作業系統文件,以確定是否可以增加限制以及如何增加限制。另請參閱第 B.3.2.16 節,「找不到檔案和類似錯誤」。