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