2012-08-22 25 views
0

我想模擬使用mongo 1.8.0的mongo寫入鎖,但無法看到正確的預期結果。模擬Mongo寫鎖定來衡量性能

我在同一臺服務器上的兩個不同dbs中創建兩個mongo集合。我創建了一個DBObjects數組,並將它們插入到兩個集合中。批量插入使用兩個線程同時觸發。我也跟蹤DBCollection.insert(DBObject arr,WriteConcern.SAFE)被調用之前和之後的時間。

儘管使用了不同的對象大小和數組大小,但我總是發現插入兩個數據庫的時間有點接近。我希望一個線程先寫入阻塞另一個線程,從而導致兩個線程之間的時間差別很大。有什麼我在這裏失蹤?

class BenchTest { 

public static void main() { 

    Mongo m = new Mongo(host,port); 
    DBCollection coll1 = m.getDB("db0").getColl("coll0"); 
    DBCollection coll2 = m.getDB("db1").getColl("coll0"); 

    Thread t1 = new WriteThread(); 
    t1.setCollection(coll1); 
    Thread t2 = new WriteThread(); 
    t2.setCollection(coll2); 

    t1.run(); 
    t2.run(); 

} 

} 


    class WriteThread extends Thread { 

    DBCollection coll; 

    public void setCollection (DBCollection coll) { 
     this.coll = coll; 
    } 

    long startTime = System.currentTimeMillis(); 
    coll.insert((DBObject1, DBObject2, …, DBObjectn), WriteConcern.SAFE); 
    long endTime = System.currentTimeMillis(); 

    System.out.println ("Time taken = "+(endTime-startTime)); 

} 

回答

2

爲什麼不使用fsync & lock來模擬「寫入鎖定」?

模擬「寫入鎖定」會很困難,因爲它本質上並不是四處閒逛,而是隻有很少的時間。在版本(1.8,2.0和2.2)上有很多變化(概要here)(以免重複我自己)。

這是一個非常好的blog post對別人做的一些類似的'寫鎖'測試。