您好,登錄后才能下訂單哦!
如何解決MongoDB中Toomanyopenfiles問題,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
在Linux下有時會遇到cannot open /dev/urandom Too many open files的問題。其實Linux是有文件句柄限制的,而且Linux默認一般都是1024(阿里云主機默認是65535)。在生產環境中很容易到達這個值,因此這里就會成為系統的瓶頸,對于MongoDB來說,默認的文件打開數一般是不夠的,需要使用ulimit去進行設置,以下是常見的MongoDB的最大打開文件數不足的報錯。
-server: log pre-alloc server error: Too many open files 2019-01-31T22:18:26.744+0800 E STORAGE [thread1] WiredTiger (24) [1548944306:744242][5485:0x7f03b00ea700], log-server: log server error: Too many open files 2019-01-31T22:18:27.518+0800 E - [conn51828] cannot open /dev/urandom Too many open files
1. ulimt命令用途
1. 利用ulimit命令可以對資源的可用性進行控,Linux系統打開文件最大數量限制(進程打開的最大文件句柄數設置)。
2. -H選項和-S選項分別表示對給定資源的硬限制(hard limit)和軟限制(soft limit)進行設置。
3. 硬限制(hard limit)一旦被設置以后就不能被非root用戶修改,軟限制(soft limit)可以增長達到硬限制(hard limit)。
4. 如果既沒有指定-H選項也沒有指定-S選項,那么硬限制(hard limit)和軟限制(soft limit)都會被設置。
5. limit的值可以是一個數值,也可以是一些特定的值,比如:hard,soft,unlimited,分別代表當前硬件限制、當前軟件限制、不限制。
6. 如果limit參數被省略,除非指定-H選項,否則資源當前的軟限制(soft limit)將會被打印出來。
2. 查看文件最大打開數量限制
1 [root@redis-mysql ~]# cat /proc/sys/fs/file-max file-max(系統級別)是設置系統所有進程一共可以打開的最大文件數量。同時一些程序可以通過setrlimit調用,設置每個進程的限制。如果得到大量使用完文件句柄的錯誤信息,應該增加這個值 2 184337 3 [root@redis-mysql ~]# ulimit -n 查看用戶級的限制,阿里云服務器一般是65535 4 65535 5 [root@redis-mysql ~]# ulimit -a 查看當前的各種用戶進程限制 6 core file size (blocks, -c) 0 7 data seg size (kbytes, -d) unlimited 8 scheduling priority (-e) 0 9 file size (blocks, -f) unlimited 10 pending signals (-i) 7282 11 max locked memory (kbytes, -l) 64 12 max memory size (kbytes, -m) unlimited 13 open files (-n) 65535 linux操作系統對一個進程打開的文件句柄數量的限制(也包含打開的套接字數量),只是對用戶級別的限制 14 pipe size (512 bytes, -p) 8 15 POSIX message queues (bytes, -q) 819200 16 real-time priority (-r) 0 17 stack size (kbytes, -s) 8192 18 cpu time (seconds, -t) unlimited 19 max user processes (-u) 7282 20 virtual memory (kbytes, -v) unlimited 21 file locks (-x) unlimited
3. 查看某個進程已經打開的文件數
[root@hotcoin-mongodb-primary ~]# ps -ef|grep -i "[m]ongod"> 4. 臨時修改ulimit的文件限制ulimit -SHn 10000 其實ulimit 命令身是分軟限制和硬限制,加-H就是硬限制,加-S就是軟限制。默認顯示的是軟限制,如果運行ulimit 命令修改時沒有加上-H或-S,就是兩個參數一起改變。軟限制和硬限制的區別?硬限制就是實際的限制,而軟限制是警告限制,它只會給出警告。 5. 永久生效要想ulimits 的數值永久生效,必須修改配置文件/etc/security/limits.conf,在該配置文件中添加以下內容 1 * soft nofile 65535 2 * hard nofile 65535 3 echo "* soft nofile 65535"> 6. 修改系統的總的限制其實上面的修改都是對一個進程打開的文件句柄數量的限制,我們還需要設置系統的總限制才可以。假如,我們設置進程打開的文件句柄數是1024 ,但是系統總線制才500,所以所有進程最多能打開文件句柄數量500。從這里我們可以看出只設置進程的打開文件句柄的數量是不行的。所以需要修改系統的總限制才可以。echo 6553560 > /proc/sys/fs/file-max上面是臨時生效方法,重啟機器后會失效;永久生效方法:修改 /etc/sysctl.conf, 加入fs.file-max = 6553560 重啟生效 7. MongoDB中的設置-生產(nproc和nofile需要同時設置,不然登錄會出現警告) 1 [root@hotcoin-mongodb-primary ~]# tail -10 /etc/security/limits.conf 2 3 # End of file 4 root soft nofile 655350 5 root hard nofile 655350 6 * soft nofile 655350 7 * hard nofile 655350 8 * soft nproc 655350 9 * hard nproc 655350 10 mongod soft nofile 655350 11 mongod soft nproc 655350 12 [root@hotcoin-mongodb-primary ~]# cat /proc/sys/fs/file-max 13 1610694 說明:* 代表針對所有用戶,noproc 是代表最大進程數,nofile 是代表最大文件打開數,"mongod soft nofile 655350"簡單點理解就是mongod用戶能打開的最大文件數量是655350。 8. MongoDB需要的最大文件打開數量計算-WiredTiger引擎MongoDB的WiredTiger的工作原理跟MMAPv1不太一樣,一個集合一個文件,一個索引一個文件。所以一共有多少集合,至少就會有集合數量x2個打開文件(以1集合文件+1索引文件計算)被占用。再考慮到網絡連接數量,要保證足夠大的open files值。 參考資料 Too many open files的四種解決辦法linux中ulimit作用Linux-ulimit使用
看完上述內容,你們掌握如何解決MongoDB中Toomanyopenfiles問題的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。