- 論壇徽章:
- 0
|
Linux 下 Mysql 數(shù)據(jù)庫性能調(diào)優(yōu)技巧
時間:2009-09-03 09:48來源:網(wǎng)絡收集 作者:佚名 點擊:
133 次
技術(shù)論壇
硬件準備環(huán)境: 硬盤: 16塊 SAS 15K RAID5 帶512MCache CPU: AMD 4核兩顆 內(nèi)存: 16G 軟件環(huán)境: 操作系統(tǒng): RedHat AS4.6 2.6.9-67.ELsmp Mysql: 5.0 下面分別根據(jù)不同場景進行性能調(diào)優(yōu): 使用場景A: 寫操作(插入/查詢/刪除)密集,而且數(shù)據(jù)容量遠遠超
硬件準備環(huán)境:
硬盤: 16塊 SAS 15K RAID5 帶512MCache
CPU: AMD 4核兩顆
內(nèi)存: 16G
軟件環(huán)境:
操作系統(tǒng): RedHat AS4.6 2.6.9-67.ELsmp
Mysql: 5.0
下面分別根據(jù)不同場景進行性能調(diào)優(yōu):
使用場景A:
寫操作(插入/查詢/刪除)密集,而且數(shù)據(jù)容量遠遠超過內(nèi)存的大。ㄗ钚∈200G以上,甚至更大到1.5T以上), 每秒需要以千為單位的事務操作
數(shù)據(jù)可靠性要求不高,允許丟幾條記錄(硬件出故障時)
優(yōu)化方式:
在這種情況下,數(shù)據(jù)庫的Cache基本上命中率是非常低的,對數(shù)據(jù)庫的操作基本上就是對磁盤進行操作, 因此側(cè)重點應該是對磁盤相關優(yōu)化。
首先是考慮數(shù)據(jù)庫存儲引擎,由于涉及插入/刪除/查詢等操作,而且要支持事務,因此考慮使用InnoDB存儲引擎,不考慮MyIsam原因是該存儲引擎是表級鎖,有數(shù)據(jù)刪除時會非常慢。
設置合適的Mysql 參數(shù),由于有16G內(nèi)存,因此參數(shù)設置如下
innodb_buffer_pool_size=8G
innodb_additional_mem_pool_size = 800M,
innodb_log_buffer_size = 4M
innodb_log_file_size = 500M
innodb_log_files_in_group = 4
log-bin
因為使用主備復制,因此需要打開Log-Bin,這里就涉及一個sync-bin的概念,缺省情況下,sync-bin 在mysql中是關閉的,但存在一個風險,因為寫日志沒有刷新到硬盤中去的話,日志是寫在操作系統(tǒng)的文件系統(tǒng)里的Cache中,這樣若機器斷電,那么日志信息將部分丟失。為了減少數(shù)據(jù)丟失,我們測試了sync-bin=1,sync-bin=5和sync-bin=20,三種情況,sync-bin=1的情況下,丟失數(shù)據(jù)最壞概率是丟一個事務的數(shù)據(jù),但性能非常差;設置sync-bin=5的情況下,性能可以提高1倍左右;設置sync-bin=20時,性能比sync-bin=5又可以提高1倍,設置大于20的值,基本上相差不大,性能提高不了多少,最壞20個事務數(shù)據(jù)丟失是在我們的允許范圍之內(nèi),因此設置20是個合理的值,這個值具體取決于你的系統(tǒng)能夠最壞允許丟少的事務數(shù)據(jù)。
若你的系統(tǒng)對數(shù)據(jù)丟失不于考慮,可以關閉sync-bin,這時數(shù)據(jù)刷新到硬盤完全取決于操作系統(tǒng)的配置,相關的配置參數(shù)有如下:
/proc/sys/vm/dirty_ratio
這 個參數(shù)控制一個進程在文件系統(tǒng)中的文件系統(tǒng)寫緩沖區(qū)的大小,單位是百分比,表示系統(tǒng)內(nèi)存的百分比,表示當一個進程中寫緩沖使用到系統(tǒng)內(nèi)存多少的時候,再有 磁盤寫操作時開始向磁盤寫出數(shù)據(jù)。增大之會使用更多系統(tǒng)內(nèi)存用于磁盤寫緩沖,也可以極大提高系統(tǒng)的寫性能。但是,當你需要持續(xù)、恒定的寫入場合時,應該降 低其數(shù)值,一般缺省是 40。更新方法
echo 30 >/proc/sys/vm/dirty_ratio (或則修改/etc/sysctl.conf文件,增加sys.vm.dirty_ratio=30 重起機器)
/proc/sys/vm/dirty_background_ratio
這個參數(shù)控制文件系統(tǒng)的pdflush進程,在何時刷新磁盤。單位是百分比,表示系統(tǒng)總內(nèi)存的百分比,意思是當磁盤的臟數(shù)據(jù)緩沖到系統(tǒng)內(nèi)存多少的時候,pdflush開始把臟數(shù)據(jù)刷新到磁盤。增大會使用更多系統(tǒng)內(nèi)存用于磁盤寫緩沖,也可以極大提高系統(tǒng)的寫性能。但是,當你需要持續(xù)、恒定的寫入場合時,應該降低其數(shù)值,一般缺省是10。
/proc/sys/vm/dirty_writeback_centisecs
Pdflush寫后臺進程每隔多久被喚醒并執(zhí)行把臟數(shù)據(jù)寫出到硬盤。單位是 1/100 秒。缺省數(shù)值是500,也就是 5 秒。如果你的系統(tǒng)是持續(xù)地寫入動作,那么實際上還是降低這個數(shù)值比較好,這樣可以把尖峰的寫操作削平成多次寫操作。設置方法如下:
echo 200 >/proc/sys/vm/dirty_writeback_centisecs
/proc/sys/vm/dirty_expire_centisecs
這個參數(shù)聲明Linux內(nèi)核寫緩沖區(qū)里面的臟數(shù)據(jù)多“舊”了之后,pdflush進程就開始考慮寫到磁盤中去。單位是 1/100秒。缺省是 30000,也就是 30 秒的數(shù)據(jù)就算舊了,將會刷新磁盤。對于特別重載的寫操作來說,這個值適當縮小也是好的,但也不能縮小太多,因為縮小太多也會導致IO提高太快。建議設置為 1500,也就是15秒算舊。
echo 1500 >/proc/sys/vm/ dirty_expire_centisecs
因此若沒有調(diào)整這些參數(shù),全部以缺省值,而且關閉sync-bin的話,那么最多丟失的數(shù)據(jù)是:
5秒種(dirty_writeback_centisecs)之內(nèi)的,小于1.6G的數(shù)據(jù)(dirty_background_ratio,16G/10=1.6G)
當然,實際上5秒之內(nèi)不太可能寫1.6G的數(shù)據(jù),因此最壞就是5秒鐘之內(nèi)的數(shù)據(jù)丟失。因此若要關閉sync-bin,又不想丟失太多數(shù)據(jù)的話,可以通過調(diào)整dirty_writeback_centisecs這個參數(shù),如調(diào)整到200(2秒),這樣最多就丟2秒鐘的數(shù)據(jù)。又可以提高數(shù)據(jù)的寫能力。
Mysql里還有一個參數(shù)可以調(diào)整,提高數(shù)據(jù)庫的寫能力,那就是
innodb_flush_log_at_trx_commit
這個參數(shù)默認是1,即每次事務Commit時,都刷新日志,以免數(shù)據(jù)丟失。因為我們的系統(tǒng)允許丟失少量數(shù)據(jù),因此可以把innodb_flush_log_at_trx_commit設置為2,允許丟失一個事務的數(shù)據(jù),經(jīng)測試,發(fā)現(xiàn)2可以提高25%左右的性能。
另外對于文件系統(tǒng)的mount方式,noatime方式也可以提高部分性能(數(shù)據(jù)庫專用的服務器,一般是noatime)
當數(shù)據(jù)有刪除更新操作后,時間長后一般有碎片,導致索引空間不緊湊,占用更多的硬盤空間,因此會導致查詢編碼,解決辦法是定期執(zhí)行下面的語句:
ALTER TABLE tbl_name ENGINE=INNODB
另外若sql語句中有sort 和group by之類,需要增大sort_buffer_size
這個參數(shù) 是每客戶端連接的,當有sort/group查詢時,會分配sort_buffer_size大小的內(nèi)存,因此若連接很多,則要小心;合適的值可以查看 SHOW GLOBAL STATUS里面Sort_merge_passes的信息以及Created_tmp_tables之類信息
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u3/111930/showart_2185366.html |
|