Linux 打開文件數1024限制的原理以及解決辦法

/proc/sys/fs/file-max 

該文件指定了可以分配的文件句柄的最大數目。

查看最大值:

[root@localhost home]# cat /proc/sys/fs/file-max 
100977
[root@localhost home]#

這 表明這臺Linux系統最多允許同時打開(即包含所有用戶打開文件數總和)100977個文件,是Linux系統級硬限制,所有用戶級的打開文件數限制都 不應超過這個數值。通常這個系統級硬限制是Linux系統在啓動時根據系統硬件資源狀況計算出來的最佳的最大同時打開文件數限制,如果沒有特殊需要,不應 該修改此限制,除非想爲用戶級打開文件數限制設置超過此限制的值。這個參數的默認值是跟內存大小有關係的,增加物理內存以後重啓機器,這個值會增大。大約1G內存10萬個句柄的線性關係。

修改值:

如果用戶得到的錯誤消息聲明,類似”too many open files”,這是由於打開文件數已經達到了最大值,從而他們不能打開更多文件,則可能需要增加該值。

[root@localhost home]# vim /etc/rc.local 

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don‘t
# want to do the full Sys V style init stuff.
echo 222158 > /proc/sys/fs/file-max    ;添加此項,修改file-max值
touch /var/lock/subsys/local
[root@localhost home]# reboot
[root@localhost ~]# cat /proc/sys/fs/file-max 
222158
[root@localhost ~]#

修改此硬限制的方法是修改/etc/rc.local腳本,在腳本中添加如下行:
echo 22158 > /proc/sys/fs/file-max
這是讓Linux在啓動完成後強行將系統級打開文件數硬限制設置爲22158。修改完後保存此文件。

/proc/sys/fs/file-nr 

該文件與 file-max 相關,它有三個值: 
已分配文件句柄的數目     已使用文件句柄的數目     文件句柄的最大數目 
該文件是隻讀的,僅用於顯示信息。

[root@localhost ~]# cat /proc/sys/fs/file-nr 
2112	0	222158
[root@localhost ~]#

/etc/security/limits.conf

limits.conf的格式如下:  

<domain>      <type>  <item>         <value>

<domain> :可以指定單個用戶名、@組名、所有用戶(*)

type:有 soft(指的是當前系統生效的設置值),hard(表明系統中所能設定的最大值)和 -(表明同時設置了 soft 和 hard 的值)

[root@localhost ~]# vim /etc/security/limits.conf   ;文末添加以下兩項
* hard nofile 4096      
* soft nofile 4096
:wq

我的是RedHat5.4修改後需要重新登陸,有的系統可能需要重啓生效,

使 limits.conf 文件配置生效,必須要確保 pam_limits.so 文件被加入到啓動文件中。查看 /etc/pam.d/login 文件中是否有以下選項:

[root@localhost ~]# cat /etc/pam.d/login |grep "pam_limits.so"
session required /lib/security/pam_limits.so
[root@localhost ~]#

這 是告訴Linux在用戶完成系統登錄後,應該調用pam_limits.so模塊來設置系統對該用戶可使用的各種資源數量的最大限制(包括用戶可打開的最 大文件數限制),而pam_limits.so模塊就會從/etc/security/limits.conf文件中讀取配置來設置這些限制值。


linux下面部署應用的時候,有時候會遇上socket/file: can‘t open so many files的問題,其實linux是有文件句柄限制的(就像winxp?),而且默認不是很高,一般都是1024,作爲一臺生產服務器,其實很容易就達到這個數量,因此我們需要修改上述文件把這個值改大一些。

[root@localhost ~]# cat /proc/sys/fs/file-max 
100977
[root@localhost ~]# cat /proc/sys/fs/file-nr 
2112	0	100977
[root@localhost ~]# ulimit -a    ;顯示目前資源限制的設定
core file size          (blocks, -c) 0   
data seg size           (kbytes, -d) unlimited  
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited  
pending signals                 (-i) 7922
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7922
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[root@localhost ~]# ulimit -n
1024
[root@localhost ~]#

如果需要臨時修改文件句柄數可以使用以下操作:

[root@localhost ~]# ulimit -HSn 4096
[root@localhost ~]# ulimit -n
4096
[root@localhost ~]#

H指定了硬性大小,S指定了軟性大小,n表示設定單個進程最大的打開文件句柄數量

如何查看當前系統打開文件數最多的程序:

lsof(list open files)是一個列出當前系統打開文件的工具。在終端下輸入lsof即可顯示系統打開的文件,因爲 lsof 需要訪問核心內存和各種文件,所以必須以 root 用戶的身份運行它才能夠充分地發揮其功能。 每行顯示一個打開的文件,若不指定條件默認將顯示所有進程打開的所有文件

lsof -n 不將IP轉換爲hostname,缺省是不加上-n參數 eg:# lsof  /GTES11/

lsof -i 用以顯示符合條件的進程情況  eg:# lsof -i :22

[root@localhost ~]# lsof -n|awk ‘{print $2}‘|sort -nr|uniq -c|sort -nr|head -5
    162 1812
    149 1827
    126 1591
    107 1823
    100 1826
[root@localhost ~]#

如何查看某一程序打開文件數:lsof -p pid

[root@localhost ~]# lsof -p 1812|wc -l
163
[root@localhost ~]# lsof -p 1827|wc -l
150
[root@localhost ~]#
轉載來源:http://www.bubuko.com/infodetail-382459.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章