qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          Linux 下應(yīng)用程序最大打開文件數(shù)的理解和修改

          運(yùn)行在Linux系統(tǒng)上的Java程序運(yùn)行了一段時間后出現(xiàn)"Too many open files"的異常情況。

             這種情況常見于高并發(fā)訪問文件系統(tǒng),多線程網(wǎng)絡(luò)連接等場景。程序經(jīng)常訪問的文件、socket在Linux中都是文件file,系統(tǒng)需要記錄每個當(dāng)前訪 問file的name、location、access authority等相關(guān)信息,這樣的一個實(shí)體被稱為file entry。“open files table”(圖中橙色標(biāo)識)存儲這些file entry,以數(shù)組的形式線性管理。文件描述符(file descriptor)作為進(jìn)程到open files table的指針,也就是open files table的下標(biāo)索引,將每個進(jìn)程與它所訪問的文件關(guān)聯(lián)起來了。

             每個進(jìn)程中都有一個file descriptor table管理當(dāng)前進(jìn)程所訪問(open or create)的所有文件,文件描述符關(guān)聯(lián)著open files table中文件的file entry。細(xì)節(jié)不表,對于open files table能容納多少file entry。Linux系統(tǒng)配置open files table的文件限制,如果超過配置值,就會拒絕其它文件操作的請求,并拋出Too many open files異常。這種限制有系統(tǒng)級和用戶級之分。

            系統(tǒng)級:

            系統(tǒng)級設(shè)置對所有用戶有效??赏ㄟ^兩種方式查看系統(tǒng)最大文件限制

            1、cat /proc/sys/fs/file-max

            2、sysctl -a 查看結(jié)果中fs.file-max這項(xiàng)的配置數(shù)量

            如果需要增加配置數(shù)量就修改/etc/sysctl.conf文件,配置fs.file-max屬性,如果屬性不存在就添加。

            配置完成后使用sysctl -p來通知系統(tǒng)啟用這項(xiàng)配置

            用戶級:

            Linux限制每個登錄用戶的可連接文件數(shù)??赏ㄟ^ ulimit -n來查看當(dāng)前有效設(shè)置。如果想修改這個值就使用 ulimit -n <setting number> 命令。

            對于文件描述符增加的比例,資料推薦是以2的冪次為參考。如當(dāng)前文件描述符數(shù)量是1024,可增加到2048,如果不夠,可設(shè)置到4096,依此類推。

            在出現(xiàn)Too many open files問題后,首先得找出主要原因。最大的可能是打開的文件或是socket沒有正常關(guān)閉。為了定位問題是否由Java進(jìn)程引起,通過Java進(jìn)程號查看當(dāng)前進(jìn)程占用文件描述符情況:

          1. lsof -p $java_pid 每個文件描述符的具體屬性
          2. lsof -p $java_pid | wc -l 當(dāng)前Java進(jìn)程file descriptor table中FD的總量

            分析命令的結(jié)果,可判斷問題是否由非正常釋放資源所引起。

          如果我們只是普通用戶,只是暫時的修改ulimit -n,可以直接shell命令來修改(ulimit -n 1024000)。但是這個設(shè)置時暫時的保留!當(dāng)我們退出bash后,該值恢復(fù)原值。

            如果要永久修改ulimit,需要修改/etc/security/limits.conf。

            vim /etc/security/limits.conf

            # 添加如下的行

            *  soft nofile 2048

            *  hard nofile 2048

            以下是說明:

            * 代表針對所有用戶

            noproc 是代表最大進(jìn)程數(shù)

            nofile 是代表最大文件打開數(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:

            core - 限制內(nèi)核文件的大小(kb)

            date - 最大數(shù)據(jù)大小(kb)

            fsize - 最大文件大小(kb)

            memlock - 最大鎖定內(nèi)存地址空間(kb)

            nofile - 打開文件的最大數(shù)目

            rss - 最大持久設(shè)置大小(kb)

            stack - 最大棧大小(kb)

            cpu - 以分鐘為單位的最多 CPU 時間

            noproc - 進(jìn)程的最大數(shù)目

            as - 地址空間限制

            maxlogins - 此用戶允許登錄的最大數(shù)目

            實(shí)例:

            username soft nofile 2048

            username hard nofile 2048

            @groupname soft nofile 2048

            @groupname hard nofile 2048

          posted on 2013-05-30 10:02 順其自然EVO 閱讀(1937) 評論(0)  編輯  收藏 所屬分類: linux

          <2013年5月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 隆安县| 富平县| 富阳市| 施甸县| 千阳县| 东平县| 永城市| 禹州市| 南木林县| 英山县| 秦皇岛市| 修水县| 新乡市| 无极县| 潢川县| 南召县| 丹江口市| 长汀县| 乐平市| 湘阴县| 县级市| 綦江县| 贺州市| 古田县| 乐平市| 华安县| 鸡西市| 托里县| 美姑县| 舞钢市| 武安市| 黄龙县| 黄冈市| 门源| 称多县| 宜兴市| 沅陵县| 紫阳县| 凤山县| 桃园市| 舞阳县|