MongoDB和MySQL性能測試及其結果分析
一、測試環境
1、測試服務器狀況
共涉及4臺測試服務器:
壓力測試服務器
Web服務器
MongoDB服務器
MySQL服務器。
機器配置為:
CPU:Intel(R) Core(TM)2 Duo CPU E7200 @ 2.53GHz
RAM:8G DDR2 667
磁盤:SATA
操作系統:
Redhat 5.5
1. 壓力測試服務器
安裝Webbench 1.5,通過Webbench來壓Web服務器。
2. Web服務器
Nginx 0.8.54 + PHP 5.3.3 (php-fpm),安裝有Mongodb和HandlerSocket的php驅動。
Mongodb的php驅動為:mongodb-mongo-php-driver-1.1.1-19-gc584231.tar.gz
HandlerSocket的php驅動為:php-handlersocket-0.0.7.tar.gz
通過Php程序來調用Mongodb和HandlerSocket。
3. MongoDB服務器
MongoDB版本:1.6.5
4. MySQL服務器
MySQL版本:5.1.53
HandlerSocket版本:1.0.6-60-gf51e061
MySQL存儲引擎:Innodb,調整了innodb的Thread Pool Size為2G
2、測試程序和測試數據提取
1. 為了避免打開連接和Http服務器成為瓶頸,在測試程序里設置為每1000個請求公用同一個連接,同時設置為每個頁面請求執行1000次數據請求。
2. 測試的數據,包括QPS、CPU、IO等方面的數據,從操作系統提供的命令(如vmstat、iostat等)或者Mongodb、Mysql提供的命令(如mongostat、mysqladmin等)來獲取。
二、測試結果
1、100萬條記錄
1. 查詢


2. 插入



2、1000萬條記錄
1. 查詢


2. 插入



3、2000萬條記錄
1. 查詢


2. 插入



4、5000萬條記錄
1. 查詢


2. 插入



三、測試分析總結
1、 I/O讀寫情況
從插入情況下的TPS數據可以看出, MySQL、HandlerSocket和Mongodb的數據有比較明顯的差別,這主要跟他們的內部實現和測試方式有關系。
測試場景下MySQL采用的是單條Insert的方式,所以可以看出QPS數和TPS數是基本一致的,也就是每個Insert操作,都對應有一次I/O寫入操作。可以從MySQL數據庫本身做一些優化,這次測試沒有覆蓋到這種場景。
HandlerSocket內部采用的是Bulk Insert操作,所以,可以看出QPS數明顯大于TPS數,批量的插入操作明顯提高了整體性能。
Mongodb內部采用合并操作的方式,采用數據先存放到內存中,然后再Flush到磁盤上的方式。所以,從測試數據可以看出,TPS曲線坡度非常大:有時候TPS是零,這時候是還放到內存中,還沒有Flush到磁盤上;有時候TPS非常高,同時這時候CPU也非常高,幾乎是100%,這時候是在做Flush到磁盤的操作。基于此種機制,以后會再做一些更細化的優化和測試,因為這樣有可能會存在幾種問題:
第一, 可能會導致某個時間段IO和CPU的壓力非常大,甚至達到峰值,這種情況下,服務的整體健康狀態將面臨著一些挑戰。
第二, 如果服務器重啟,可能會出現數據丟失的情況,內存中的數據還沒有Flush到磁盤的會丟失。當然這種情況是兩面性的,因為采用這種方式,從測試結果也可以看出,整體的寫入性能比MySQL和HandlerSocket都高,這是一種取舍,就看具體業務是否可以接受這樣的以高性能換取數據可靠性,有些業務可能是可以接受的,比如Feed。
2、 CPU占用情況
從查詢情況下的CPU數據可以看出,MySQL和Mongodb幾乎都接近100%,而HandlerSocket由于省去了各種Sql Parser和相關的操作,CPU占用率保持在40%-60%之間,在一個比較合理的范圍內。
從插入情況下的CPU數據可以看出,HandlerSocket的CPU占用率還是保持在40%-60%之間,低于MySQL和Mongodb。MySQL和Mongodb大部分情況保持在50%-90%之間。
3、 QPS情況
從查詢情況下的QPS數據可以看出,HandlerSocket和Mongodb的查詢性能幾乎差不多,都達到3萬以上,并且隨著數據量的增長,性能沒有回落,還是保持在3萬以上。目前只是最大測試到5000萬數據的情況,更高的數值這次測試還沒有覆蓋到。而MySQL的性能相比之下則差一些,一般在18000到25000之間。當然這次沒有太多的針對MySQL做優化,只是增大了innodb_thread_pool大小和每次分配的數據塊的大小,如果針對MySQL做優化,可能能同時提高HandlerSocket和MySQL的性能。
從插入情況下的QPS數據可以看出,Mongodb明顯占有比較大的優勢,這根之前說的它的實現方式有關。隨著數據量的增長,QPS都相應的在減少,這方面,MySQL的幅度最大,數據量到達5000萬以上時,MySQL的插入性能為2000-3000,而HandlerSocket能保持在1萬以上,Mongodb為2萬以上。
出處:http://www.cnblogs.com/inrie
【編輯推薦】
- MySQL 5.5.5 M3發布 改進InnoDB存儲引擎
- 從MySQL 5.5發布看開源數據庫版本升級新模式
- MySQL 5.5發布 支持半同步復制
- MySQL 5.5更新頻繁 InnoDB重大改進
- 深入了解MySQL 5.5分區功能增強























