我正在编写一个迁移程序,使用Perl和MongoDB将一个数据库集合中的数据转换为另一个数据库集合。数以百万计的文件需要转变,表现非常糟糕(完成需要数周时间,这是不可接受的)。所以我想使用Parallel :: TaskManager创建多个进程来并行进行转换。性能开始正常,然后迅速关闭,然后我开始收到以下错误:
update error: MongoDB::NetworkTimeout: Timed out while waiting for socket to become ready for reading
at /usr/local/share/perl/5.18.2/Meerkat/Collection.pm line 322.
update error: MongoDB::NetworkTimeout: Timed out while waiting for socket to become ready for reading
at /usr/local/share/perl/5.18.2/Meerkat/Collection.pm line 322.
所以我怀疑这是因为产生的进程不能足够快地释放套接字。我不知道如何解决这个问题,但实际上这是问题所在。
我尝试过的事情:
sudo sysctl -w net.ipv4.tcp_keepalive_time=120
减少了tcp_keepalive_time并重启了我的mongod 我的设置详情
单个Mongod,无复制或分片。
两个数据库都在这个服务器上,perl程序正在迭代 原始数据库并对该数据进行一些处理 记录并写入新数据库中的3个馆藏。
使用MongoDB :: Client访问原始数据库并使用Meerkat 写入新数据库。 write_safety设置为零。
不确定如何阅读此内容,但此处是错误发生时的一段mongostat:
insert query update delete getmore command % dirty % used flushes vsize res qr|qw ar|aw netIn netOut conn time
*0 *0 *0 *0 0 1|0 0.0 0.3 0 20.4G 9.4G 0|0 1|35 79b 15k 39 11:10:37
*0 3 8 *0 0 11|0 0.0 0.3 0 20.4G 9.4G 0|0 2|35 5k 18k 39 11:10:38
*0 3 1 *0 1 5|0 0.1 0.3 0 20.4G 9.4G 0|0 1|35 2k 15m 39 11:10:39
*0 12 4 *0 1 13|0 0.1 0.3 0 20.4G 9.4G 0|0 2|35 9k 577k 43 11:10:40
*0 3 1 *0 3 5|0 0.1 0.3 0 20.4G 9.4G 0|0 1|34 2k 10m 43 11:10:41
*0 3 8 *0 1 10|0 0.1 0.3 0 20.4G 9.4G 0|0 2|34 5k 2m 43 11:10:42
*0 9 24 *0 0 29|0 0.1 0.3 0 20.4G 9.4G 0|0 5|34 13k 24k 43 11:10:43
*0 3 8 *0 0 10|0 0.1 0.3 0 20.4G 9.4G 0|0 5|35 4k 12m 43 11:10:44
*0 3 8 *0 0 11|0 0.1 0.3 0 20.4G 9.4G 0|0 5|35 5k 12m 42 11:10:45
*0 *0 *0 *0 0 2|0 0.1 0.3 0 20.4G 9.3G 0|0 4|35 211b 12m 42 11:10:46
如果您希望查看任何其他信息以帮助我诊断此问题,请与我们联系。
将并行运行的进程数从8(或更多)减少到3似乎减少了超时错误的数量,但是以吞吐量为代价。
答案 0 :(得分:1)
没有任何调整建议有帮助,批量插入也没有。
我继续调查,问题的根源是我的进程正在执行许多“$ addToSet”操作,这对大型数组来说可能会变慢。所以我正在消耗所有可用的套接字,并且更新速度很慢。我重新构建了我的文档,以便我不会使用可能变大的数组,并且我恢复到可接受的插入速率。