MultiProcess Perl程序定时连接到MongoDB

时间:2016-01-13 18:33:11

标签: mongodb perl

我正在编写一个迁移程序,使用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.

所以我怀疑这是因为产生的进程不能足够快地释放套接字。我不知道如何解决这个问题,但实际上这是问题所在。

我尝试过的事情:

  1. 我通过sudo sysctl -w net.ipv4.tcp_keepalive_time=120减少了tcp_keepalive_time并重启了我的mongod
  2. 我减少了max_time_ms(这使事情变得更糟)
  3. 我的设置详情

    • 单个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似乎减少了超时错误的数量,但是以吞吐量为代价。

1 个答案:

答案 0 :(得分:1)

没有任何调整建议有帮助,批量插入也没有。

我继续调查,问题的根源是我的进程正在执行许多“$ addToSet”操作,这对大型数组来说可能会变慢。所以我正在消耗所有可用的套接字,并且更新速度很慢。我重新构建了我的文档,以便我不会使用可能变大的数组,并且我恢复到可接受的插入速率。