MongoDB和MySQL性能測試及其結(jié)果分析
一、測試環(huán)境
1、測試服務(wù)器狀況
共涉及4臺測試服務(wù)器:
壓力測試服務(wù)器
Web服務(wù)器
MongoDB服務(wù)器
MySQL服務(wù)器。
機器配置為:
CPU:Intel(R) Core(TM)2 Duo CPU E7200 @ 2.53GHz
RAM:8G DDR2 667
磁盤:SATA
操作系統(tǒng):
Redhat 5.5
1. 壓力測試服務(wù)器
安裝Webbench 1.5,通過Webbench來壓Web服務(wù)器。
2. Web服務(wù)器
Nginx 0.8.54 + PHP 5.3.3 (php-fpm),安裝有Mongodb和HandlerSocket的php驅(qū)動。
Mongodb的php驅(qū)動為:mongodb-mongo-php-driver-1.1.1-19-gc584231.tar.gz
HandlerSocket的php驅(qū)動為:php-handlersocket-0.0.7.tar.gz
通過Php程序來調(diào)用Mongodb和HandlerSocket。
3. MongoDB服務(wù)器
MongoDB版本:1.6.5
4. MySQL服務(wù)器
MySQL版本:5.1.53
HandlerSocket版本:1.0.6-60-gf51e061
MySQL存儲引擎:Innodb,調(diào)整了innodb的Thread Pool Size為2G
2、測試程序和測試數(shù)據(jù)提取
1. 為了避免打開連接和Http服務(wù)器成為瓶頸,在測試程序里設(shè)置為每1000個請求公用同一個連接,同時設(shè)置為每個頁面請求執(zhí)行1000次數(shù)據(jù)請求。
2. 測試的數(shù)據(jù),包括QPS、CPU、IO等方面的數(shù)據(jù),從操作系統(tǒng)提供的命令(如vmstat、iostat等)或者Mongodb、Mysql提供的命令(如mongostat、mysqladmin等)來獲取。
二、測試結(jié)果
1、100萬條記錄
1. 查詢
2. 插入
2、1000萬條記錄
1. 查詢
2. 插入
3、2000萬條記錄
1. 查詢
2. 插入
4、5000萬條記錄
1. 查詢
2. 插入
三、測試分析總結(jié)
1、 I/O讀寫情況
從插入情況下的TPS數(shù)據(jù)可以看出, MySQL、HandlerSocket和Mongodb的數(shù)據(jù)有比較明顯的差別,這主要跟他們的內(nèi)部實現(xiàn)和測試方式有關(guān)系。
測試場景下MySQL采用的是單條Insert的方式,所以可以看出QPS數(shù)和TPS數(shù)是基本一致的,也就是每個Insert操作,都對應(yīng)有一次I/O寫入操作。可以從MySQL數(shù)據(jù)庫本身做一些優(yōu)化,這次測試沒有覆蓋到這種場景。
HandlerSocket內(nèi)部采用的是Bulk Insert操作,所以,可以看出QPS數(shù)明顯大于TPS數(shù),批量的插入操作明顯提高了整體性能。
Mongodb內(nèi)部采用合并操作的方式,采用數(shù)據(jù)先存放到內(nèi)存中,然后再Flush到磁盤上的方式。所以,從測試數(shù)據(jù)可以看出,TPS曲線坡度非常大:有時候TPS是零,這時候是還放到內(nèi)存中,還沒有Flush到磁盤上;有時候TPS非常高,同時這時候CPU也非常高,幾乎是100%,這時候是在做Flush到磁盤的操作。基于此種機制,以后會再做一些更細化的優(yōu)化和測試,因為這樣有可能會存在幾種問題:
第一, 可能會導(dǎo)致某個時間段IO和CPU的壓力非常大,甚至達到峰值,這種情況下,服務(wù)的整體健康狀態(tài)將面臨著一些挑戰(zhàn)。
第二, 如果服務(wù)器重啟,可能會出現(xiàn)數(shù)據(jù)丟失的情況,內(nèi)存中的數(shù)據(jù)還沒有Flush到磁盤的會丟失。當(dāng)然這種情況是兩面性的,因為采用這種方式,從測試結(jié)果也可以看出,整體的寫入性能比MySQL和HandlerSocket都高,這是一種取舍,就看具體業(yè)務(wù)是否可以接受這樣的以高性能換取數(shù)據(jù)可靠性,有些業(yè)務(wù)可能是可以接受的,比如Feed。
2、 CPU占用情況
從查詢情況下的CPU數(shù)據(jù)可以看出,MySQL和Mongodb幾乎都接近100%,而HandlerSocket由于省去了各種Sql Parser和相關(guān)的操作,CPU占用率保持在40%-60%之間,在一個比較合理的范圍內(nèi)。
從插入情況下的CPU數(shù)據(jù)可以看出,HandlerSocket的CPU占用率還是保持在40%-60%之間,低于MySQL和Mongodb。MySQL和Mongodb大部分情況保持在50%-90%之間。
3、 QPS情況
從查詢情況下的QPS數(shù)據(jù)可以看出,HandlerSocket和Mongodb的查詢性能幾乎差不多,都達到3萬以上,并且隨著數(shù)據(jù)量的增長,性能沒有回落,還是保持在3萬以上。目前只是最大測試到5000萬數(shù)據(jù)的情況,更高的數(shù)值這次測試還沒有覆蓋到。而MySQL的性能相比之下則差一些,一般在18000到25000之間。當(dāng)然這次沒有太多的針對MySQL做優(yōu)化,只是增大了innodb_thread_pool大小和每次分配的數(shù)據(jù)塊的大小,如果針對MySQL做優(yōu)化,可能能同時提高HandlerSocket和MySQL的性能。
從插入情況下的QPS數(shù)據(jù)可以看出,Mongodb明顯占有比較大的優(yōu)勢,這根之前說的它的實現(xiàn)方式有關(guān)。隨著數(shù)據(jù)量的增長,QPS都相應(yīng)的在減少,這方面,MySQL的幅度最大,數(shù)據(jù)量到達5000萬以上時,MySQL的插入性能為2000-3000,而HandlerSocket能保持在1萬以上,Mongodb為2萬以上。
出處:http://www.cnblogs.com/inrie
【編輯推薦】
- MySQL 5.5.5 M3發(fā)布 改進InnoDB存儲引擎
- 從MySQL 5.5發(fā)布看開源數(shù)據(jù)庫版本升級新模式
- MySQL 5.5發(fā)布 支持半同步復(fù)制
- MySQL 5.5更新頻繁 InnoDB重大改進
- 深入了解MySQL 5.5分區(qū)功能增強