2016-01-13 15 views
1

我正在編寫一個遷移程序,將一個數據庫集合中的數據轉換爲使用Perl和MongoDB的另一個數據庫集合。數百萬份文件需要轉換,性能非常差(需要數週才能完成,這是不可接受的)。所以我想使用Parallel :: TaskManager來創建多個進程並行執行轉換。性能開始OK,然後迅速尾巴了,然後我開始得到以下錯誤:多進程Perl程序到MongoDB的時序連接

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(這更糟事項)

這裏有我的設置

細節
  • Single Mongod,no replication or shardi NG。

  • 兩個數據庫在此服務器上的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

如何添加文檔?你有沒有考慮過做批量插入? http://www.journaldev.com/6318/mongodb-batchbulk-insert-example-using-mongo-shell-and-java-driver – KeepCalmAndCarryOn

+0

是的,我正在研究一種可以批量插入的替代方案,但是從我的分析到目前爲止,似乎大部分問題都在等待套接字釋放。 – Todd

回答

1

沒有任何調整建議有幫助,也沒有批量插入。

我繼續調查,問題的根源在於我的進程正在執行許多「$ addToSet」操作,對於大型數組,這些操作可能會變慢。所以我正在使用緩慢更新的所有可用套接字。我重構了我的文檔,以便我不會使用可能變大的數組,並且返回可接受的插入速率。

相關問題