MySQL資料庫最佳化實踐--硬體方面

rainbowbridg發表於2011-12-23
這個介紹了mysql的一下關於硬體方面的一些最佳化,很不錯![@more@]

最近一段時間,我們整理了一些關於Percona,Linux,Flashcache,硬體裝置的最佳化經驗,分享給大家:

硬體

1.開啟BBWC

RAID卡都有寫cache(Battery Backed Write Cache),寫cache對IO效能的提升非常明顯,因為掉電會丟失資料,所以必須由電池提供支援。電池會定期充放電,一般為90天左右,當發現電量低 於某個閥值時,會將寫cache策略從writeback置為writethrough,相當於寫cache會失效,這時如果系統有大量的IO操作,可能 會明顯感覺到IO響應速度變慢。目前,新的RAID卡內建了flash儲存,掉電後會將寫cache的資料寫入flash中,這樣就可以保證資料永不丟 失,但依然需要電池的支援。

解決方案有兩種:1.人工觸發充放電,可以選擇在業務低谷時做,降低對應用的影響;2.設定寫cache策略為force write back,即使電池失效,也保持寫cache策略為writeback,這樣存在掉電後丟失資料的風險。

目前,有一些硬體廠家提供了電容供電的RAID卡,沒有電池充放電的問題,可以聯絡自己的硬體廠商。

2.RAID卡配置

關閉讀cache:RAID卡上的cache容量有限,我們選擇direct方式讀取資料,從而忽略讀cache。

關閉預讀:RAID卡的預讀功能對於隨機IO幾乎沒有任何提升,所以將預讀功能關閉。

關閉磁碟cache:一般情況下,如果使用RAID,系統會預設關閉磁碟的cache,也可以用命令強制關閉。

以上設定都可以透過RAID卡的命令列來完成,比如LSI晶片的RAID卡使用megacli命令。

3.開啟Fastpath功能

Fastpath是LSI的新特性,在RAID控制器為SSD做了了最佳化,使用fastpath特性可以最大程度發揮出SSD的能力。如果使用 SSD做RAID的方式,可以開啟fastpath功能。關於fastpath特性,可以從LSI官網下載資料,並諮詢自己的硬體提供商。

4.Fusionio引數調整

基本上,Fusionio無需做任何調整,下列三個引數可能會提升效能:

options iomemory-vsl use_workqueue=0

對於fusionio裝置,忽略Linux IO排程,相當於使用NOOP。

options iomemory-vsl disable-msi=0

開啟MSI中斷,如果裝置支援,則開啟。

options iomemory-vsl use_large_pcie_rx_buffer=1

開啟Large PCIE buffer,可能會提升效能。

作業系統

1.IO排程演算法

Linux有四種IO排程演算法:CFQ,Deadline,Anticipatory和NOOP,CFQ是預設的IO排程演算法。完全隨機的訪問環境 下,CFQ與Deadline,NOOP效能差異很小,但是一旦有大的連續IO,CFQ可能會造成小IO的響應延時增加,所以資料庫環境建議修改為 deadline演算法,表現更穩定。我們的環境統一使用deadline演算法。

IO排程演算法都是基於磁碟設計,所以減少磁頭移動是最重要的考慮因素之一,但是使用Flash儲存裝置之後,不再需要考慮磁頭移動的問題,可以使用 NOOP演算法。NOOP的含義就是NonOperation,意味著不會做任何的IO最佳化,完全按照請求來FIFO的方式來處理IO。

減少預讀:/sys/block/sdb/queue/read_ahead_kb,預設128,調整為16

增大佇列:/sys/block/sdb/queue/nr_requests,預設128,調整為512

2.NUMA設定

單機單例項,建議關閉NUMA,關閉的方法有三種:1.硬體層,在BIOS中設定關閉;2.OS核心,啟動時設定numa=off;3.可以用numactl命令將記憶體分配策略修改為interleave(交叉),有些硬體可以在BIOS中設定。

單機多例項,請參考:

3.檔案系統設定

我們使用XFS檔案系統,XFS有兩個設定:su(stripe size)和sw(stirpe width),要根據硬體層RAID來設定這兩個引數,比如10塊盤做RAID10,條帶大小為64K,XFS設定為su=64K,sw=10。

xfs mount引數:defaults,rw,noatime,nodiratime,noikeep,nobarrier,allocsize=8M,attr2,largeio,inode64,swalloc

資料庫

1.Flashcache引數

建立flashcache:flashcache_create -b 4k cachedev /dev/sdc /dev/sdb

指定flashcache的block大小與Percona的page大小相同。

Flashcache引數設定:

flashcache.fast_remove = 1:開啟fast remove特性,關閉機器時,無需將cache中的髒塊寫入磁碟。

flashcache.reclaim_policy = 1:髒塊刷出策略,0:FIFO,1:LRU。

flashcache.dirty_thresh_pct = 90:flashcache上每個hash set上的髒塊閥值。

flashcache.cache_all = 1:cache所有內容,可以用黑名單過濾。

flashecache.write_merge = 1:開啟寫入合併,提升寫磁碟的效能。

2.Percona引數

innodb_page_size:如果使用fusionio,4K的效能最好;使用SAS磁碟,設定為8K。如果全表掃描很多,可以設定為16K。比較小的page size,可以提升cache的命中率。

innodb_adaptive_checkpoint:如果使用fusionio,設定為3,提高重新整理頻率到0.1秒;使用SAS磁碟,設定為2,採用estimate方式重新整理髒頁。

innodb_io_capacity:根據IOPS能力設定,使用fuionio可以設定10000以上。

innodb_flush_neighbor_pages = 0:針對fusionio或者SSD,因為隨機IO足夠好,所以關閉此功能。

innodb_flush_method=ALL_O_DIRECT:公版的MySQL只能將資料庫檔案讀寫設定為DirectIO,對於 Percona可以將log和資料檔案設定為direct方式讀寫。但是我不確定這個引數對於 innodb_flush_log_at_trx_commit的影響,

innodb_read_io_threads = 1:設定預讀執行緒設定為1,因為線性預讀的效果並不明顯,所以無需設定更大。

innodb_write_io_threads = 16:設定寫執行緒數量為16,提升寫的能力。

innodb_fast_checksum = 1:開啟Fast checksum特性。

監控

1.fusionio監控:fio-status命令

Media status: Healthy; Reserves: 100.00%, warn at 10.00%

Thresholds: write-reduced: 96.00%, read-only: 94.00%

Lifetime data volumes:

Logical bytes written : 2,664,888,862,208

Logical bytes read : 171,877,629,608,448

Physical bytes written: 27,665,550,363,560

Physical bytes read : 223,382,659,085,448

2.flashcache監控:dmsetup status

read hit percent(99)

write hit percent(51)

dirty write hit percent(44)

ref

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7916042/viewspace-1056935/,如需轉載,請註明出處,否則將追究法律責任。

相關文章