MySQL如何管理客戶端的鏈接?

MySQL如何管理客戶端的鏈接?

MySQL能夠監聽不一樣接口的客戶端鏈接,並經過一個鏈接管理線程控制全部的客戶端鏈接。html

在Unix平臺上,鏈接管理線程能夠控制來自Unix socket文件的請求。在Windows平臺上能夠控制來自shared memory鏈接請求和named-pipe鏈接請求。除此以外、MySQL支持來自全部平臺的TCP/IP鏈接請求,從MySQL8.0開始,額外增長了一個經過TCP/IP接收的管理專用鏈接請求。mysql

MySQL管理客戶端的鏈接方式有兩種:sql

1、鏈接管理線程爲每一個客戶端的鏈接分配一個專用線程,用來進行認證及處理每一個鏈接的請求。在這種方式裏管理線程會使用到線程緩存,當監聽到一個客戶端的鏈接,管理線程會先在線程緩存裏面進行查找,確認裏面是否包含能夠用於鏈接的線程,若是不存在,則會建立一個新線程。鏈接結束時,若是緩存未滿,會將線程返回給線程緩存。緩存

在這種鏈接方式下,若是服務器須要控制大量的鏈接,會爲服務器帶來不斷建立和處理線程的開銷,大量的線程會影響到服務器和內核的資源,例如棧空間等。爲了保持大量的併發鏈接,每一個線程使用的棧空間儘量保持較小,這樣就會致使棧空間過小,或服務器消耗大量的內存。與此同時,其它的資源也有可能耗盡,調度開銷也會很是大。服務器

能夠經過MySQL的系統變量和狀態變量對服務器的管理鏈接線程進行控制和監測。併發

thread_cache_size:用來決定線程緩存的大小,若是將其配置爲0,不使用緩存,將會爲每一個鏈接建立一個線程,並在鏈接結束時終止該線程。設置爲其它數值時,意味着將會緩存該數值的線程。socket

thread_stack :控制着SQL語句的複雜度,存儲過程的遞歸深度以及其它消耗內存的各類行爲。根據須要爲每一個線程設置相應字節的棧大小。ide

Threads_cached和Threads_created :能夠經過這兩個狀態變量來監控線程是否來自緩存。性能

max_connections:控制着最大鏈接數,MySQL8.0以後,服務器容許的最大鏈接數爲該變量值+1,額外的一個鏈接是管理帳戶專用,須要帳戶具備CONNECTION_ADMIN 權限,或者SUPER 權限。在8.0.19版本以前,用於羣組複製的內部鏈接會計算在該數值以內,8.0.19以後用於羣組複製的鏈接將分開計算。操作系統

客戶端最大鏈接數受到下面幾個因素的影響:

  • 操做系統線程庫的質量。

  • 有效內存大小。

  • 每一個鏈接使用的內存大小。

  • 每一個鏈接的工做負載。

  • 指望的應答時間。

  • 有效的文件描述符數量(open_files_limit的值及操做系統的限制)。

Linux和Solaris客戶支持500~1000的併發鏈接,若是使用了大量的內存,而且對應答時間要求不高,也可使用超過10000的併發鏈接。

2、線程池方式,該方式須要使用線程池插件,這個插件包含在MySQL企業版裏面,這個插件用於改善鏈接性能。關於其詳細內容,將會在另一篇裏介紹,同時您也能夠訪問「https://dev.mysql.com/doc/refman/8.0/en/thread-pool.html」 進行閱讀。

相關文章
相關標籤/搜索