涉及三個檔案file-max,file-nr和nr-open。
file-max定義了linux核心可分配的最大數量的檔案控制代碼,當檢測到檔案控制代碼耗盡時,需要增加file-max值。
/ # cat /proc/sys/fs/file-max
1597700
核心函式files_maxfiles_init計算系統預設的最大檔案數量,依據是每個檔案及與其關聯的inode和dcache結構,總的大小約為1k。預設檔案占用的空間不超出記憶體的10%,file-max的最小值為nr_file,即8192個。
void __init files_maxfiles_init(void)
#define nr_file 8192 /* this can well be larger on a larger system */
在核心的檔案分配函式中,呼叫alloc_empty_file判斷當前開啟的檔案數量是否已經超出限定的最大檔案數量(files_stat.max_files),將會顯示資訊:「vfs: file-max limit %lu reached」。
struct file *alloc_empty_file(int flags, const struct cred *cred)
f = __alloc_file(flags, cred);
if (!is_err(f)) percpu_counter_inc(&nr_files);
return f;
over:
/* ran out of filps - report that */
if (get_nr_files() > old_max)
return err_ptr(-enfile);
如下函式get_max_files用於獲取核心設定的最大檔案數量。
/* return the maximum number of open files in the system
*/unsigned long get_max_files(void)
歷史上,核心可以動態的分配檔案控制代碼,但是不能進行釋放。file-nr檔案中的三個值分別表示:分配的檔案控制代碼數量,已分配但是未使用的控制代碼數量,以及最大的檔案控制代碼數量。在核心版本2.6之後,第二個值總是為零,意味著分配的檔案控制代碼數量與使用的控制代碼數量完全相同。
/ # cat /proc/sys/fs/file-nr
20160 0 1597700
nr_open表示單個程序可分配的檔案控制代碼數量,預設值為:1024*1024 (1048576)。實際的數量還受到rlimit_nofile定義的資源項限制。
/ # cat /proc/sys/fs/nr_open
1048576
如下,將檔案數量限制在1024。
$ ulimit -a
open files (-n) 1024
在核心檔案fs/file.c中,將nr_open預設為:1024*1024。
unsigned int sysctl_nr_open __read_mostly = 1024*1024;
核心版本 5.0 Linux檔案控制代碼占用數量檢視與設定
安裝lsof yum install lsof 檢視執行緒佔控制代碼數 ulimit a 檢視系統開啟控制代碼最大數量 more proc sys fs file max 1檢視開啟控制代碼總數 lsof awk wc l 1根據開啟檔案控制代碼的數量降序排列,其中第二列為程序id lsof awk...
獲取程序控制代碼的數量
unit unit1 inte ce uses winapi.windows,winapi.messages,system.sysutils,system.variants,system.classes,vcl.graphics,vcl.controls,vcl.forms,vcl.dialogs,...
Windows核心程式設計 控制代碼和偽控制代碼
getcurrentprocess duplicatehandle window中為什麼會有控制代碼的概念 從visual c 的標頭檔案來看,handle被typedef為void的指標,那是指向未確定資料結構的指標 typedef void handle 但是這並不說明任何問題,因為控制代碼遠遠...