記一次MongoDB性能問(wèn)題,附原理解析
本文轉(zhuǎn)自淘寶數(shù)據(jù)庫(kù)技術(shù)團(tuán)隊(duì)博客。對(duì)MongoDB最新的穩(wěn)定版1.8版本和上個(gè)穩(wěn)定版本1.6版本做了寫(xiě)入性能的測(cè)試對(duì)比。從測(cè)試來(lái)看,1.8版本對(duì)性能的改進(jìn)還是卓有成效的。
原文鏈接:http://goo.gl/y0OES
在MongoDB 1.6.4的使用過(guò)程中,我們發(fā)現(xiàn)當(dāng)文件系統(tǒng)cache用盡的時(shí)候MongoDB的寫(xiě)入性能會(huì)有非常大的波動(dòng)。更為致命的是,偶爾還會(huì)發(fā)生持續(xù)20-30秒的寫(xiě)入阻塞。雖然MongoDB的設(shè)計(jì)非常先進(jìn),但是穩(wěn)定性一直是我們頭痛的一個(gè)問(wèn)題。帶著疑問(wèn)我們參加了Mongo北京開(kāi)發(fā)者聚會(huì),會(huì)上10gen的工程師Alvin Richards建議測(cè)試一下MongoDB 1.8,據(jù)說(shuō)在寫(xiě)鎖上有所改進(jìn)。
回到杭州后,我們?cè)赗edhat 6.0上重做了MongoDB 1.6.4和1.8.0-rc0的對(duì)比測(cè)試。測(cè)試的結(jié)果如下圖所示:
這兩張圖的橫坐標(biāo)是時(shí)間軸(每個(gè)點(diǎn)代表10秒鐘),縱坐標(biāo)是插入速度(代表10秒內(nèi)的平均速度)。
測(cè)試邏輯如下:
在zyy庫(kù)下建立一個(gè)名為test的collection
在test的k字段上建立索引
開(kāi)啟測(cè)試程序并打點(diǎn)。該測(cè)試程序?qū)㈤_(kāi)啟10個(gè)線(xiàn)程對(duì)test進(jìn)行并發(fā)寫(xiě)入。k由uuid調(diào)用生成,長(zhǎng)度為37字節(jié);v長(zhǎng)度為1k。
從測(cè)試結(jié)果上看,MongoDB 1.8.0相對(duì)于1.6.4在寫(xiě)入性能上有所改進(jìn)。首先,1.6.4除了預(yù)分配文件造成性能下降外,寫(xiě)入性能偶爾還會(huì)長(zhǎng)時(shí)間降到0。而1.8.0基本沒(méi)有出現(xiàn)寫(xiě)入性能降到0的情況,性能的最低點(diǎn)在于預(yù)分配文件。其次,從性能的穩(wěn)定性上看,1.8.0的波動(dòng)顯然沒(méi)有1.6.4那么夸張。在InnoDB做的類(lèi)似測(cè)試也會(huì)出現(xiàn)類(lèi)似波動(dòng),但是性能最低點(diǎn)不會(huì)降到MongoDB那么低。
總體而言,MongoDB 1.8.0-rc從功能和性能上都有所改進(jìn)。期待release版本和新的存儲(chǔ)引擎中。
具體測(cè)試代碼見(jiàn)此:
http://pastie.org/1645946
|