萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> Linux 下應用程序最大打開文件數的理解和修改

Linux 下應用程序最大打開文件數的理解和修改

   運行在Linux系統上的Java程序運行了一段時間後出現"Too many open files"的異常情況。

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

Linux 下應用程序最大打開文件數的理解和修改 三聯

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

  系統級:

  系統級設置對所有用戶有效。可通過兩種方式查看系統最大文件限制

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

  2 sysctl -a 查看結果中fs.file-max這項的配置數量

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

  配置完成後使用sysctl -p來通知系統啟用這項配置

  用戶級:

  Linux限制每個登錄用戶的可連接文件數。可通過 ulimit -n來查看當前有效設置。如果想修改這個值就使用 ulimit -n 命令。

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

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

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

  lsof -p $java_pid | wc -l 當前Java進程file descriptor table中FD的總量

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

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

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

  vim /etc/security/limits.conf

  # 添加如下的行

  * soft nofile 2048

  * hard nofile 2048

  以下是說明:

  * 代表針對所有用戶

  noproc 是代表最大進程數

  nofile 是代表最大文件打開數

  添加格式:

  [username | @groupname] type resource limit

  [username | @groupname]:設置需要被限制的用戶名,組名前面加@和用戶名區別。也可以用通配符*來做所有用戶的限制。

  type:有 soft,hard 和 -,soft 指的是當前系統生效的設置值。hard 表明系統中所能設定的最大值。soft 的限制不能比hard 限制高。用 - 就表明同時設置了 soft 和 hard 的值。

  resource:

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

  date - 最大數據大小(kb)

  fsize - 最大文件大小(kb)

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

  nofile - 打開文件的最大數目

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

  stack - 最大棧大小(kb)

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

  noproc - 進程的最大數目

  as - 地址空間限制

  maxlogins - 此用戶允許登錄的最大數目

  實例:

  username soft nofile 2048

  username hard nofile 2048

  @groupname soft nofile 2048

  @groupname hard nofile 2048

copyright © 萬盛學電腦網 all rights reserved