日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux:如何获取打开文件和文件描述符数量

發(fā)布時間:2024/10/12 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux:如何获取打开文件和文件描述符数量 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、linux的文件描述符

???文件描述符(FD:file?descriptors),也可以說是文件句柄,當某個程序打開文件時,內(nèi)核返回相應(yīng)的文件描述符,程序為了處理該文件必須引用此描述符。文件描述符是一個正整數(shù),用以標明每一個被進程所打開的文件和socket。最前面的三個文件描述符(0,1,2)分別與標準輸入(stdin),標準輸出(stdout)和標準錯誤(stderr)對應(yīng),后面打開的文件依此類推對應(yīng)3、4……?。

?

????linux系統(tǒng)對每個用戶、進程、或整個系統(tǒng)的可打開文件描述符數(shù)量都有一個限制,一般默認為1024。當我們在系統(tǒng)或應(yīng)用的日志中碰到“too?many?open?files”錯誤記錄時,這個其實不是說打開的文件過多,而是打開的文件描述符數(shù)量已達到了限制,這時就需要增加文件描述符的數(shù)量限制了。

?

1.1?獲取系統(tǒng)打開的文件描述符數(shù)量

????[root@localhost?~]#?cat?/proc/sys/fs/file-nr?

????1216????0???????197787

?????//第一列?1216???:為已分配的FD數(shù)量

?????//第二列?0??????????:為已分配但尚未使用的FD數(shù)量

?????//第三列197787:為系統(tǒng)可用的最大FD數(shù)量

????已用FD數(shù)量=為已分配的FD數(shù)量?-?為已分配但尚未使用的FD數(shù)量。注意,這些數(shù)值是系統(tǒng)層面的。

?

1.2?獲取進程打開的文件描述符數(shù)量

????[root@localhost?~]#?pidof?vim

??????3253

????[root@localhost?~]#?ll?/proc/3253/fd

?????總用量?0

????lrwx------.?1?test?test?64??6月??8?18:11?0?->?/dev/pts/0

????lrwx------.?1?test?test?64??6月??8?18:11?1?->?/dev/pts/0

????lrwx------.?1?test?test?64??6月??8?18:11?2?->?/dev/pts/0

????lrwx------.?1?test?test?64??6月??8?18:11?4?->?/home/test/.bash_history.swp

???

????//可以看到vim進程用了4個FD

?

1.3?更改文件描述符限制

????當碰到“too?many?open?files”錯誤時,就需要增加文件描述符的限制數(shù)量,系統(tǒng)的默認文件描述符都比較大,一般來說,只需增加用戶或進程的就可以了

????//用戶或進程

????[root@localhost?~]#?ulimit?-n

?????1024

????[root@localhost?~]#?ulimit?-n?10240

????[root@localhost?~]#?ulimit?-n

?????10240?

注意,使用ulimit?命令更改后只是在當前會話生效,當退出當前會話重新登錄后又會回到默認值1024,要永久更改可以修改文件?/etc/security/limit.conf,如

???[root@localhost?~]#vi?/etc/security/limits.conf?

???加入?“abc?hard?nofile?10240”

???abc:用戶名,即允許test使用ulimit命令更改FD限制,最大值不超過10240,更改后abc用戶的每一個進程(以abc用戶運行的進程)可打開的FD數(shù)量為10240個

???hard:限制類型,有soft/hard兩種,達到soft限制會在系統(tǒng)的日志(一般為/var/log/messages)里面記錄一條告警日志,但不影響使用。hard,達到這個限制,有日志且會影響使用。

???nofile:限制的內(nèi)容,nofile?-?max?number?of?open?files

???1024?:值

更改后,退出終端重新登錄,用ulimit看看有沒有生效,如果沒生效,可以在abc用戶的.bash_profile文件加上?ulimit?-n?10240?,以使用戶abc每次登錄時都會將FD最大值更改為10240,如:

???[root@localhost?~]#echo?"ulimit?-n?10240"?>>?/home/abc/?.bash_profile

????10240

???[root@localhost?~]#?su?-?abc

???[abc@localhost?~]$?ulimit?-n

????10240

?

limit.conf文件里面本身已有很詳細的使用方法,這個下次可以說說。

?

??????//系統(tǒng)級別

?將整個操作系統(tǒng)可以使用的FD數(shù)量更改為51200

?????[root@localhost?~]#?echo?"51200"?>?/proc/sys/fs/file-max

?????[root@localhost?~]#?cat?/proc/sys/fs/file-nr

?????1184????0???????51200

像這樣更改在系統(tǒng)重啟后會恢復(fù)到默認值,要永久更改可以在sysctl.conf文件加上fs.file-max?=?51200

如:

????[root@localhost?~]#?echo?"fs.file-max?=?51200"?>>?/etc/sysctl.conf

二、獲取打開的文件數(shù)量

linux的一切皆為文件,那么如何知道系統(tǒng)/應(yīng)用打開了哪些或是多少個文件呢?很簡單,用lsof命令就行了,lsof,list??open?files的簡寫,可列出程序或系統(tǒng)正在使用的文件。

?

2.1?獲取整個系統(tǒng)打開的文件數(shù)量

?????[root@localhost?~]#?lsof?|wc?-l

???????1864

2.2?獲取某個用戶打開的文件數(shù)量?

????[root@localhost?~]#?lsof?-u?test?|wc?-l

???????15

2.3?獲取某個程序打開的文件數(shù)量?

???[root@localhost?~]#?pidof?vim

??????3253

????[root@localhost?~]#?lsof?-p?3253?|wc?-l

??????31

上面所示只是用lsof來顯示已打開的文件數(shù)量,lsof的功能遠不止這些,有興趣可以man?lsof看一下?

?

三、進程打開的文件描述符與文件

如前面說的,為什么說“too?many?open?files”錯誤不是說打開的文件過多,而是打開的文件描述符數(shù)量已達到了限制,這個簡單的可以用man?ulimit就可得知

[abc@localhost?~]$???man?ulimit?

//找到ulimit,可以看到下列一行

-n???The?maximum?number?of?open?file?descriptors?(most?systems?do?not?allow?this?value?to?be?set)

這行就說明了用ulimit?-n?xxx?更改的是文件描述符而不是文件的最大值。

?

?我們可以來測試一下:

  • ?打開一個進程vim,獲取vim打開的文件及文件描述符數(shù)量

[abc@localhost?~]$?lsof?-p?3330?|wc?-l?//文件數(shù)量

31

[abc@localhost?~]$?ls?/proc/3330/fd?|wc?-l??//文件描述符數(shù)量

4

[abc@localhost?~]$?killall?-9?vim

[1]+??已殺死???????????????vim?.bash_profile

[abc@localhost?~]$?ulimit?-n?20

  • 更改限制,并測試vim的運行情況

[abc@localhost?~]$?ulimit?-n?20?//更改為20,即小于文件數(shù)量31

[abc@localhost?~]$?ulimit?-n

20

[abc@localhost?~]$?vim?.bash_profile?//可看到vim可以正常打開文件

#?.bash_profile

#?Get?the?aliases?and?functions

if?[?-f?~/.bashrc?];?then

????????.?~/.bashrc

fi

#?User?specific?environment?and?startup?programs

PATH=$PATH:$HOME/bin

export?PATH

ulimit?-n?10240

----------------------------------

[abc@localhost?~]$?ulimit?-n?3????//更改為3,即小于FD數(shù)量4

[abc@localhost?~]$?ulimit?-n

3

[abc@localhost?~]$?vim?.bash_profile???

-bash:?start_pipeline:?pgrp?pipe:?Too?many?open?files?

vim:?error?while?loading?shared?libraries:?libselinux.so.1:?cannot?open?shared?object?file:?Error?24

?

從上面可看到小于文件描述符的數(shù)值時即報“Too?many?open?files”錯誤,那么這個應(yīng)該可以說明這個“Too?many?open?files”錯誤是是打開的文件描述符數(shù)量已達到了限制所引起的,跟打開的文件數(shù)量沒有關(guān)系。

?

另用lsof可知道進程都打開了哪些文件和文件描述符:

[abc@localhost?~]$?lsof?-p?3330

COMMAND??PID?USER???FD???TYPE?DEVICE?SIZE/OFF???NODE?NAME

vim?????3555??abc??cwd????DIR??253,0?????4096?923587?/home/abc

vim?????3555??abc??rtd????DIR??253,0?????4096??????2?/

vim?????3555??abc??txt????REG??253,0??1971360?287900?/usr/bin/vim

vim?????3555??abc??mem????REG??253,0???155696????846?/lib64/ld-2.12.so

vim?????3555??abc??mem????REG??253,0????26104?281208?/usr/lib64/libgpm.so.2.1.0

vim?????3555??abc??mem????REG??253,0??1912928????847?/lib64/libc-2.12.so

vim?????3555??abc??mem????REG??253,0????22536????852?/lib64/libdl-2.12.so

vim?????3555??abc??mem????REG??253,0???145672????859?/lib64/libpthread-2.12.so

vim?????3555??abc??mem????REG??253,0???598816????848?/lib64/libm-2.12.so

vim?????3555??abc??mem????REG??253,0???124624????857?/lib64/libselinux.so.1

vim?????3555??abc??mem????REG??253,0???113904????856?/lib64/libresolv-2.12.so

vim?????3555??abc??mem????REG??253,0??1489600?406575?/usr/lib64/perl5/CORE/libperl.so

vim?????3555??abc??mem????REG??253,0???142504?????96?/lib64/libncurses.so.5.7

vim?????3555??abc??mem????REG??253,0????34336????890?/lib64/libacl.so.1.1.0

vim?????3555??abc??mem????REG??253,0????43392????869?/lib64/libcrypt-2.12.so

vim?????3555??abc??mem????REG??253,0???387880????868?/lib64/libfreebl3.so

vim?????3555??abc??mem????REG??253,0??1753952?271694?/usr/lib64/libpython2.6.so.1.0

vim?????3555??abc??mem????REG??253,0????17520????886?/lib64/libutil-2.12.so

vim?????3555??abc??mem????REG??253,0???138280????826?/lib64/libtinfo.so.5.7

vim?????3555??abc??mem????REG??253,0????20280????887?/lib64/libattr.so.1.1.0

vim?????3555??abc??mem????REG??253,0???116136????889?/lib64/libnsl-2.12.so

vim?????3555??abc??mem????REG??253,0????61624?????42?/lib64/libnss_files-2.12.so

vim?????3555??abc??mem????REG??253,0????26050?265158?/usr/lib64/gconv/gconv-modules.cache

vim?????3555??abc??mem????REG??253,0???124855?528606?/usr/share/vim/vim72/lang/zh_CN/LC_MESSAGES/vim.mo

vim?????3555??abc??mem????REG??253,0???135533?528604?/usr/share/vim/vim72/lang/zh_CN.UTF-8/LC_MESSAGES/vim.mo

vim?????3555??abc??mem????REG??253,0?99158752?264902?/usr/lib/locale/locale-archive

vim?????3555??abc????0u???CHR??136,0??????0t0??????3?/dev/pts/0

vim?????3555??abc????1u???CHR??136,0??????0t0??????3?/dev/pts/0

vim?????3555??abc????2u???CHR??136,0??????0t0??????3?/dev/pts/0

vim?????3555??abc????4u???REG??253,0?????4096?923589?/home/abc/.bash_profile.swp

?

可看到運行vim時,打開了很多個文件,但文件描述符只有后面四個。

轉(zhuǎn)載于:https://www.cnblogs.com/mfryf/p/5329770.html

總結(jié)

以上是生活随笔為你收集整理的Linux:如何获取打开文件和文件描述符数量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。