有 100 个数据文件,每个文件有 60 个字段和超过 400 万条记录。有一个 perl 程序可以根据用户定义的 _id 字段插入记录或更新它们。还有一个 History 集合,用于存储曾经为三个字段写入的所有值。已经建立了一个带有两台服务器和一个仲裁器的副本集。最初,文件以每个文件 45 分钟的速度加载到 MongoDB。大约 20 个文件后,速度大大下降。此时的速度是每个文件 20 小时。服务器已经开始严重减速。我什至无法快速使用注销命令。
我用散列索引在 _id 字段上建立了索引,对于 History 集合,我用 id 和 date 字段建立了索引。此时集合中的记录数为实际数据收集的 400 万条,History 收集的大约 1 亿条记录。我有两个 17 GB RAM 处理器,其中根据 Mongostat res 命令仅使用了大约 3.5 个演出。然而,由于数据记录将按日期顺序插入,我也不能利用并行性。
已达到特定场景的 mongo 限制?这种放缓是否在意料之中?我不时手动 fsynced 以确保文件被写入磁盘。我可以运行其他一些诊断程序来更好地解释这种情况吗?这个问题有方法解决吗?
谢谢
根据Markus W Mahlberg对问题的评论生成的社区 wiki 答案:
您可能希望在插入期间使用批量操作。如果未使用所有 RAM,则可以安全地假设磁盘或插入程序是限制因素。通过批量操作,您可以加快这两个限制因素的速度。有严重错误。除非您的字段非常大,否则 200k 插入/小时只是一个笑话。您希望您的代码得到同行评审并确保 IO 操作高效。有关详细信息,请参阅生产说明。
有批量更新插入:bulk.find({...}).update({...},{upsert:true})
. 此外,你还可以这样做var bulk=db.collection.initializeOrderedBulkOp()
。
归档时间: |
|
查看次数: |
2023 次 |
最近记录: |