核心檔案控制代碼數量

2021-10-09 01:33:47 字數 1687 閱讀 6163

涉及三個檔案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 但是這並不說明任何問題,因為控制代碼遠遠...