前面兩篇文章主要對HandlerSocket從整體上做一些介紹,本文從效能及其效能最佳化方面來做一些介紹。
一、HandlerSocket效能
HandlerSocket作者測試HandlerSocket在查詢情況下QPS為75K,Memcached為40K,MySQL為10K。但是需要注意到它的測試情境,一般的應用是很難有這樣的情境的,所以說一般應用是很難達到7.5倍於MySQL的情況,但是效能的大幅度提高是不容置疑的。作者的測試情境如下:
1. 關閉MySQL的query cache:也就是MySQL的每次操作都需要執行sql解析等那一系列操作。
2. CPU Bound而非I/O Bound:InnoDB Buffer Pool設定為比較大,命中率接近100%。
所以,應該更客觀的來看待測試資料。對於CPU Bound而非I/O Bound類型的應用,在InnoDB_Buffer_Pool接近100%命中率的時候,HandlerSocket可以將查詢效能提高7.5倍。這一點其實不難理解,因為HandlerSocket主要效能最佳化點在於節省了SQL層的開銷,SQL層的開銷主要是CPU的開銷。而如果對於一個I/O Bound的應用來說,HandlerSocket的查詢效能可能就達不到7.5倍了,可能距離7.5倍有比較大的差距,所以,對於HandlerSocket的應用來說,應該盡量提高InnoDB_Buffer_Pool的大小,多多益善。
我也做過一些基準測試,基本上在插入的情況下,HandlerSocket的效能能達到同等環境的MySQL的3-5倍,資料量越大時候越明顯,特別是達到5000萬以後。在查詢情況下,HandlerSocket是同等環境下MySQL的1.5-2倍,這跟作者的測試的7.5倍有比較大的出入,這也是上面我特別提到的,作者的測試資料是在Innodb_Buffer_Pool足夠大並且命中率很高的情況,由於我做基準測試的機器條件有限,沒有足夠大的Buffer Pool,命中率不是很高,所以,I/O開銷不小,這也驗證了上面提到的,對於I/O Bound的情境,效能的提升不會特別的明顯,所以應該盡量增大InnoDB_Buffer_Pool的大小,盡量接近於資料的大小。而且我在測試的時候,沒有關閉Query Cache,所以對於MySQL的測試情境來說,能重用到執行計畫和Cache資料等。
上面說到了,HandlerSocket具有不少的優點,效能也有很大的提升,但是也需要理性的來看待,有一些需要特別注意的事項,在做決策的時候,應該整體上的考慮,我這裡簡單的總結一下。
1. 應該盡量達到CPU-Bound情境,而非IO-Bound,這樣才能更好的發揮出HandlerSocket的優勢。具體做法是增大記憶體,盡量提高InnoDB_Buffer_Pool大小。
2. 由於採用合併作業,回應時間會有不同程度的增加,應該考慮好是否滿足你的應用情境。可以繼續關注後續版本最佳化策略,比如可能有些朋友會想要這樣的:讀取的時候不是合併作業,但是寫入是合併作業,當然這樣的情況讀取的總體效能會有不同程度降低,不過一切不就是在權衡嘛?還是看具體應用情境。
二、HandlerSocket效能最佳化
前面也提到了,HandlerSocket效能相比傳統MySQL有了比較顯著的提高,但是要想更好的發揮出它的優勢,需要做一些相關的最佳化。
效能最佳化主要從以下三方面考慮,當然除了這三方面,還有其他一些最佳化方式,比如最佳化作業系統,使用Direct IO等,這裡說的這三方面是相對比較容易做到並且實現技術成本也不高的方式:
1. 硬體環境
前面也提到了,應該盡量提高Innodb Buffer Pool的大小,對應到硬體上,就是要盡量增加記憶體的大小,最理想的情況下是記憶體大小與資料大小一樣。如果有資源,也可以考慮採用SSD,這有個基於SSD的測試資料(http://www.percona.com/docs/wiki/benchmark:handlersocket:ssd:start),效能還是非常給力的。
2. 用戶端最佳化
用戶端與服務端基於Socket通訊,開啟關閉串連、OpenIndex等操作都是比較耗費資源的操作,應該盡量避免頻繁的做這些操作。所以,在用戶端應該要做串連池,同時應該採用一些更好的通訊模型,比如Linux下基於epoll和NIO等。比如,這個Java用戶端(http://code.google.com/p/hs4j/)這方面就做得不錯。
3. HandlerSocket和Innodb配置
HandlerSocket配置:
//讀線程的個數,推薦為邏輯CPU個數,比如超執行緒的應該*2
handlersocket_threads = 16
//寫線程的個數,目前的版本推薦設定為1
handlersocket_thread_wr = 1
//讀請求的監聽連接埠
handlersocket_port = 9998
//寫請求的監聽連接埠
handlersocket_port_wr = 9999
Innodb配置:
//Innodb Buffer Pool大小,推薦越大越好
innodb_buffer_pool_size
//Innodb記錄檔大小,根據需求設定,在允許的情況下越大也越好
innodb_log_file_size, innodb_log_files_in_group
//mysqld進程可以開啟的檔案數,推薦為65535
open_files_limit = 65535
//設定為1能提高效能,但是相應的也會消耗記憶體,需要權衡好
innodb_adaptive_hash_index = 1
作者:洪小軍
出處:http://www.cnblogs.com/inrie
轉載請註明出處,謝謝!