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