首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MultiProcess Perl程序超时到MongoDB的连接

MultiProcess Perl程序超时到MongoDB的连接
EN

Stack Overflow用户
提问于 2016-01-13 18:33:10
回答 1查看 461关注 0票数 1

我正在编写一个迁移程序,使用Perl和MongoDB将一个数据库集合中的数据转换为另一个数据库集合。数以百万计的文档需要转换,性能也很差(这需要几周的时间才能完成,这是不可接受的)。因此,我想使用并行::TaskManager来创建多个进程来并行地进行转换。性能从OK开始,然后快速下降,然后我开始得到以下错误:

代码语言:javascript
复制
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降低了sudo sysctl -w net.ipv4.tcp_keepalive_time=120,并重新启动了我的单神。
  2. 我减少了max_time_ms (这使事情变得更糟)

这是我的设置的细节

  • 单神,没有复制或切分。
  • 这两个数据库都在此服务器上,perl程序正在对原始数据库进行迭代,并对文档中的数据进行一些处理,并写入新数据库中的3个集合。
  • 使用MongoDB::Client访问原始数据库,使用Meerkat写入新数据库。write_safety为两者设置为零。

不知道如何读取它,但下面是错误发生时的mongostat的一个片段:

代码语言:javascript
复制
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个似乎可以减少超时错误的数量,但代价是吞吐量。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-01 18:41:38

调优建议都没有帮助,批量插入也没有帮助。

我继续调查,问题的根源在于我的流程正在执行许多"$addToSet“操作,这些操作在大数组中会变得很慢。因此,我的I使用所有可用的套接字,更新速度慢。我重新构造了我的文档,这样我就不会使用可能变得很大的数组,并且返回到一个可以接受的插入速率。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34774405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档