2013-06-12 61 views
3

我在MongoDB中調查了concurrency,顯然它使用了數據庫級鎖定系統。我認爲這意味着多個線程插入到同一個數據庫中的表現會類似或比插入到數據庫中的單個線程更差。爲什麼我的多線程插入程序比單個線程插入程序執行得更好?

我發現,當我得到4個線程併發插入數據庫時​​,性能幾乎翻倍(以插入/秒計)。

爲什麼性能越來越好,是否有任何理由?我不明白爲什麼。

如果有幫助,我有一個線程不斷從服務器接收數據包並將其插入到隊列中。我的4個線程持續從隊列中出隊並插入到數據庫中。

+1

如果插入過程中的所有時間都通過寫入RAM中的數據文件(當鎖定被保持)時被佔用,因爲零件僅需要幾微秒(微秒,而不是毫秒)。剩下的時間「其他」的東西正在發生 - 所以如果你有很多線程,你可能會得到最好的*性能,因爲限制因素將是網絡帶寬或磁盤IO或CPU(一次你有足夠的線程),而不是鎖。 –

+0

謝謝!最終雖然(在足夠的線程中)蒙哥應該成爲限制因素,因爲鎖定,對吧? – n00b

+1

通常IO帶寬(或RAM大小)在鎖定之前將成爲限制*。但是,如果你正在寫很多小文件,有足夠的RAM和快速磁盤,那麼是的,鎖可能成爲瓶頸 –

回答

2

當在MongoDB中發生寫入操作時,實際的寫入鎖只佔完成所需總時間的一小部分。

事實證明寫入RAM中的數據文件只需要幾微秒(微,而不是毫秒)。剩下的時間「其他」東西正在發生 - 這就是爲什麼如果你有很多或者少數幾個線程,你會得到最好的性能 - 在大多數情況下,限制因素將會是網絡帶寬或磁盤IO或CPU(一旦你有足夠的線程),而不是鎖。

如果你有足夠的線程在mongod扔寫入,文件非常小,盤面快速(用於沖洗所有數據寫到磁盤),並有足夠的內存來處理相關的索引更新,然後數據庫鎖定可以成爲寫入吞吐量的限制因素,但它通常不是成爲瓶頸的第一或第二件事。

我鼓勵您使用諸如mongostatiostat和其他系統監視資源的工具來查看實際瓶頸的位置。如果你沒有看到,那麼你的應用程序不會在數據庫上投入足夠的工作量以最大化其容量。