7

我试图了解如何更好地确定我目前所看到的问题出在哪里。

目前我正在通过 cron 更新集合,每 15 分钟从第三方供应商下载信息(没有问题)。有时我需要进行 2 年的更新,并且当我看到这个问题时。

传入的是大约 300-600k 的结果,我正在使用 mongo->collection->save($item); 我对所有结果都有_id,所以(我认为)也被快速插入。

文档大小变化不大,开始时很小(12kb~)。

我将每个请求以大约 200 的速度批量下载到第 3 方服务器,格式化它们,然后使用 save 将它们一次插入一个到 mongo 中,并将安全插入设置为 true。

现在,当保存发生时,它看起来将我的锁定百分比提高到 20-30% 之间。我想知道如何追查为什么会发生这种情况,因为我相信这是我最终遇到超时(设置为 100 秒)的原因。

  • 超时错误:MongoCursorTimeoutException Object->cursor 超时(超时:100000,剩余时间:0:0,状态:0)

  • Mongo 驱动程序:Mongo Native Driver 1.2.6(来自 PHP.net)

我目前使用的是带有 SSD 驱动器和 16gb 内存的 Mongo 2.2.1。

这是我在插入时遵循的 mongoStat 操作的示例:

  insert  query update delete getmore command flushes mapped  vsize    res        faults                locked db               idx miss %     qr|qw   ar|aw  netIn  netOut  conn  set          repl    time 
  0       0     201    0      215     203     0       156g    313g     1.57g      7                    mydb:36.3%               0               0|0     0|0   892k   918k    52    a-cluster    PRI     10:04:36

我有一个带有辅助设置的主设置和一个位于它们前面的套利(根据文档建议),使用 PHP 进行插入。

任何帮助将不胜感激。

非常感谢您的参与

更新

我将所有项目存储在“MongoDoc”中,因为有时需要对每个元素进行格式化,在那里批量处理这些项目时,我将数据取出并插入为

$mongoData = $mongoSpec->getData();
try {
    foreach($mongoData as $insert) {
        $this->collection_instance->save($insert);
        $count++;
    }
} catch(Exception $e) {
    print_r($e->getTrace());
    exit;
}

我会说我已经删除了安全写入,并且我已经看到超时发生的急剧减少,所以现在我将它归结为这一点(除非插入有问题..)

感谢您的时间和想法。

4

1 回答 1

1

你达到了 PHP 的最大执行限制?您正在使用哪个 Mongo 库?我使用的是 FuelPHP 的 MongoDb 库,并且仅 50 次插入需要将近 1 秒(因为每次写入都是经过确认的 fsync 操作),所以这并不让我感到惊讶。我的解决方案是仅在特定时间间隔进行 fsync 和写入确认,这样可以提供更好的性能,并且可以合理地保证没有出错。

更多信息: http:
//docs.mongodb.org/manual/reference/command/fsync/
http://docs.mongodb.org/manual/core/write-operations/#write-concern

于 2013-03-05T20:27:55.327 回答