2012-08-22 3 views
0

mongo 1.8.0을 사용하여 mongo 쓰기 잠금을 시뮬레이트하려하지만 올바른 예상 결과를 볼 수 없습니다.시뮬레이션 몽고 쓰기 잠금 성능 측정

동일한 서버에서 두 개의 서로 다른 DB에 mongo 모음을 두 개 만듭니다. DBObject 배열을 만들어 두 컬렉션에 삽입합니다. 배치 삽입은 두 개의 스레드를 사용하여 동시에 트리거됩니다. 또한 DBCollection.insert (DBObject arr, WriteConcern.SAFE)가 호출되기 전후의 시간을 추적합니다.

다양한 객체 크기와 배열 크기를 사용 했음에도 불구하고 항상 두 DB에 삽입하는 데 걸린 시간이 어느 정도 가까운 것으로 나타났습니다. 한 스레드가 먼저 다른 스레드를 블로킹하여 두 스레드간에 상당히 다른 시간이 소요될 것으로 예상합니다. 내가 여기서 누락 된 것이 있습니까?

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를 사용하지 않는?

"쓰기 잠금"을 본질적으로 처리하지 않으므로 시뮬레이션하기가 어려울 것입니다. 단지 약간의 시간 동안 만 해당됩니다. here에 설명 된 버전 (1.8, 2.0 및 2.2)에서 많은 변경 사항이 발생했습니다 (반복하지 않기 위해).

다른 사람의 "쓰기 잠금"에 대한 유사한 테스트를 수행하면 정말 멋진 blog post입니다.