2014-01-23 112 views
0

後,我改變了貓鼬的版本號從3.5.7至3.8.4和性能了一個巨大的打擊在導入過程。此過程讀取文件中的行,並填充大約250萬行的空數據庫(無索引)。性能緩慢從3.5.7升級到3.8.4

這是我所做的唯一改變;只是升級版本。我可以來回切換並查看性能的差異。

性能命中是:1)的方法,在栓釘100%的CPU,其中,之前它跑的向上也許25%左右。 2)進入數據庫進入數據庫很慢。 3.5.7插入約10K記錄每20秒,而3.8.4似乎插入更多約1每秒。 3)nodejs似乎「消失」到CPU密集型和所有其他I/O功能被阻止(http請求等);此前該系統仍然非常有效。

很難隔離代碼,但大致這裏發生的事情:

  • 從文件中讀取一行
  • 解析它
  • 運行查詢,看看是否記錄已經存在
  • 用行中的值插入/更新記錄
  • 將現有記錄寫入已打開的文件流
  • Continu e爲文件

在猜測中的下一行,我會說這是關係到請求的方式無論是在貓鼬取決於或貓鼬本身的底層驅動程序節流的變化。我的第一個想法是嘗試處理請求正在排隊並在文件讀取中暫停的情況。這在編寫查詢結果時非常有效(當文件開始緩存寫入時暫停查詢流,然後在漏下恢復)。但我一直無法找到貓鼬在哪裏可能發出關於其背壓的信息。

我在第一時間升級的原因是由於內存泄漏誤差設定在貓鼬處理的事件,我已經閱讀是固定的(對不起,我失去了參照的是),當我得到的。

我想保持升級並找出問題。任何想法可能是什麼?是否有某個地方給出了一個通知我背壓的事件,以便我可以暫停/恢復輸入流?

回答

0

我簡單地恢復到3.5.7,解決原來的內存泄漏的警告另一種方式解決了這個。

我試圖孤立我的代碼,但最糟糕的問題,我是能夠提高較高的內存消耗(我用歸零的對象,這顯然有助於GC弄清楚什麼可以收集解決)。我開始添加不相關的代碼,但是在某些時候很明顯,問題不在於貓鼬或mongodb驅動程序本身。

我唯一的猜測是,當我升級貓鼬時,究竟是什麼導致性能問題是由於貓鼬依賴的某個庫引入了與非貓鼬相關的代碼不能很好地兼容的更改。

如果我得到它的底部,我會回來,並張貼一個更清晰的答案。