thread_cache_size 功能在mysql數據庫配置文件中是非常重要的一項功能了,如果對thread_cache_size優化做得好我們可以讓服務器跑得非常快,設置不好就會發現很小訪問量就非常的卡。
MySQL連接除了能通過網絡方式,還可以通過命名管道的方式,不論是哪種方式連接MySQL,在MySQL中都是通過線程的方式管理所有客戶端請求的。每一個客戶端連接都會有一個與之對應的連接線程。
在MySQL中實現了一個Thread Cache池,將空閑的連接線程存放其中,而不是完成請求后就銷毀。這樣當有新的連接請求時,MySQL首先會檢查Thread Cache中是否存在空閑連接線程,如果存在則取出來直接使用,如果沒有空閑連接線程,才創建新的連接線程。
二、線程參數介紹
具體參數:
Thread_cache_size:ThreadCache池中應該存放的連接線程數。
查詢Thread_cache_size的配置:
show variables like "thread_cache_size";
Thread_stack:每個連接線程被創建時,MySQL給它分配的內存大小。當MySQL創建一個新的連接線程時,需要給它分配一定大小的內存堆棧空間,以便存放客戶端的請求的Query及自身的各種狀態和處理信息。
查看連接線程相關的系統變量的設置值:show variables likethread_cache%;如上圖,系統默認連接線程設置thread_cache_size=64,通過分析計算連接線程池最多將緩存約三十個連接線程左右,每個連接線程創建之初,系統分配一定的內存堆棧給這些線程。
查看系統被連接的次數及當前系統中連接線程的狀態值:
show status like connections;
show status like %thread%;
如果我們在MySQL服務器配置文件中設置了thread_cache_size,當客戶端斷開之后,服務器處理此客戶的線程將會緩存起來以響應下一個客戶而不是銷毀(前提是緩存數未達上限)。
Threads_created:表示創建過的線程數,如果發現Threads_created值過大的話,表明MySQL服務器一直在創建線程,這也是比較耗資源,可以適當增加配置文件中thread_cache_size值。
根據官網資料和生產實際環境驗證,如果以上服務器線程緩存thread_cache_size沒有進行設置,或者設置過小,這個值表示可以重新利用保存在緩存中線程的數量,當斷開連接時如果緩存中還有空間,那么客戶端的線程將被放到緩存中,如果線程重新被請求,那么請求將從緩存中讀取,如果緩存中是空的或者是新的請求,那么這個線程將被重新創建,如果有很多新的線程,增加這個值可以改善系統性能,通過比較Connections 和Threads_created 狀態的變量,可以看到這個變量的作用。(“--->?”表示要調整的值) 根據物理內存設置規則如下:
系統啟動到現在共接受到客戶端的連接10246394次,共創建了2766個連接線程,當前有8個連接線程處于和客戶端連接的狀態,而49個連接狀態的線程中只有一個處于active 狀態,即只有一個正在處理客戶端提交的請求,而在ThreadCache池中共緩存了49個連接線程。
Thread Cache 命中率:
Thread_Cache_Hit = (Connections - Threads_created) / Connections *100%;一般在系統穩定運行一段時間后,ThreadCache命中率應該保持在90%左右才算正常。
實際應用:
針對16G/32G的機器,一般設置512K夠用了,當然如果遇到下面的錯誤提示就應該考慮增加這個值。
如果是短連接,適當設置大一點,因為短連接往往需要不停創建,不停銷毀,如果大一點,連接線程都處于取用狀態,不需要重新創建和銷毀,所以對性能肯定是比較大的提升。
對于長連接,不能保證連接的穩定性,所以設置這參數還是有一定必要,可能連接池的問題,會導致連接數據庫的不穩定性,也會出現頻繁的創建和銷毀,但這個情況比較少,如果是長連接,可以設置成小一點,一般在50-100左右。
根據業務側后臺java程序進行數據處理時,thread_stack報錯提示進行分析,并提供解決方法如下。
官方相關thread_stack的信息分析:
The default (192KB) is large enough for normal operation. If thethread stack size is too small, it limits the complexity of the SQLstatements that the server can handle, the recursion depth of storedprocedures, and other memory-consuming actions.
根據官方對該參數的信息分析如下:
Thread Stack默認值(192KB)足夠正常運行。如果線程堆棧大小太小,則會限制服務器可以處理的SQL語句的復雜性,存儲過程的遞歸深度以及其他消耗內存的操作。可以使用showvariables where `variable_name` =“thread_stack”;查詢當前數據庫的默認線程棧的大小,一般情況下都能正常使用,但是當查詢語句或者存儲過程復雜時會報Threadstack overrun(超限)錯誤,此時只要修改增加默認配置就可以了。
解決方法:
在數據庫中修改配置文件my.cnf只有這個文件才能生效,然后重啟服務數據庫。
[mysqld]
thread_stack = 512k
thread_cache_size = 64
重啟數據庫之后:
通過以上處理方式,根據業務側后臺java程序調取數據過程中發生thread_stack報錯,進行調優,然后通知業務側重新開啟java程序數據處理目前一切正常。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/130042.html
摘要:顯示處于不可中斷的休眠的進程數量。我們可以實用內存數據庫,替代他的功能。 MySQL對于很多Linux從業者而言,是一個非常棘手的問題,多數情況都是因為對數據庫出現問題的情況和處理思路不清晰。在進行MySQL的優化之前必須要了解的就是MySQL的查詢過程,很多的查詢優化工作實際上就是遵循一些原則讓MySQL的優化器能夠按照預想的合理方式運行而已。 showImg(https://seg...
摘要:基礎問題的的性能及原理之區別詳解備忘筆記深入理解流水線抽象關鍵字修飾符知識點總結必看篇中的關鍵字解析回調機制解讀抽象類與三大特征時間和時間戳的相互轉換為什么要使用內部類對象鎖和類鎖的區別,,優缺點及比較提高篇八詳解內部類單例模式和 Java基礎問題 String的+的性能及原理 java之yield(),sleep(),wait()區別詳解-備忘筆記 深入理解Java Stream流水...
閱讀 1346·2023-01-11 13:20
閱讀 1684·2023-01-11 13:20
閱讀 1132·2023-01-11 13:20
閱讀 1858·2023-01-11 13:20
閱讀 4100·2023-01-11 13:20
閱讀 2704·2023-01-11 13:20
閱讀 1385·2023-01-11 13:20
閱讀 3597·2023-01-11 13:20