系統(tǒng)級的限制:/proc/sys/fs/file-max中設(shè)定了系統(tǒng)最大能打開的文件數(shù)。
查看該值可以用如下方式:
[root@#panda ~]# cat /proc/sys/fs/file-max
655351
[root@#panda ~]# sysctl fs.file-max
fs.file-max = 655351
[root@#panda ~]#
修改該值可以用如下方式:
[root@#panda ~]# echo 655300 > /proc/sys/fs/file-max
[root@#panda ~]# sysctl fs.file-max
fs.file-max = 655300
[root@#panda ~]# sysctl -w fs.file-max=655350
fs.file-max = 655350
[root@#panda ~]# sysctl fs.file-max
fs.file-max = 655350
[root@#panda ~]#
上面方式修改的值會立即生效但是機器重啟后又會失效。永久生效的修改可以用下面的方式:
[root@#panda etc]# echo fs.file-max=524288 >> /etc/sysctl.conf
[root@#panda etc]# sysctl fs.file-max
fs.file-max = 655350
[root@#panda etc]# sysctl -p
fs.file-max = 524288
[root@#panda etc]# sysctl fs.file-max
fs.file-max = 524288
[root@#panda etc]#
執(zhí)行了sysctl -p 命令之后 sysctl.conf中的修改才能立即生效。
還有一個問題是file-max最大能設(shè)置多大呢?當(dāng)然你可以把它往大了設(shè),但是同時打開的文件描述符越多,內(nèi)存開銷就越大。那怎樣設(shè)置一個合理的上限呢?一個經(jīng)驗算法是 256個fd 需4M內(nèi)存。例如8G內(nèi)存,8*1024/4*256=524288。
用戶級的限制:/etc/security/limits.conf 可以添加用戶使用資源的限制
設(shè)置格式為:
username|@groupname type resource limit
username|@groupname:設(shè)置需要被限制的用戶名,組名前面加@和用戶名區(qū)別。也可以用通配符*來做所有用戶的限制。
type:有 soft,hard 和 -,soft 指的是當(dāng)前系統(tǒng)生效的設(shè)置值。hard 表明系統(tǒng)中所能設(shè)定的最大值。soft 的限制不能比hard 限制高。用 - 就表明同時設(shè)置了 soft 和 hard 的值
resource: 為資源類型有多種。 nofile為最大打開文件數(shù)。
例如:* - nofile 655350 將所有用戶的最大打開文件數(shù)的soft和hard都設(shè)為655350
對/etc/security/limit.conf的修改會在新的會話期中生效
會話級的限制:ulimit 命令查看和設(shè)置當(dāng)前會話期的資源限制
ulimit -Sn 查看會話期最大文件描述符soft限制
ulimit -Hn 查看會話期最大文件描述符hard限制,hard限制是soft的上限。
ulimit -Sn 2046 限制當(dāng)前會話期內(nèi)能打開的文件數(shù)為2046(如果其中一個進程打開了2046個,其他進程再打文件都將失?。?br> ulimit -Sn 查看到的默認1024,用ulimit所做的修改在會話期結(jié)束后都將失效。那如何讓對會話級的資源限制設(shè)置永久生效呢?可以把ulimit 命令放到會話建立時初始化的過程中執(zhí)行,這樣每次會話期就都自動執(zhí)行命令修改設(shè)置了。例如在用戶目錄下的.bashrc 中加入一行 ulimit -Sn 2046,要對所有用戶都生效則可在/etc/profile中加入一行命令 ulimit -Sn 2046。容易被忽略的一點是,如果我們設(shè)置了用戶級的限制,新建的會話期的資源限制的初值(ulimit -Sn 查看到的)是從用戶級的限制值(/etc/security/limit.conf中設(shè)置的值)繼承過來的。
進程級的管理:進程可以調(diào)用getrlimit和setrlimit來設(shè)置和修改對應(yīng)資源的限制。
例如:
rlimit tmp={4095,4096};
setrlimit(RLIMIT_NOFILE,&tmp); //設(shè)置進程打開文件數(shù)的軟硬限制分別為4095,4096
總結(jié):單個進程最大能使用的文件描述符是由系統(tǒng)限制,用戶限制,會話期限制,進程限制值中最小的那個決定的。如果我們在一臺機器上部署了自己的網(wǎng)絡(luò)服務(wù),我們只需按下面步驟修改就可以了:
1. 計算 fdmax = 物理內(nèi)存大小(m為單位) / 4 * 256 假設(shè)內(nèi)存為8G,fdmax=524288
2. 執(zhí)行命令: echo fs.file-max=524288 >> /etc/sysctl.conf
3. 執(zhí)行命令: sysctl -p
4. 執(zhí)行命令: echo * soft nofile 524286 >> /etc/security/limits.conf
5. 執(zhí)行命令: echo * hard nofile 524287 >> /etc/security/limits.conf
5. 結(jié)束當(dāng)前會話期
6. 啟動新的會話
7.啟動我們的服務(wù)