對于數(shù)據(jù)庫來講大多瓶頸都出現(xiàn)在IO問題上,所以現(xiàn)在SSD類的設(shè)備也才能大行其道。那數(shù)據(jù)庫的IO這塊有什么可以優(yōu)化的嗎? 我這里大致談一下我的看法,希望能達到一個拋磚引玉的效果。
這里談一下數(shù)據(jù)庫本身的配置方面
具體如下:
配置方面對于IO優(yōu)化的原則:盡可能能緩存,減少讀對數(shù)據(jù)庫的隨機IO的請求;同時減少寫的隨機IO的隨時發(fā)生,利用各種buffer去緩存。下面來看一下這塊的參數(shù):
- innodb_buffer_pool_size : 這是Innodb最重要的一個配置參數(shù),這個參數(shù)控制Innodb本身的緩大小,也影響到,多少數(shù)據(jù)能在緩存中。建議該參數(shù)的配置在物理內(nèi)存的70%-80%之間。
- innodb_flush_method: 這個控制Innodb的IO形為,什么:fsync, O_DSYNC之類的,這里不做過多介紹, 建議使用: O_DIRECT, 這樣減少操作系統(tǒng)級別VFS的緩存使用內(nèi)存過多和Innodb本身的buffer的緩存沖突,同時也算是給操作系統(tǒng)減少點壓力。
- innodb_io_capacity: 這個參數(shù)據(jù)控制Innodb checkpoint時的IO能力,一般可以按一塊SAS 15000轉(zhuǎn)的磁盤200個計算,6塊盤的SAS做的Raid10這個值可以配到600即可。如果是普通的SATA一塊盤只能按100算。(innodb-plugin, Percona有這個參數(shù))
- innodb_max_dirty_pages_pct : 這個參數(shù)據(jù)控制臟頁的比例如果是innodb_plugin或是MySQL5.5以上的版本,建議這個參數(shù)可以設(shè)制到75%-90%都行。如果是大量寫入,而且寫入的數(shù)據(jù)不是太活躍,可以考慮把這個值設(shè)的低一點。 如果寫入或是更新的數(shù)據(jù)也就是熱數(shù)據(jù)就可以考慮把這個值設(shè)為:95%
- innodb_log_file_size : 這個可以配置256M以上,建議有兩個以前的日志文件(innodb_log_files_in_group). 如果對系統(tǒng)非常大寫的情況下,也可以考慮用這個參數(shù)提高一下性能,把文件設(shè)的大一點,減少checkpiont的發(fā)生。 最大可以設(shè)制成:innodb_log_files_in_group * innodb_log_file_size < 512G(percona, MySQL 5.6) 建議設(shè)制成: 256M -> innodb_buffer_pool_size/innodb_log_file_in_group 即可。
- innodb_log_buffer_size : 如果沒在大事務(wù),控制在8M-16M即可。
- 其它對IO有影響的參數(shù)(以5.6為準)
- innodb_adaptive_flushing 默認即可
- innodb_change_buffer_max_size 如果是日值類服務(wù),可以考慮把這個增值調(diào)到 50
- innodb_change_buffering 默認即可
- innodb_flush_neighors 默認是開的, 這個一定要開著,充分利用順序IO去寫數(shù)據(jù)。
- innodb_lru_scan_depth: 默認即可 這個參數(shù)比較專業(yè)。
- innodb_max_purge_lag 默認沒啟用,如果寫入和讀取都量大,可以保證讀取優(yōu)先,可以考慮使用這個功能。
- innodb_random_read_ahead 默認沒開啟,屬于一個比較活躍的參數(shù),如果要用一定要多測試一下。 對用passport類應(yīng)用可以考慮使用
- innodb_read_ahead_threshold 默認開啟:56 預(yù)讀機制可以根據(jù)業(yè)務(wù)處理,如果是passprot可以考慮關(guān)閉。如果使用innodb_random_read_ahead,建議關(guān)閉這個功能
- innodb_read_io_threads 默認為:4 可以考慮8
- innodb_write_io_threads 默認為:4 可以考慮8
- sync_binlog 默認即可: 0
- innodb_rollback_segments 默認即可: 128