技術(shù)員聯(lián)盟提供win764位系統(tǒng)下載,win10,win7,xp,裝機(jī)純凈版,64位旗艦版,綠色軟件,免費(fèi)軟件下載基地!

當(dāng)前位置:主頁(yè) > 教程 > 服務(wù)器類(lèi) >

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

來(lái)源:技術(shù)員聯(lián)盟┆發(fā)布時(shí)間:2019-02-27 00:28┆點(diǎn)擊:

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

Linux 下應(yīng)用程序最大打開(kāi)文件數(shù)的理解和修改 三聯(lián)

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

  系統(tǒng)級(jí):

  系統(tǒng)級(jí)設(shè)置對(duì)所有用戶(hù)有效??赏ㄟ^(guò)兩種方式查看系統(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來(lái)通知系統(tǒng)啟用這項(xiàng)配置

  用戶(hù)級(jí):

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

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

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

  lsof -p $java_pid 每個(gè)文件描述符的具體屬性

  lsof -p $java_pid | wc -l 當(dāng)前Java進(jìn)程file descriptor table中FD的總量

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

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

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

  vim /etc/security/limits.conf

  # 添加如下的行

  * soft nofile 2048

  * hard nofile 2048

  以下是說(shuō)明:

  * 代表針對(duì)所有用戶(hù)

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

  nofile 是代表最大文件打開(kāi)數(shù)

  添加格式:

  [username | @groupname] type resource limit

  [username | @groupname]:設(shè)置需要被限制的用戶(hù)名,組名前面加@和用戶(hù)名區(qū)別。也可以用通配符*來(lái)做所有用戶(hù)的限制。

  type:有 soft,hard 和 -,soft 指的是當(dāng)前系統(tǒng)生效的設(shè)置值。hard 表明系統(tǒng)中所能設(shè)定的最大值。soft 的限制不能比hard 限制高。用 - 就表明同時(shí)設(shè)置了 soft 和 hard 的值。

  resource:

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

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

  fsize - 最大文件大小(kb)

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

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

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

  stack - 最大棧大小(kb)

  cpu - 以分鐘為單位的最多 CPU 時(shí)間

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

  as - 地址空間限制

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

  實(shí)例:

  username soft nofile 2048

  username hard nofile 2048

  @groupname soft nofile 2048

  @groupname hard nofile 2048