我正在编写一个迁移程序,使用Perl和MongoDB将一个数据库集合中的数据转换为另一个数据库集合。数以百万计的文档需要转换,性能也很差(这需要几周的时间才能完成,这是不可接受的)。因此,我想使用并行::TaskManager来创建多个进程来并行地进行转换。性能从OK开始,然后快速下降,然后我开始得到以下错误:
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降低了sudo sysctl -w net.ipv4.tcp_keepalive_time=120,并重新启动了我的单神。这是我的设置的细节
不知道如何读取它,但下面是错误发生时的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个似乎可以减少超时错误的数量,但代价是吞吐量。
发布于 2016-02-01 18:41:38
调优建议都没有帮助,批量插入也没有帮助。
我继续调查,问题的根源在于我的流程正在执行许多"$addToSet“操作,这些操作在大数组中会变得很慢。因此,我的I使用所有可用的套接字,更新速度慢。我重新构造了我的文档,这样我就不会使用可能变得很大的数组,并且返回到一个可以接受的插入速率。
https://stackoverflow.com/questions/34774405
复制相似问题