2014-01-20 55 views
4

我試圖將一個大型數據庫的轉儲導入到我本地的mongodb實例中。Mongorestore - 打開的文件太多 - mac os x

不幸的是,我發現一個問題,對於一個導入的集合,mongo引發異常,太多的文件被打開。

我使用谷歌瀏覽了互聯網的強大知識,並且發現了ulimit和launchctl的一些解決方案,但他們沒有奏效。

最後我決定以下列方式問題:

  1. 我創建/etc/launchd.conf文件,並添加有這些行:

 
    limit maxproc 512 1024 
    limit maxfiles 16384 32768 
  • 接下來我在終端執行如下行:
  •  
        sudo sysctl -w kern.maxfilesperproc=16384 
        sudo sysctl -w kern.maxfiles=32768 
    
  • 最後我重新啓動操作系統。
  • 問題不再發生,但我有問題。如果有一些解決方案來限制從mongorestore級別打開文件的數量?我不認爲爲最大打開的文件增加全局值是一個好方法。

    回答

    0

    沒有一個MongoDB特定的命令行選項來限制打開的文件數mongorestoremongod。由於MongoDB使用內存映射文件,如果您有大量數據文件或連接,則可能會超出默認的操作系統限制。

    OS X特別爲每個進程設置了256個打開文件的默認限制,而在大多數Linux發行版上,OS X的默認限制爲1024或更高。有關資源利用率和限制的更多信息,請參閱MongoDB手冊中的Resource Limits

    如果您需要打開大量文件,增加操作系統限制是解決問題的正確方法。如果您擁有大型數據庫,則還應該避免使用MongoDB配置選項,因爲此選項會增加給定數據集所需的打開文件數(通過減少每個數據文件允許的最大大小)。

    +0

    也有這個問題,有太多的命名空間,以增加內核的限制到那個水平只是爲了能夠爲一個命令設置ulimit。這看起來像一個bug:mongorestore應該在完成導入時關閉文件,這應該只是刪除問題。 對該票證的建議是使用--numParallelCollection 1,它可以解決問題(默認值爲4)。 – FGM

    1

    確實--numParallelCollections=1在OS-X上爲我解決了這個問題,而無需修改系統設置。我能夠完成以前沒有完成的完整數據庫恢復。 但是,它似乎最大限度地連接池,因爲我仍然試圖繼續時獲得 2017-06-01T16:55:19.386+0800 E NETWORK [initandlisten] Out of file descriptors. Waiting one second before trying to accept more connections. 。重新啓動mongod

    +0

    這對我沒有任何幫助。我仍然得到太多打開的文件。 –

    1

    我用這個別名來啓動mongod的不同ENV設置要求,並解決任何問題至今:

    ulimit -n 1024 && mongod

    相關問題