缓慢的MongoDB插入

问题描述

我有2台服务器,一台AWS和一台Microsoft azure VM,它们都是8核32 GB。

我正在两台服务器上使用以下脚本来检查MongoDB中的插入速度。 在AWS实例上,使用localhost和LAN IP的平均时间为3秒。 在Microsoft azure上,使用localhost可获得3秒,但在LAN IP上则为30秒。 我检查了两台服务器上的网络速度(大约1.73 Gbits / sec)及其几乎相同。

  1. 都具有标准的SSD。

  2. MongoDB版本相同。

  3. 都具有wiredTiger存储引擎。

唯一的区别是Azure应用程序在负载均衡器上,而AWS应用程序不在负载均衡器上。

if($_REQUEST['mongo']=='localserver'){
    $mongoip        =   "localhost";
}elseif($_REQUEST['mongo']=='mongoserver'){
    $mongoip        =   "x.x.x.x";/* LAN IP of dedicated mongo server */
}
$a              =   "mongo_speed_check";
$mongo_dbname   =   "speed";
try {
    $maa        =   new MongoClient("mongodb://{$mongoip}/{$mongo_dbname}");
    $dbnew1     =   $maa->selectDB($mongo_dbname);
} catch ( MongoConnectionException $e ) {
    print_r($e);
}
$time_start     =   microtime(true);
for ($i = 0; $i < 10000; $i++){
    $dbnew1->$a->insert(array('i' =>$i,"field{$i}" => $i * 2));
}
$time_end           =   microtime(true);
$execution_time     =   ($time_end - $time_start);
echo '<br><b>Total Execution Time:</b> '.$execution_time.' seconds';

有人可以告诉我我在这里想念什么吗?

谢谢!

解决方法

将第一个插入片段与其他插入片段分开计时。

客户端执行拓扑发现并需要建立连接才能发出任何请求。这是在后台发生的,但实际上会使第一次操作的时间更长。

如果要测试吞吐量,则需要执行至少一个要测试类型的操作才能完成此初始工作,以免影响结果。因此,请执行一次插入操作(不定时),然后在同一客户端上对接下来的100000次插入操作进行计时。

如果要测试初始连接时间,请对单个插入进行计时。

如果想要高性能,则应该使用批量写入,而不是单独插入每个文档。