InnoDB性能調優基礎

本文的原文地址在此:http://www.percona.com/blog/2007/11/01/innodb-performance-optimization-basics/,以下是譯文。

-----------------------------------------------------------這是一條分割線-----------------------------------------------------------

November1, 2007 by Peter Zaitsev

注意:本文的進階知識在這:http://www.mysqlperformanceblog.com/2013/09/20/innodb-performance-optimization-basics-updated/(該文的譯文在此:http://blog.csdn.net/zhu19774279/article/details/38645663)

我對那些來我們這面試的人,總喜歡問些基礎的問題,如:如果你有一臺16G內存的數據庫服務器,用來處理常規的web應用請求,要求數據庫是MySQL,表引擎是InnoDB,且數據量非常大,請問你該如何進行配置。有趣的是,大多數人都給不出什麼有用的意見。所以我決定公佈我想要聽到的答案,包括如何調整硬件、OS、應用程序。

我把這篇文章的題目叫做“InnoDB性能調優基礎”,是因爲本文中的這些配置具有普適性,在多數情況下都能獲得很好的效果。當然啦,如果要最好的性能,還得“具體情況具體分析”。

1. 硬件

如果你的Innodb數據庫要面對非常大的數據量,那麼內存大小是非常重要的因素。今天看來,16G-32G是最有效的值。2顆雙核的CPU已經足夠了,即使是可伸縮問題上,2顆四核的CPU也能夠看到較大負載,儘管這更多的取決於程序。IO是硬件的第三要素:擁有高轉速的直接存儲,以及有電池備份緩存的RAID卡。通常6-8塊硬盤就夠了,當然有時會需要更多。請注意新的2.5″SAS硬盤,他們體積小但是更快。RAID10適用於數據存儲和以讀爲主的情況,如果你還想要一些冗餘,RAID5也可以工作的很好,但要注意隨機寫入RAID5。

(本人對硬件基本不瞭解,因此這一段的翻譯本人一點把握都沒有,希望路過的高人可以幫忙修改。這裏列出原文:If you have large Innodb database size Memory is paramount. 16G-32G is the cost efficient value these days. From CPU standpoint2*Dual Core CPUs seems to do very well, while with even just two Quad Core CPUsscalability issues can be observed on many workloads. Though this depends onthe application a lot. The third is IO Subsystem – directly attached storagewith plenty of spindles and RAID with battery backed up cache is a good bet.Typically you can get 6-8 hard drives in the standard case and often it isenough, while sometimes you may need more. Also note new 2.5″ SAS hard drives. They are tiny but often fasterthan bigger ones. RAID10 works well for data storage and for read-mostly caseswhen you still would like some redundancy RAID5 can work pretty well as wellbut beware of random writes to RAID5.)。

2. 操作系統

首先:使用64位的操作系統。我們任然可以看見在支持64位且具有大內存的硬件上運行32位操作系統的情況。不要這麼做。如果使用Linux,請爲數據庫目錄安裝LVM以獲得更高效的備份。多數情況下EXT3都是很好的選擇,當然如果運行在particular roadblocks,可以試試XFS。如果如果你使用了MySQL的innodb_file_per_table參數,且有很多張表,那麼設置linux的noatime和nodiratime是可以小幅提升性能的。同時還要確保你的操作系統不會在內存不足的情況下,將MySQL swap out。

3.  MySQL InnoDB 配置

innodb_buffer_pool_size:參數中最重要的一項。內存的70-80%是個安全值。16G時這個值我會定爲12G。附:如果你想了解更多細節,可以閱讀這篇文章:http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/

innodb_log_file_size:這取決於你對恢復數據的速度需求,但一般來說,256M是一個在恢復時間與高性能之間比較好的平衡點。

innodb_log_buffer_size=4M:大部分情況下,4M是很好的選擇;如果要處理很大的二進制數據(large blobs),可以把這個值調大一點。

innodb_flush_log_at_trx_commit=2:如果你不是那麼關注ACID,也允許在整個操作系統崩潰的情況下,丟失最後一兩秒的事務,那麼可以設置爲2。這個值的改變有非常明顯的影響,尤其是對於一些短寫入事務。

innodb_thread_concurrency=8:即使當前的InnodbScalability Fixes,對於併發的限制也很有限。真實情況會比這個值略高或略低,這取決於你的應用程序,當然由8開始是不錯的選擇。

innodb_flush_method=O_DIRECT:避免雙緩衝並降低交換(swap)的壓力,多數情況下,這個配置能改善性能。要注意的是如果你沒有帶電池備份的RAID卡緩存,寫的IO壓力可能會增大。

innodb_file_per_table:如果你的表不多,可以考慮這個選項,這樣你就不用擔心出現無法回收的不受控制增長的主表空間。這個選項是MySQL 4.1時新加的,現在已經足夠穩定。

 同樣檢查一下你的程序是否支持使用READ-COMMITED隔離模式運行——如果可以的話——將它設成默認值transaction-isolation=READ-COMMITTED。這個選項將帶來性能的改善,尤其是5.0中的鎖以及即將發佈的5.1,以及行級複製。

 還有很多其他配置可以調整,但我們今天只關注和InnoDB有關的。你還可以自行閱讀這兩個地方:http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/,http://www.mysqlperformanceblog.com/mysql-performance-presentations/

4.  應用程序調優

對於應用程序,尤其是以前使用MyISAM引擎的程序來說,需要進行以下調整。

首先,確保在更新操作(update)時使用事務,這樣既可以保證一致性,也能夠獲得更好的性能。其次,如果你的程序有任何寫操作,都應該要考慮可能發生的死鎖。再次,請檢查你的表結構,以確保他們能從InnoDB屬性中獲得性能改善,如:用主鍵聚集數據,所有索引都有主鍵(因此要保證主鍵短),用主鍵進行快速查找(試着使用join),大的未壓縮的索引(使主鍵儘可能的簡單。)(這一段話不太懂:clustering by primary key, having primary key in all indexes (sokeep primary key short), fast lookups by primary keys (try to use it in joins),large unpacked indexes(try to be easy on indexes).)

通過以上配置,能保證你的數據庫的性能比大多數使用MySQL默認配置、沒有電池備份緩存、不優化OS、應用程序,並使用MyISAM的人的要好。

-----------------------------------------------------------這是一條分割線-----------------------------------------------------------

原文寫於2007.11.1,因此裏面有些內容會看起來比較奇怪, 比如原文中有“即將發佈的5.1”等語句。

本人英語水平一般,對Linux、硬件、MySQL瞭解也都非常有限,錯誤在所難免,還望路過的諸位看客可以不吝指正。

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