我正在編寫一個遷移程序,將一個數據庫集合中的數據轉換爲使用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.
所以我懷疑的是,這是由於不讓插座不夠快的去產生的進程。我不知道如何解決這個問題,但實際上這是問題所在。
我已經試過什麼:
- 我通過
sudo sysctl -w net.ipv4.tcp_keepalive_time=120
減少tcp_keepalive_time並重新啓動我的mongod - 我減少了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似乎減少了超時錯誤的數量,但是以吞吐量爲代價。
如何添加文檔?你有沒有考慮過做批量插入? http://www.journaldev.com/6318/mongodb-batchbulk-insert-example-using-mongo-shell-and-java-driver – KeepCalmAndCarryOn
是的,我正在研究一種可以批量插入的替代方案,但是從我的分析到目前爲止,似乎大部分問題都在等待套接字釋放。 – Todd