我成功基本配置了我的副本集,但我发现读取性能很慢。我的副本集中有2个mongo服务器和1个仲裁器。所有这些都在Centos 6.3最小设置(只是数据库)上运行。
我在另一台Windows服务器2012上也有单个mongo实例。
在构建我的副本集之前,我的Web服务器与Mongo(即windows实例)在同一个操作系统上。表现很好,结果就像
C#.NET 4.5(同一VM上的IIS和Mongo)读取2000行:AvgObj 2600字节〜250ms
现在使用我的副本设置我的读取性能非常慢。当我的Web服务器访问副本集时,我得到的结果如
C#.NET 4.5(在Centos副本上分离,IIS和Mongo)读取2000行:在AvgObj 2600字节的〜2500ms
我试图从远程IIS的单个Mongo瞬间读取,结果就像
C#.NET 4.5(Windows上分离,IIS和单Mongo)读取2000行:AvgObj 2600字节〜600ms
所有服务器都在使用Hyper-V核心服务器的单个物理计算机上运行。
我正在使用最新的C#MongoDB Driver 1.7版本。从我在命令shell中测试的,在所有mongo服务器上,我的查询在10ms内执行。
任何人都可以向我提出建议,为什么我在分离的Centos服务器上设置的副本具有较慢的读取性能?它是网络,驱动程序还是其他什么?
我的C#配置是
var server1 = new MongoServerAddress("1.0.0.1"); //primary
var server2 = new MongoServerAddress("1.0.0.2"); /secundary
var servers = new List<MongoServerAddress> {server1, server2};
var safe = new MongoClientSettings
{
Servers = servers,
ReplicaSetName = "rs0",
ConnectionMode = ConnectionMode.ReplicaSet,
WriteConcern = new WriteConcern
{
Journal = false,
W = 1
},
ReadPreference = new ReadPreference
{
ReadPreferenceMode = ReadPreferenceMode.PrimaryPreferred
}
};
答案 0 :(得分:3)
为了在Hyper V上获得最佳性能,请确保使用常规网络适配器(非传统),并在客户机操作系统内部安装Integration Services。
对于CentOS 6.x,您可以从此处安装Integration Services: http://www.microsoft.com/en-us/download/details.aspx?id=34603
如果您发现您的虚拟机使用的是旧版网络适配器,请注意,添加新适配器时,您必须重新配置来宾(CentOS)操作系统内的网络。
答案 1 :(得分:1)
在Mongo shell中,您通常会收回前10条记录 - 在.NET中,您将获得前101条记录或1 MB(以先到者为准)。如果您打开游标然后对迭代进行计时,您会发现与从shell中检索10条记录相比,这可能会非常慢。
尝试运行JS循环以检索shell中的所有记录,并查看所需的时间。请注意,如果您已经启动并运行了mongos连接,则应该同时运行shell和C#连接。
答案 2 :(得分:1)
这可能不是一个确凿的答案,但我现在所做的只是在没有c#应用程序的情况下调试mongo连接:使用mongo shell查询并连接到远程服务器(centos和windows,两者都配置为具有相同数据的副本。) 如果这里存在显着差异,那么我将查看VM / OS配置(网络适配器,网络配置等)。
如果没有区别,我会使用mongo配置(读取首选项,从属设备等)以找出妨碍性能的确切因素。