人們常說linux最大有65536個文件描述符,是由於常用linux內核的默認值決定的,實際上是可以通過修改內核突破的。
了解下文件描述符,內核(kernel)利用文件描述符(file descriptor)來訪問文件。文件描述符是非負整數。打開現存文件或新建文件時,內核會返回一個文件描述符。讀寫文件也需要使用文件描述符來指定待讀寫的文件。
文件描述符的有效范圍是 0 到 OPEN_MAX。一般來說,每個進程最多可以打開 64 個文件(0 — 63)。對於 FreeBSD 5.2.1、Mac OS X 10.3 和 Solaris 9 來說,每個進程最多可以打開文件的多少取決於系統內存的大小,int 的大小,以及系統管理員設定的限制。Linux 2.4.22 強制規定最多不能超過 1,048,576 。
B. 文件描述符是什麼
問題一:文件描述符和文件指針的區別 文件描述符:在linux系統中打開文件就會獲得文件描述符,它是個很小的正整數。每個進程在PCB(Process Control Block)中保存著一份文件描述符表,文件描述符就是這個表的索引,每個表項都有一個指向已打開文件的指針。
文件指針:C語言中使用文件指針做為I/O的句柄。文件指針指向進程用戶區中的一個被稱為FILE結構的數據結構。FILE結構包括一個緩沖區和一個文件描述符。而文件描述符是文件描述符表的一個索引,因此從某種意義上說文件指針就是句柄的句柄(在Windows系統上,文件描述符被稱作文件句柄)。
問題二:誰能解釋一下文件描述符標志? 文件描述符非負整數打現存文件或新建文件內核返文件描述符讀寫文件需要使用文件描述符指定待讀寫文件 習慣標准輸入(standard input)文件描述符 0標准輸(standard output) 1標准錯誤(standard error) 2盡管種習慣並非 Unix 內核特性些 shell 應用程序都使用種習慣內核遵循種習慣應用程序能使用 POSIX 定義 STDIN_FILENO、STDOUT_FILENO STDERR_FILENO 代替 0、1、2三符號量定義位於文件 unistd.h 文件描述符效范圍 0 OPEN_MAX般說每進程打 64 文件(0 ― 63)於 FreeBSD 5.2.1、Mac OS X 10.3 Solaris 9 說每進程打文件少取決於系統內存int 及系統管理員設定限制
問題三:文件描述符的定義數量 如何在不同平台上定義文件描述符的數量文件描述符極限以及可分配給進程的最大大小由資源限制來定義。這些值應當按照在WebLogicServer文檔中建議的、特定於操作系統的文件描述符值來設置:對於WLS8.1:調整硬體、操作系統和網路性能對於WLS7.0:調整硬體、操作系統和網路性能對於WLS6.1:調整硬體、操作系統和網路性能Unix和Linux都有文件描述符。不過,二者的主要區別在於如何設置文件描述符的硬極限值、預設值和配置過程。Solaris/usr/bin/ulimit實用程序定義允許單個進程使用的文件描述符的數量。它的最大值在rlim_fd_max中定義,在預設情況下,它設置為65,536。只有root用戶才能修改這些內核值。Linux管理用戶可以在etc/security/limits.conf配置文件中設置他們的文件描述符極限,如下例所示。softnofile1024hardnofile4096系統級文件描述符極限還可以通過將以下三行添加到/etc/rc.d/rc.local啟動腳本中來設置:#Increasesystem-widefiledescriptorlimit.echo4096>/proc/sys/fs/file-maxecho16384>/proc/sys/fs/inode-maxWindows在Windows操作系統上,文件描述符被稱作文件句柄。在Windows2000伺服器上,打開文件的句柄極限設置為16,384。此數量可以在任務管理器的性能摘要中監視。HP-UXnfile定義打開文件的最大數量。此值通常由以下公式來確定:((NPROC*2)+1000),其中NPROC通常為:((MAXUSERS*5)+64)。如果MAXUSERS等於400,則經過計算得到此值為5128。通常可以將此值設高一些。maxfiles是每個進程的軟文件極限,maxfiles_lim是每個進程的硬文件極限。AIX文件描述符極限在/etc/security/limits文件中設置,它的預設值是2000。此極限可以通過ulimit命令或setrlimit子常式來更改。最大大小由OPEN_MAX常數來定義。
問題四:文件描述符可以是0嗎 文件描述符是一個簡單的整數,用以標明每一個被進程所打開的文件和socket。
第一個打開的文件是0,第二個是1,依此類推。Unix 操作系統通常給每個進程能打開的文件數量強加一個限制。更甚的是,unix 通常有一個系統級的限制。 os.chinauni
問題五:如何判斷文件描述符在fd open 一個文件將返回一個文件描述符。 0 - 返回的文件描述符 就是已經打開的。 /proc/pid/fd 下面為該進程打開的文件描述符 如果我的回答沒能幫助您,請繼續追問。
問題六:Linux查看進程打開多少文件描述符命令 linux系統下查看進程打開文件在/proc下,對應每個進程有一個以進程號命名的目錄,該目錄下有一個fd目錄,該目錄下面的每個文件是一個符號連接,其文件名對應該進程佔用的一個文件描述符,而連接指向的內容表示文件描述符對應的實際文件,有多少個文件描述符表示該進程打開了多少文件。
另外Linux
默認的進程打開文件上限是1024個,可以通過ulimit
-n查看。很多系統上限可以通過修改/etc/security/limits.conf文件改變,這個文件有詳細的注釋,對如何修改做了說明。如果希望
把所有用戶的進程打開文件上限改為65536,可以加入下面兩行
* soft nofile 65535
* hard nofile 65535
還可以只真對某個用戶或某個組做修改,具體方法參見文件注釋。修改後需要重新啟動系統才能生效。
問題七:linux 文件描述符 3是什麼?例如 0 1 2代表標準的輸出輸入和出錯,但是3,4又是什麼的呢? 其他已經被打開的文件
問題八:文件描述符掛起是什麼意思 具體操作,需要修改兩處,並且需重新啟動Linux伺服器。首先SSH登錄伺服器,執行ulimit-a查看當前限制。這一步是可選,主要是看下限制,心裡有數。第一處修改:vim/etc/security/limits.conf在文件尾部增加:*softnofile65535*hardno
問題九:有人了解java與linux文件描述符之間的關系嗎 linux文件描述符? 可以認為是linux下的任務管理中打開文件的索引表,是系統中使用的。。。。。。。java是一個平台、一種編程語言。。。。。。不知道要怎麼比較了。
問題十:文件描述符fb和tcp連接數有什麼關系 C10K的問題在上個世紀90年代就被提出來了。大概的意思是當用戶數超過1萬時,很多設計不良好的網路服務程序性能都將急劇下降、甚至癱瘓。並且,這個問題並不能通過升級硬體設備解決,是操作系統固有的問題,也就是說,如果你的伺服器最高能支撐1000個並發,盡管你升級了計算能力高一倍的 cpu,內存再翻一番,硬碟轉速在快一倍,也無法支撐2000個並發。
經典的網路編程模型有4個:
1. Serve one client with each thread/process, and use blocking I/O。即對每個客戶都使用不同的線程或進程進行服務,在每個線程或進程中使用阻塞I/O。這是小程序和java常用的策略,對於互動式的應用也是常見的選擇,這種策略很能難滿足高性能程序的需求,好處是實現極其簡單,容易實現復雜的交互邏輯。我們常用的Apache、ftpd等都是這種工作。
2. Serve many clients with single thread, and use nonblocking I/O and readiness notification。即對所有的客戶使用單一一個線程或進程進行服務,在這個線程或進程里,採用非同步IO的策略。這是經典模型,優點在於實現較簡單,方便移植,也能提供足夠的性能;缺點在於無法充分利用多CPU的資源。
3. Serve many clients with each thread, and use nonblocking I/O and readiness notification 對經典模型2的簡單改進,仍然採用非同步IO的策略,但對所有的客戶使用多個線程或進程進行服務。缺點是容易在多線程並發上出bug,甚至某些OS不支持多線程進行readiness notification
4. Serve many clients with each thread, and use asynchronous I/O 在有AI/O支持的OS上,能提供相當高的性能。不過AI/O編程模型和經典模型差別相當大,基本上很難寫出一個框架同時支持AI/O和經典模型。這個模型主要是用於window平台上。
C. 如何在Linux下增大可打開文件描述符的數目
在安裝Oracle Grid Infrastructure檢查約束時遇到一個錯誤,大體是說當前可打開的文件描述符的最大數為1024,而要求是65536。
於是在gird用戶下執行ulimit -a,顯示可打開的最大文件數為1024,這是默認值;執行ulimit -n 65536不允許修改,轉到root下面執行ulimit -n 65536,執行ulimit -a 顯示為65536,在grid用戶下執行依然為1024。當時想到用sudo的方式執行,對gird用戶賦予所有許可權,執行ulimit -n 65536依然報錯。
後來想起在配置/etc/profile文件里,對oracle有ulimit -n 65536的命令,如下:
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
添加grid用戶後,source /etc/profile
if [ $USER = "oracle" ] || [ $USER = "grid" ] ; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
在grid執行ulimit -a依然為1024,後來檢查安裝步驟發現忘了在/etc/security/limits中添加grid用戶了,添加下面即可:
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
看來是作用域的問題,增大文件描述符。
D. 請教個關於Linux系統打開文件數過多卻沒報錯的問題。。。
文件描述符,可以查看如下的位置。
1,默認用戶的,ulimit -n或者在 sysctl.conf定義。
這個值建議是內存大小,以K為單位/256
2,系統的:
cat /proc/sys/fs/file-max
這個值通常是建議是內存值,以K為單的10分之1.
3,各個進程本身的,可以這樣查看:
不同應用有不同的數量。
cat /proc/你的進程號/limits
E. linux 文件描述符最大是多少怎麼計算的
最大值是系統相關的,linux shell 輸入如下命令就知道,其中的「-n: file descriptors」就是最大限制值。
# ulimit -a
-f: file size (blocks) unlimited
-t: cpu time (seconds) unlimited
-d: data seg size (kb) unlimited
-s: stack size (kb) 8192
-c: core file size (blocks) 0
-m: resident set size (kb) unlimited
-l: locked memory (kb) 64
-p: processes 128
-n: file descriptors 1024
-v: address space (kb) unlimited
-w: locks unlimited
-e: scheling priority 0
-r: real-time priority 0
F. linux查看當前進程的nofile
您好,在Linux操作系統中,nofile是指當前進程打開的最大文件描述符數量。要查看當前進程的nofile,可以使用以下命令:
1. 使用命令「ulimit -n」可以查看當前用戶的nofile限制。如果該值不夠大,可以使用「ulimit -n <number>」來塵改增加nofile限制。
2. 使用命令「cat /proc/<pid>/limits」可以查看指定進程的nofile限制。其中,<pid>為要查看的進程的進程ID。
3. 使用命令「cat /proc/<pid>/status | grep Nofiles」可以查看指定進程打開的文件描述符數量。其中,<pid>為要查看的進程的進程ID。
4. 使用命令「lsof -p <pid> | wc -l」可以查看指定進程叢李打開的文件數量。其中,<pid>為要查看的進程的進程ID。
以上是查看當前進程派鄭判的nofile的幾種方法,可以根據實際情況選擇合適的方法進行查看。
G. 【fd】Linux文件描述符
在Linux下一切資源皆文件,普通文件是文件,磁碟列印機是文件,socket 當然也是文件。
關於Linux下系統,進程能最大能打開的文件描述符數看過好多文章,但大都沒有完整,詳細說明每個值表示什麼意思,在實踐中該怎麼設置?
如何通過最簡單的設置來實現最有效的性能調優,如何在有限資源的條件下保證程序的運作?
max-file 表示系統級別的能夠打開的文件句柄的數量,是對整個系統的限制,並不是針對用戶的。
ulimit -n 控制進程級別能夠打開的文件句柄的數量,提供對shell及其啟動的進程的可用文件句柄的控制,這是進程級別的。
對於伺服器來說,file-max和ulimit都需要設置,否則會出現文件描述符耗盡的問題。
一般如果遇到文件句柄達到上限時,會碰到"Too many open files"或者Socket/File: Can』t open so many files等錯誤。
相關的3個文件:
/proc/sys/fs/file-max
/proc/sys/fs/file-nr
/etc/security/limits.conf
/proc/sys/fs/file-max
Linux系統級別限制所有用戶進程能打開的文件描述符總數。
max-file 表示系統級別的能夠打開的文件句柄的數量,是對整個系統的限制,並不是針對用戶的。
/etc/security/limits.conf
用戶級別的限制是通過可以通過命令ulimit命令和文件/etc/security/limits.conf
/proc/sys/fs/file-nr 該參數是只讀的,不能修改。
file-nr的值由3部分組成:
1,已經分配的文件描述符數;
2,已經分配但未使用的文件描述符數;
3,內核最大能分配的文件描述符數
/proc/${pid}/fd
眾所周知,在相應進程的/proc/$pid/fd 目錄下存放了此進程所有打開的fd。
當然有些可能不是本進程自己打開的,如通過fork()從父進程繼承而來的。
那麼這個socket:後面的一串數字是什麼呢?其實是該socket的inode號。
那麼,知道了某個進程打開的socket的inode號後,我們可以做什麼呢?
這就涉及到/proc/net/tcp(udp對應/proc/net/udp)文件了,其中也列出了相應socket的inode號通過比對此欄位,我們能在/proc/net/tcp下獲得此套介面的其他信息,如對應的<本地地址:埠號,遠端地址:埠號>對,窗口大小,狀態等信息。
具體欄位含義詳見net/ipv4/tcp_ipv4.c 中的 tcp4_seq_show 函數。
如果socket創建了,沒有被使用,那麼就只會在/proc/pid/fd下面有,而不會在/proc/net/下面有相關數據。
目錄中的每一項都是一個符號鏈接,指向打開的文件,數字則代表文件描述符。
其中0 = /dev/null ,1 = stdout, 2 = stderr,用cat或tail查看即可。
Number of file descriptors: different between /proc/sys/fs/file-nr and /proc/$pid/fd?
https://serverfault.com/questions/485262/number-of-file-descriptors-different-between-proc-sys-fs-file-nr-and-proc-pi
Linux中最大文件描述符數
https://leokongwq.github.io/2016/11/09/linux-max-fd.html
How do linux file descriptor limits work?
https://stackoverflow.com/questions/3991223/how-do-linux-file-descriptor-limits-work
limits.conf(5) - Linux man page
https://linux.die.net/man/5/limits.conf
Why can't I tail -f /proc/$pid/fd/1 ?
https://unix.stackexchange.com/questions/152773/why-cant-i-tail-f-proc-pid-fd-1
Linux查看進程運行輸出(/proc/<pid>/fd)
https://blog.csdn.net/u014756245/article/details/120023188