Mongos限制查询速度

时间:2014-08-30 21:20:50

标签: java mongodb

我有一个mongo v2.6.4群集:

  • 运行mongos实例的2台app服务器
  • 3个独立配置服务器
  • 副本集中的3个mongod服务器

从app服务器我可以毫无问题地连接到群集。但是,每个服务器限制为每秒大约1k个查询(这个数字来自使用Java驱动程序的小型集合上的快速findOne)。在我的开发环境中,在一个小vm上,我看到每秒使用相同的测试应用程序进行超过4k次查询。

真正奇怪的是,如果我添加更多应用服务器,我可以同时从每个应用服务器获得大约每秒1k个查询(即4个应用服务器每秒可以获得大约4k个查询)。这让我相信mongos设置有问题,这会限制查询性能。

我疯了吗?有没有办法提高mongos的性能?


编辑1(添加示例代码和有关mongos配置的详细信息)

除了

之外,mongos配置是100%默认值
configdb=server1,server2,server3
maxConns=10000

在其中一个应用服务器上运行的快速测试代码

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.MongoClient;

class Tester {

    public static void main (String[] args) {

        try {

            MongoClient mongoClient = new MongoClient("192.168.1.100");

            DB db = mongoClient.getDB("my_db");

            db.authenticate("my_user", "my_passwd".toCharArray());

            DBCollection coll = db.getCollection("my_collection");

            long counter = 10000l;

            long start = System.currentTimeMillis();

            for (int i=0; i<counter; i++){
                coll.findOne();
            }

            double totalTime = (System.currentTimeMillis() - start) / 1000.0;

            System.out.println(counter + " counter find operations in " + totalTime + " seconds (" + (counter/totalTime) + " per second)");

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

1 个答案:

答案 0 :(得分:2)

根据此处的信息,我认为最可能的解释如下:您的测试代码是单线程的。当您使用单线程代码进行测试时,您正在测量操作的延迟而不是吞吐量,因为MongoDB可以同时执行许多操作(仅限于延迟,因为限制因子/慢速步骤是单个操作的延迟,因此吞吐量数量不是最好的预期)。吞吐量数字并不表示此设置中MongoDB的实际吞吐量限制。这适用于所有设置,因为它是相同的测试代码。分片,副本和本地测试的不同数字只表示您对这些设置有不同的延迟。延迟顺序分片&gt;副本&gt;鉴于在分片设置中进行的配置服务器检查,本地是有意义的。