MongoDB和MySQL性能測試及其結(jié)果分析
一、測試環(huán)境
1、測試服務(wù)器狀況
共涉及4臺(tái)測試服務(wù)器:
壓力測試服務(wù)器
Web服務(wù)器
MongoDB服務(wù)器
MySQL服務(wù)器。
機(jī)器配置為:
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ū)動(dòng)。
Mongodb的php驅(qū)動(dòng)為:mongodb-mongo-php-driver-1.1.1-19-gc584231.tar.gz
HandlerSocket的php驅(qū)動(dòng)為: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存儲(chǔ)引擎:Innodb,調(diào)整了innodb的Thread Pool Size為2G
2、測試程序和測試數(shù)據(jù)提取
1. 為了避免打開連接和Http服務(wù)器成為瓶頸,在測試程序里設(shè)置為每1000個(gè)請(qǐng)求公用同一個(gè)連接,同時(shí)設(shè)置為每個(gè)頁面請(qǐng)求執(zhí)行1000次數(shù)據(jù)請(qǐng)求。
2. 測試的數(shù)據(jù),包括QPS、CPU、IO等方面的數(shù)據(jù),從操作系統(tǒng)提供的命令(如vmstat、iostat等)或者M(jìn)ongodb、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)部實(shí)現(xiàn)和測試方式有關(guān)系。
測試場景下MySQL采用的是單條Insert的方式,所以可以看出QPS數(shù)和TPS數(shù)是基本一致的,也就是每個(gè)Insert操作,都對(duì)應(yīng)有一次I/O寫入操作??梢詮腗ySQL數(shù)據(jù)庫本身做一些優(yōu)化,這次測試沒有覆蓋到這種場景。
HandlerSocket內(nèi)部采用的是Bulk Insert操作,所以,可以看出QPS數(shù)明顯大于TPS數(shù),批量的插入操作明顯提高了整體性能。
Mongodb內(nèi)部采用合并操作的方式,采用數(shù)據(jù)先存放到內(nèi)存中,然后再Flush到磁盤上的方式。所以,從測試數(shù)據(jù)可以看出,TPS曲線坡度非常大:有時(shí)候TPS是零,這時(shí)候是還放到內(nèi)存中,還沒有Flush到磁盤上;有時(shí)候TPS非常高,同時(shí)這時(shí)候CPU也非常高,幾乎是100%,這時(shí)候是在做Flush到磁盤的操作?;诖朔N機(jī)制,以后會(huì)再做一些更細(xì)化的優(yōu)化和測試,因?yàn)檫@樣有可能會(huì)存在幾種問題:
第一, 可能會(huì)導(dǎo)致某個(gè)時(shí)間段IO和CPU的壓力非常大,甚至達(dá)到峰值,這種情況下,服務(wù)的整體健康狀態(tài)將面臨著一些挑戰(zhàn)。
第二, 如果服務(wù)器重啟,可能會(huì)出現(xiàn)數(shù)據(jù)丟失的情況,內(nèi)存中的數(shù)據(jù)還沒有Flush到磁盤的會(huì)丟失。當(dāng)然這種情況是兩面性的,因?yàn)椴捎眠@種方式,從測試結(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%之間,在一個(gè)比較合理的范圍內(nèi)。
從插入情況下的CPU數(shù)據(jù)可以看出,HandlerSocket的CPU占用率還是保持在40%-60%之間,低于MySQL和Mongodb。MySQL和Mongodb大部分情況保持在50%-90%之間。
3、 QPS情況
從查詢情況下的QPS數(shù)據(jù)可以看出,HandlerSocket和Mongodb的查詢性能幾乎差不多,都達(dá)到3萬以上,并且隨著數(shù)據(jù)量的增長,性能沒有回落,還是保持在3萬以上。目前只是最大測試到5000萬數(shù)據(jù)的情況,更高的數(shù)值這次測試還沒有覆蓋到。而MySQL的性能相比之下則差一些,一般在18000到25000之間。當(dāng)然這次沒有太多的針對(duì)MySQL做優(yōu)化,只是增大了innodb_thread_pool大小和每次分配的數(shù)據(jù)塊的大小,如果針對(duì)MySQL做優(yōu)化,可能能同時(shí)提高HandlerSocket和MySQL的性能。
從插入情況下的QPS數(shù)據(jù)可以看出,Mongodb明顯占有比較大的優(yōu)勢,這根之前說的它的實(shí)現(xiàn)方式有關(guān)。隨著數(shù)據(jù)量的增長,QPS都相應(yīng)的在減少,這方面,MySQL的幅度最大,數(shù)據(jù)量到達(dá)5000萬以上時(shí),MySQL的插入性能為2000-3000,而HandlerSocket能保持在1萬以上,Mongodb為2萬以上。
出處:http://www.cnblogs.com/inrie
【編輯推薦】
- MySQL 5.5.5 M3發(fā)布 改進(jìn)InnoDB存儲(chǔ)引擎
- 從MySQL 5.5發(fā)布看開源數(shù)據(jù)庫版本升級(jí)新模式
- MySQL 5.5發(fā)布 支持半同步復(fù)制
- MySQL 5.5更新頻繁 InnoDB重大改進(jìn)
- 深入了解MySQL 5.5分區(qū)功能增強(qiáng)