蒙戈更新插入性能(C++)
mongo upsert performance (C++)
我正在编写一个C++客户端,该客户端处理具有1M行的文件并将它们插入mongodb。数据入到遵循不同累积标准的 6 个不同表中。我将 5000 行(可配置)的数据累积在C++图中,然后将 (upsert) 插入 (upsert) 到 mongodb 中,冲洗并重复直到文件末尾。
其中一个更新插入的代码是:
void Upsert(mongo::DBClientConnection & cmon)
{
map<KEY, VALUE>::const_iterator it;
cmon.ensureIndex("test.WebNavigationUri", BSON("ClientId" << 1 << "Uri" << 1 << "Date" << 1), true);
for (it=detail.begin(); it!=detail.end(); ++it)
{
cmon.update("test.WebNavigationUri",
BSON("ClientId" << it->first.clientid << "Uri" << it->first.uri << "Date" << it->second.dHora),
BSON("$inc" << BSON("Time" << it->second.time)),
true);
}
}
除了存储的信息外,其他更新插入是相同的。 我的问题是,如果我只使用 2 个表,时间相当快(比 MySql 快 4-8 倍),但如果我使用所有 6 个表,性能会下降。
有2张桌子:
网络累积类别:6877ms261749项;1465毫秒 (1465+ 0 + 0 + 0)。
WebAccumulationClientId: 5005ms 0 items; 0ms (
0 + 0 + 0 + 0)。WebAccumulationPolicy: 5115ms 0 个项目; 0ms (
0 + 0 + 0 + 0)。WebAccumulationVirusName: 0ms 0 个项目; 0ms (
0 + 0 + 0 + 0)。网页导航类别: 5442ms 0 项; 0ms (
0 + 0 + 0 + 0)。网页导航 URI: 9493ms414610项;3666毫秒 (3666+ 0 + 0 + 0)。
有 6 个表(相同的文件,表已删除):
网络累积类别:6605ms261749项;1421毫秒 (1421+ 0 + 0 + 0)
WebAccumulationClientId: 5367ms 172873 个项目;1753ms (1753 + 0 + 0 + 0)
WebAccumulationPolicy: 6187ms 174941 个项目; 2086ms (2086 + 0 + 0 + 0)
WebAccumulationVirus名称: 12ms 52 个项目; 0ms (0 + 0 + 0 + 0)
网页导航类别: 18745ms 258072 项; 14510ms (14510 + 0 + 0 + 0)
网页导航 URI: 33046ms414610项;27317毫秒 (27317+ 0 + 0 + 0)
时间在程序中测量
boost::posix_time::microsec_clock::local_time();
我在Oracle Server 6.5机器中使用mongodb 2.4.9。该程序使用C++驱动程序并在同一台计算机上运行。
正如你所看到的,当我在其他 4 个表中更新插入时,WebNavigationUri 从 3666ms 变为 27317ms,但 WebAccumulationCategory 的时间保持不变。表格和/或我制作更新插入的顺序之间似乎存在某种交互。 任何想法为什么会发生这种性能损失?我可以在数据库中查找/监视什么?
蒙戈斯塔特 说:
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time
*0 *0 *0 *0 0 1|0 0 544m 1.42g 247m 0 test:0.0% 0 0|0 0|0 62b 3k 6 12:09:59
3 *0 2696 *0 0 1|0 0 544m 1.42g 254m 4 test:23.5% 0 0|0 0|0 583k 3k 6 12:10:00
3 *0 10635 *0 0 2|0 0 544m 1.42g 248m 3 test:80.3% 0 0|0 0|1 2m 3k 6 12:10:01
*0 *0 13151 *0 0 1|0 0 544m 1.42g 252m 0 test:80.9% 0 0|0 0|1 2m 3k 6 12:10:02
*0 *0 13089 *0 0 1|0 0 544m 1.42g 253m 0 test:81.7% 0 0|0 0|1 2m 3k 6 12:10:03
*0 *0 13567 *0 0 1|0 0 544m 1.42g 250m 0 test:81.5% 0 0|0 0|1 2m 3k 6 12:10:04
*0 *0 13636 *0 0 1|0 0 544m 1.42g 248m 0 test:81.2% 0 0|0 0|1 2m 3k 6 12:10:05
*0 *0 13417 *0 0 2|0 0 544m 1.42g 255m 0 test:78.9% 0 0|0 0|1 2m 3k 6 12:10:06
*0 *0 13759 *0 0 1|0 0 544m 1.42g 256m 0 test:81.0% 0 0|0 0|1 2m 3k 6 12:10:07
*0 *0 13556 *0 0 1|0 0 544m 1.42g 257m 0 test:80.9% 0 0|0 0|1 2m 3k 6 12:10:08
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time
*0 *0 13821 *0 0 1|0 0 544m 1.42g 257m 0 test:81.0% 0 0|0 0|1 2m 3k 6 12:10:09
*0 *0 13932 *0 0 1|0 0 544m 1.42g 258m 0 test:81.0% 0 0|0 0|1 2m 3k 6 12:10:10
*0 *0 13460 *0 0 2|0 0 544m 1.42g 258m 0 test:81.0% 0 0|0 0|1 2m 3k 6 12:10:11
*0 *0 13823 *0 0 1|0 0 544m 1.42g 256m 0 test:80.8% 0 0|0 0|1 2m 3k 6 12:10:12
*0 *0 13811 *0 0 1|0 0 544m 1.42g 253m 0 test:80.3% 0 0|0 0|1 2m 3k 6 12:10:13
*0 *0 13794 *0 0 1|0 0 544m 1.42g 251m 0 test:81.2% 0 0|0 0|1 2m 3k 6 12:10:14
*0 *0 13605 *0 0 1|0 0 544m 1.42g 247m 0 test:79.6% 0 0|1 0|1 2m 3k 6 12:10:15
*0 *0 13403 *0 0 2|0 0 544m 1.42g 261m 0 test:79.0% 0 0|0 0|1 2m 3k 6 12:10:16
*0 *0 13781 *0 0 1|0 0 544m 1.42g 261m 0 test:81.2% 0 0|0 0|0 2m 3k 6 12:10:17
*0 *0 13824 *0 0 1|0 0 544m 1.42g 262m 0 test:80.6% 0 0|0 0|1 2m 3k 6 12:10:18
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time
*0 *0 13954 *0 0 1|0 0 544m 1.42g 262m 0 test:81.0% 0 0|0 0|1 2m 3k 6 12:10:19
*0 *0 13873 *0 0 2|0 0 544m 1.42g 262m 0 test:81.3% 0 0|0 0|1 2m 3k 6 12:10:20
*0 *0 13416 *0 0 2|0 0 544m 1.42g 261m 0 test:79.4% 0 0|0 0|1 2m 3k 6 12:10:21
*0 *0 13840 *0 0 1|0 0 544m 1.42g 261m 0 test:81.2% 0 0|0 0|1 2m 3k 6 12:10:22
*0 1 13657 *0 0 13|0 0 544m 1.42g 259m 0 test:80.4% 0 0|0 0|1 2m 11k 6 12:10:23
*0 *0 12566 *0 0 1|0 0 544m 1.42g 259m 0 test:75.5% 0 0|0 0|1 2m 3k 6 12:10:24
*0 *0 13777 *0 0 1|0 0 544m 1.42g 251m 0 test:80.4% 0 0|0 0|1 2m 3k 6 12:10:25
*0 *0 13148 *0 0 2|0 0 544m 1.42g 265m 0 test:77.6% 0 0|0 0|1 2m 3k 6 12:10:26
*0 *0 13691 *0 0 1|0 0 544m 1.42g 265m 0 test:80.7% 0 0|0 0|1 2m 3k 6 12:10:27
*0 *0 13633 *0 0 1|0 0 544m 1.42g 265m 0 test:80.2% 0 0|0 0|0 2m 3k 6 12:10:28
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time
*0 *0 13538 *0 0 1|0 0 544m 1.42g 265m 0 test:80.7% 0 0|0 0|1 2m 3k 6 12:10:29
*0 *0 13773 *0 0 1|0 0 544m 1.42g 265m 0 test:80.4% 0 0|0 0|1 2m 3k 6 12:10:30
*0 *0 9118 *0 0 2|0 0 544m 1.42g 263m 0 test:52.9% 0 0|0 0|1 1m 3k 6 12:10:31
*0 *0 11894 *0 0 1|0 0 544m 1.42g 268m 0 test:68.6% 0 0|0 0|1 2m 3k 6 12:10:32
*0 *0 13742 *0 0 1|0 0 544m 1.42g 266m 0 test:80.6% 0 0|0 0|1 2m 3k 6 12:10:33
*0 *0 13583 *0 0 1|0 0 544m 1.42g 266m 0 test:80.8% 0 0|0 0|1 2m 3k 6 12:10:34
*0 *0 13769 *0 0 1|0 0 544m 1.42g 266m 0 test:81.4% 0 0|0 0|1 2m 3k 6 12:10:35
*0 *0 13921 *0 0 2|0 0 544m 1.42g 268m 0 test:81.1% 0 0|0 0|1 2m 3k 6 12:10:36
*0 *0 13414 *0 0 1|0 0 544m 1.42g 265m 0 test:78.4% 0 0|0 0|1 2m 3k 6 12:10:37
*0 *0 13489 *0 0 1|0 0 544m 1.42g 263m 0 test:80.7% 0 0|0 0|1 2m 3k 6 12:10:38
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time
*0 *0 13847 *0 0 1|0 0 544m 1.42g 262m 0 test:81.3% 0 0|0 0|1 2m 3k 6 12:10:39
*0 3 13776 *0 0 1|0 0 544m 1.42g 266m 0 test:80.6% 0 0|0 0|1 2m 3k 6 12:10:40
*0 *0 14000 *0 0 2|0 0 544m 1.42g 251m 0 test:81.1% 0 0|0 0|1 2m 3k 6 12:10:41
*0 *0 13416 *0 0 1|0 0 544m 1.42g 270m 0 test:77.8% 0 0|0 0|1 2m 3k 6 12:10:42
*0 *0 13583 *0 0 1|0 0 544m 1.42g 270m 0 test:80.8% 0 0|0 0|1 2m 3k 6 12:10:43
*0 *0 13854 *0 0 1|0 0 544m 1.42g 272m 0 test:80.9% 0 0|0 0|1 2m 3k 6 12:10:44
*0 *0 13742 *0 0 1|0 0 544m 1.42g 270m 0 test:80.6% 0 0|0 0|1 2m 3k 6 12:10:45
*0 *0 13708 *0 0 2|0 0 544m 1.42g 269m 0 test:80.7% 0 0|0 0|1 2m 3k 6 12:10:46
*0 *0 13675 *0 0 1|0 0 544m 1.42g 269m 0 test:80.8% 0 0|0 0|1 2m 3k 6 12:10:47
*0 *0 11748 *0 0 1|0 0 544m 1.42g 271m 0 test:68.9% 0 0|0 0|1 2m 3k 6 12:10:48
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time
*0 *0 9845 *0 0 1|0 1 544m 1.42g 274m 0 test:56.4% 0 0|0 0|1 1m 3k 6 12:10:49
*0 *0 13623 *0 0 2|0 0 544m 1.42g 271m 0 test:81.0% 0 0|0 0|1 2m 3k 6 12:10:50
*0 *0 13530 *0 0 2|0 0 544m 1.42g 271m 0 test:80.4% 0 0|0 0|1 2m 3k 6 12:10:51
*0 *0 14127 *0 0 1|0 0 544m 1.42g 274m 0 test:81.2% 0 0|0 0|1 2m 3k 6 12:10:52
*0 *0 13734 *0 0 1|0 0 544m 1.42g 270m 0 test:80.8% 0 0|0 0|1 2m 3k 6 12:10:53
*0 *0 13305 *0 0 1|0 0 544m 1.42g 268m 0 test:81.3% 0 0|0 0|1 2m 3k 6 12:10:54
*0 *0 13575 *0 0 1|0 0 544m 1.42g 269m 0 test:80.9% 0 0|0 0|1 2m 3k 6 12:10:55
*0 *0 13735 *0 0 2|0 0 544m 1.42g 272m 0 test:80.2% 0 0|0 0|1 2m 3k 6 12:10:56
*0 *0 13809 *0 0 1|0 0 544m 1.42g 257m 0 test:80.5% 0 0|0 0|1 2m 3k 6 12:10:57
*0 *0 13896 *0 0 1|0 0 544m 1.42g 252m 0 test:81.3% 0 0|0 0|1 2m 3k 6 12:10:58
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time
*0 *0 13207 *0 0 1|0 0 544m 1.42g 274m 0 test:78.0% 0 0|0 0|0 2m 3k 6 12:10:59
*0 *0 14075 *0 0 1|0 0 544m 1.42g 276m 0 test:81.1% 0 0|0 0|1 2m 3k 6 12:11:00
*0 *0 11833 *0 0 2|0 0 544m 1.42g 273m 0 test:70.9% 0 0|0 0|1 2m 3k 6 12:11:01
*0 *0 13540 *0 0 1|0 0 544m 1.42g 271m 0 test:81.0% 0 0|0 0|1 2m 3k 6 12:11:02
*0 *0 13762 *0 0 1|0 0 544m 1.42g 272m 0 test:80.8% 0 0|0 0|1 2m 3k 6 12:11:03
*0 *0 13535 *0 0 1|0 0 544m 1.42g 275m 0 test:79.3% 0 0|0 0|1 2m 3k 6 12:11:04
*0 *0 13584 *0 0 1|0 0 544m 1.42g 265m 0 test:80.1% 0 0|0 0|1 2m 3k 6 12:11:05
*0 *0 9272 *0 0 2|0 0 544m 1.42g 275m 0 test:54.3% 0 0|0 0|1 1m 3k 6 12:11:06
*0 *0 8524 *0 0 1|0 0 544m 1.42g 271m 0 test:52.8% 0 0|0 0|1 1m 3k 6 12:11:07
*0 *0 13772 *0 0 1|0 0 544m 1.42g 272m 0 test:81.6% 0 0|0 0|1 2m 3k 6 12:11:08
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time
*0 *0 11479 *0 0 1|0 0 544m 1.42g 271m 0 test:65.8% 0 1|0 0|1 2m 3k 6 12:11:09
*0 *0 13835 *0 0 1|0 0 544m 1.42g 252m 0 test:80.8% 0 0|0 0|1 2m 3k 6 12:11:10
*0 *0 13597 *0 0 2|0 0 544m 1.42g 276m 0 test:80.2% 0 0|0 0|1 2m 3k 6 12:11:11
*0 *0 13704 *0 0 1|0 0 544m 1.42g 275m 0 test:80.9% 0 0|0 0|1 2m 3k 6 12:11:12
*0 *0 14127 *0 0 1|0 0 544m 1.42g 279m 0 test:81.2% 0 0|0 0|1 2m 3k 6 12:11:13
*0 *0 13144 *0 0 1|0 0 544m 1.42g 275m 0 test:78.1% 0 0|0 0|1 2m 3k 6 12:11:14
*0 *0 13680 *0 0 1|0 0 544m 1.42g 273m 0 test:80.9% 0 0|0 0|1 2m 3k 6 12:11:15
*0 *0 13491 *0 0 2|0 0 544m 1.42g 273m 0 test:78.9% 0 0|0 0|0 2m 3k 6 12:11:16
*0 *0 *0 *0 0 1|0 0 544m 1.42g 265m 0 .:0.1% 0 0|0 0|0 62b 3k 5 12:11:17
*0 1 *0 *0 0 13|0 0 544m 1.42g 258m 0 config:0.1% 0 0|0 0|0 892b 11k 5 12:11:18
阻塞率为 80%,但我想这是正常的,因为我每秒更新插入 13K 条记录。
块引用 任何想法为什么会发生这种性能损失?我可以在数据库中查找/监视什么?
您可能想要运行 mongostat (http://docs.mongodb.org/manual/reference/program/mongostat/
):mongostat --username <user> --password <pass>
并注意故障的数量,如果不是零,您的工作集不适合内存,因此数据访问变得非常慢。解决方案是使用索引,提供更多RAM和/或开始分片数据库
使用不同的数据库。当前版本的MongoDB具有数据库级锁定,因此无需对所有版本使用test
,只需使用test1
,test2
,testN
...
还可以尝试在旧版驱动程序(计划在下一版本中)中使用批量 api,以避免网络往返。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- std::p mr::memory_resource 如何与 std::container 产生性能差异?
- 不同的类或结构初始化方法之间的性能差异是什么?