MySQL服務器設置&&硬件優化

注:本篇是《高性能Mysql》第三版的讀書筆記

 

優化服務器的設置

優化服務器的配置一般是在schema和索引優化之後進行的。大多數的默認配置已經趨近於最優設置了。

學習創建一個好的配置是從理解MySQL內核和行爲開始   mysql --verbose --help |grep -A 1 'Default options'  查配置文件位置。

默認的配置如果夠用就別亂改。

分爲服務器級別的(全局變量),連接變量(會話作用域) 剩下的一些是對象級的。

對於一些全局變量,你給他分配太大內存,而又不用就麼啥意思了。

例如:對於sort_buffer_size這個排序用的內存設置不應該設置太大,比如40M 每個連接都會使用40M,那麼這個值要是被調大會導致服務器崩掉。

 

目前接觸的MySQL的項目使用的都是innodb存儲引擎。

需要配置合理的緩衝池(buffer pool)和日誌文件(log file)

比較流行的做法是將緩衝池的大小設置爲內存的75%

應該從服務器的內存總量開始計算,減去操作系統佔用和其他進程佔用。減去一下MySQL自身查詢需要的緩存,減去日誌文件的內存,減去MySQL中其他配置的內存佔用,比如query_cache查詢緩存、   一般啓動日誌文件並禁用查詢緩存。

 

InnoDB緩衝池

innodb不僅僅緩存索引,還會緩存行的數據、自適應哈希索引,插入緩衝,鎖、和其他內部數據結構。

如果緩衝池存放了大量數據的時候,重啓預熱也需要很長時間。

innodb_buffer_pool_size設置緩衝池大小。

Innodb_buffer_pool_size = 系統可用內存 - 系統正常運行內存 - (峯值時的連接數 * 每個連接需要的內存)

innodb_log_file_size 日誌文件大小,存儲事務持久話日誌用的,這個設置16M-64M 就差不多了,默認一秒刷到磁盤的話。

 

線程緩存

線程緩存保存那些目前沒有與連接關聯但是準備爲後面新的連接服務的線程。當一個新連接創建的時候,先去線程緩存中取線程。

 

表緩存

表緩存分爲兩部分:打開表的緩存,表定義緩存。表定義被所有連接共享是全局的。

 

innodb數據字典

innodb有自己的表緩存,可以稱爲表定義緩存或者數據字典,當innodb打開一張表,就增加了一個對應的對象到數據字典,每張表可能佔4k或者更多內存,即使關閉也不會移除。

 

 

配置MySQL的IO行爲

innodb的IO配置

innodb使用日誌來減少提交事務時的開銷,因爲日誌中記錄了事務,就無須在每個事務提交時吧緩衝池的髒塊刷新到磁盤中。es跟innodb存儲引擎的事務日誌一樣,寫入到日誌文件,並有線程異步將日誌刷新到數據文件中。只要是寫到日誌文件中的事務,即使斷電也無所謂。

日誌文件是環形方式寫的,當寫到尾部會從頭開始寫,但是不會覆蓋掉還沒有應用到數據文件中的日誌記錄。

日誌文件的存在把隨機IO轉成了順序IO  

 

當innodb變更任何數據時,會寫一條變更記錄到內存日誌緩存區。在緩衝區滿的時候,事務提交的時候,或者每一秒鐘,innodb會刷寫緩衝區的內容到磁盤日誌文件。大事務可以通過增大緩衝區大小來提高IO效率。innodb_log_buffer_size(1-8M)

innodb_flush_log_at_trx_commit 設置日誌提交的頻率程度。

innodb把數據保存在表空間內,本質上是一個由一個或者多個磁盤文件組成的虛擬文件系統。

 innodb使用雙寫緩衝來避免頁沒寫完整所導致的數據損壞。雙寫緩衝是表空間一個特殊的保留區域。當innodb從緩衝池刷新頁面到磁盤時,首先把他們寫到雙寫緩衝,然後再把它們寫到其所屬的數據區域中。

 

Innodb併發配置

innodb_thread_sleep_delay設置一次性可以有多少線程進入內核。 CPU數量*磁盤數*2

innodb_commit_concurrency 變量控制多少個線程可以在同一時間提交。

 

優化BLOB和TEXT的場景

服務器不能在內存臨時表中存儲blob值,只能在磁盤創建blob的臨時表,效率賊低。可以通過substring函數把值轉成varchar

排序blob和text字段時,它只使用前綴,然後忽略剩下部分的值。

 

一些基本配置參數

max_connections 最大連接數, 有一個動態的 max_used_connections狀態變量隨時間的變化。

thread_cache_size設置緩存線程的數量,可以通過thread_cached看有多少線程已經在緩存中了。

table_cache_size表緩存,這個要設置的足夠大,避免總是需要重新打開和重新解析表的定義。

read_only 一般從庫要設置成只讀。

max_allowed_packet 防止服務器發送太大的包,也會控制多大的包可以被接收。

slave_net_timeout 從庫與主庫的連接超時時間設置。

Innodb_buffer_pool_size = 系統可用內存 - 系統正常運行內存 - (峯值時的連接數 * 每個連接需要的內存)

innodb_log_file_size 日誌文件大小,存儲事務持久話日誌用的,這個設置16M-64M 就差不多了,默認一秒刷到磁盤的話。

 

操作系統和硬件優化

影響MySQL性能的硬件中CPU和I/O 資源、

CPU密集型 和 I/O密集型?

CPU密集指的是應用程序花費大量CPU去計算邏輯

I/O密集指的是應用程序 讀寫比較頻繁。

 

緩存層級:CPU寄存器------CPU cache ------主存-------硬盤

 

隨機IO是相當低性能的操作,一般對於熱點數據會緩存到一起,這樣不至於進行隨機IO搜索,避免昂貴的磁盤尋道。

對於內存和磁盤的順序IO都是遠遠快於隨機IO的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章