MongoDB之Too many open files【參考】

在Linux下有時會遇到cannot open /dev/urandom Too many open files的問題。其實Linux是有文件句柄限制的,並且Linux默認通常都是1024(阿里雲主機默認是65535)。在生產環境中很容易到達這個值,所以這裏就會成爲系統的瓶頸,對於MongoDB來講,默認的文件打開數通常是不夠的,須要使用ulimit去進行設置,如下是常見的MongoDB的最大打開文件數不足的報錯。html

-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命令用途mysql

1. 利用ulimit命令能夠對資源的可用性進行控,Linux系統打開文件最大數量限制(進程打開的最大文件句柄數設置)。linux

2. -H選項和-S選項分別表示對給定資源的硬限制(hard limit)和軟限制(soft limit)進行設置。redis

3. 硬限制(hard limit)一旦被設置之後就不能被非root用戶修改,軟限制(soft limit)能夠增加達到硬限制(hard limit)。sql

4. 若是既沒有指定-H選項也沒有指定-S選項,那麼硬限制(hard limit)和軟限制(soft limit)都會被設置。mongodb

5. limit的值能夠是一個數值,也能夠是一些特定的值,好比:hard,soft,unlimited,分別表明當前硬件限制、當前軟件限制、不限制。服務器

6. 若是limit參數被省略,除非指定-H選項,不然資源當前的軟限制(soft limit)將會被打印出來。網絡

2. 查看文件最大打開數量限制dom

 

複製代碼

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. 查看某個進程已經打開的文件數ide

 

複製代碼

[root@hotcoin-mongodb-primary ~]# ps -ef|grep -i "[m]ongod" 查看進程ID,目前MongoDB的pid進程號是4842
root 791 1 0 Jan31 ? 00:00:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid -H hotcoin-mongodb-primary eth0
root 961 1 0 Jan31 ? 00:00:00 /sbin/dhclient -q -lf /var/lib/dhclient/dhclient--eth1.lease -pf /var/run/dhclient-eth1.pid -H hotcoin-mongodb-primary eth1
mongod 4842 1 99 Jan31 ? 1-10:26:55 mongod -f /mongodb/27017/conf/mongo.conf
[root@hotcoin-mongodb-primary ~]# cat /proc/4842/limits 查看4842進程號的相關的ulimit的信息
Limit Soft Limit Hard Limit Units 
Max cpu time unlimited unlimited seconds 
Max file size unlimited unlimited bytes 
Max data size unlimited unlimited bytes 
Max stack size 8388608 unlimited bytes 
Max core file size 0 unlimited bytes 
Max resident set unlimited unlimited bytes 
Max processes 655350 655350 processes 
Max open files 655350 655350 files 
Max locked memory 65536 65536 bytes 
Max address space unlimited unlimited bytes 
Max file locks unlimited unlimited locks 
Max pending signals 63471 63471 signals 
Max msgqueue size 819200 819200 bytes 
Max nice priority 0 0 
Max realtime priority 0 0 
Max realtime timeout unlimited unlimited us 
[root@hotcoin-mongodb-primary ~]# cat /proc/4842/limits |grep files
Max open files 655350 655350 files 
[root@hotcoin-mongodb-primary ~]# ll /proc/4842/fd | wc -l 查看4842進程打開了多少文件
76977

複製代碼

 

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"  >> /etc/security/limits.conf
4 echo "* hard nofile 65535"  >> /etc/security/limits.conf
5 * 表示所用的用戶

 

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使用

相關文章
相關標籤/搜索