導航:首頁 > 操作系統 > linux句柄

linux句柄

發布時間:2022-01-29 07:27:45

A. linux怎麼查看默認的句柄數

您好!很高興能為您解答。
修改文件句柄數在Linux下,我們使用ulimit -n
命令可以看到單個進程能夠打開的最大文件句柄數量(socket連接也算在裡面)。系統默認值1024。

對於一般的應用來說(象Apache、系統進程)1024完全足夠使用。但是如何象squid、mysql、java等單進程處理大量請求的應用來說就有
點捉襟見肘了。如果單個進程打開的文件句柄數量超過了系統定義的值,就會提到「too many files
open」的錯誤提示。如何知道當前進程打開了多少個文件句柄呢?下面一段小腳本可以幫你查看:

1.lsof -n |awk '{print $2}'|sort|uniq -c |sort
-nr|more

在系統訪問高峰時間以root用戶執行上面的腳本,可能出現的結果如下:

1.# lsof -n|awk '{print $2}'|sort|uniq -c |sort
-nr|more
2. 131 24204
3. 57 24244
4. 57 24231

5. 56 24264

其中第一行是打開的文件句柄數量,第二行是進程號。得到進程號後,我們可以通過ps命令得到進程的詳細內容。

1.ps -aef|grep 24204
2.mysql 24204 24162
99 16:15 ? 00:24:25 /usr/sbin/mysqld

哦,原來是mysql進程打開最多文件句柄數量。但是他目前只打開了131個文件句柄數量,遠遠底於系統默認值1024。

但是如果系統並發特別大,尤其是squid伺服器,很有可能會超過1024。這時候就必須要調整系統參數,以適應應用變化。Linux有硬性限制和軟性限制。可以通過ulimit來設定這兩個參數。方法如下,以root用戶運行以下命令:

1.ulimit -HSn 4096

以 上命令中,H指定了硬性大小,S指定了軟性大小,n表示設定單個進程最大的打開文件句柄數量。個人覺得最好不要超過4096,畢竟打開的文件句柄數越多響
應時間肯定會越慢。設定句柄數量後,系統重啟後,又會恢復默認值。如果想永久保存下來,,可以修改 /etc/profile
把上面命令加到最後。(findsun提出的辦法比較合理)

/////////////////////////////////////////////////////////////////////////////

在 Linux下面部署應用的時候,有時候會遇上Socket/File: Can't open so many
files的問題,其實Linux是有文件句柄限制的(就像WinXP?),而且默認不是很高,一般都是1024,作為一台生產伺服器,其實很容易就達到
這個數量,因此我們需要把這個值改大一些。

大概知道ulimit這個命令是相關的,上Google搜索了一下,大多數說的很含糊,也沒有統一說一下,經過兩個小時看了不少文章終於弄清楚ulimit相關的一些配置問題。

我們可以用ulimit -a來查看所有限制值,我只關心文件句柄數量的問題

open files (-n) 1024

這個就是限制數量

這里,有很多ulimit的文章都說的很含糊,究竟這個1024是系統的限制,還是用戶的限制呢。其實,這個是用戶限制來的,完整的說法,應該是當前用戶准備要運行的程序的限制。

1、這個限制是針對單個程序的限制

2、這個限制不會改變之前已經運行了的程序的限制

3、對這個值的修改,退出了當前的shell就會消失

比如說,我先運行了一個程序A,然後通過ulimit修改了限制為2048,然後運行B,然後退出了shell再登錄,然後運行C。那就只有B可以打開2048個句柄。

如果我們需要改變整體的限制值,或者我們運行的程序是系統啟動的,應該怎麼處理呢

其中一個方法,是想ulimit修改命令放入/etc/profile裡面,但是這個做法並不好

正確的做法,應該是修改/etc/security/limits.conf

裡面有很詳細的注釋,比如

* soft nofile 2048

* hard nofile 32768

就可以將文件句柄限制統一改成軟2048,硬32768

這里涉及另外一個問題,什麼是軟限制,什麼是硬限制

硬限制是實際的限制,而軟限制,是warnning限制,只會做出warning

其實ulimit命令本身就有分軟硬設置,加-H就是硬,加-S就是軟

默認顯示的是軟限制,如果修改的時候沒有加上的話,就是兩個一起改

配置文件最前面的一位是domain,設置為星號代表全局,另外你也可以針對不同的用戶做出不同的限制

修改了,重新登錄用ulimit一開就立刻生效了,不過之前啟動過的程序要重新啟動才能使用新的值。我用的是CentOS,似乎有些系統需要重啟才能生效。

ulimit其實就是對單一程序的限制

那系統總限制呢

其實是在這里,/proc/sys/fs/file-max

可以通過cat查看目前的值,echo來立刻修改

另外還有一個,/proc/sys/fs/file-nr

只讀,可以看到整個系統目前使用的文件句柄數量

查找文件句柄問題的時候,還有一個很實用的程序lsof

可以很方便看到某個進程開了那些句柄

也可以看到某個文件/目錄被什麼進程佔用了。

B. 在linux下獲得當前窗口句柄

很好啊。如果實現了。真的。加油!

C. 怎麼查看linux文件句柄數位置

---查看系統默認的最大文件句柄數,系統默認是1024
# ulimit -n
1024

----查看當前進程打開了多少句柄數
# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
131 24204
57 24244
57 24231 ........
其中第一列是打開的句柄數,第二列是進程ID。
可以根據ID號來查看進程名。
# ps aef|grep 24204
nginx24204 24162 99 16:15 ?00:24:25 /usr/local/nginx/sbin/nginx -s

Linux有硬性限制和軟性限制。可以通過ulimit來設定這兩個參數。方法如下,以root用戶運行以下命令:
# ulimit -HSn 4096
以上命令中,H指定了硬性大小,S指定了軟性大小,n表示設定單個進程最大的打開文件句柄數量。個人覺得最好不要超過4096,畢竟打開的文件句柄數越多響應時間肯定會越慢。設定句柄數量後,系統重啟後,又會恢復默認值。如果想永久保存下來,可以修改.bash_profile文件,可以修改 /etc/profile 把上面命令加到最後.

D. 文件句柄數是什麼東東怎樣才能把Linux的文件句柄數給消耗完(不修改文件)或者說有什麼工具模擬消耗

文件句柄那是windows的東西吧, linux下一般叫做文件描述符(File Descriptor), 使用ulimit -n可查看這個最大打開文件數限制. 只要你多次調用fopen,並且不調用fclose,很快就可以把它消耗完.不過這是對單個程序的限制.

E. linux中文件句柄未釋放,會導致什麼問題

linux刪除文件後沒有釋放空間

今天發現一台伺服器的home空間滿了,於是要清空沒用的文件,當我刪除文件後,發現可用空間沒有變化

os:centos4.7

現象:

發現當前磁碟空間使用情況:

[root@ticketb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 981M 203M 729M 22% /
none 16G 0 16G 0% /dev/shm
/dev/sda9 2.9G 37M 2.7G 2% /tmp
/dev/sda7 4.9G 1.9G 2.7G 42% /usr
/dev/sda8 2.9G 145M 2.6G 6% /var
/dev/mapper/vghome-lvhome
20G 19G 11M 100% /home
/dev/mapper/vgoradata-lvoradata
144G 48G 90G 35% /u01/oradata
/dev/mapper/vgbackup-lvbackup
193G 7.8G 175G 5% /u01/backup

通過以下的命令找到沒用的文件,然後刪除

[root@ticketb ~]# find /home/oracle/admin/dbticb/ump/ -name "dbticb_*.trc" -mtime +50 | xargs rm -rf

然後在查看磁碟空間使用情況,發現沒有/home空間沒有變化

[root@ticketb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 981M 203M 729M 22% /
none 16G 0 16G 0% /dev/shm
/dev/sda9 2.9G 37M 2.7G 2% /tmp
/dev/sda7 4.9G 1.9G 2.7G 42% /usr
/dev/sda8 2.9G 145M 2.6G 6% /var
/dev/mapper/vghome-lvhome
20G 19G 11M 100% /home
/dev/mapper/vgoradata-lvoradata
144G 48G 90G 35% /u01/oradata
/dev/mapper/vgbackup-lvbackup
193G 7.8G 175G 5% /u01/backup

這個郁悶啊,明明刪除文件了,怎麼空間沒有被釋放啊,rm命令應該是直接刪除啊,在查看下/home下還有什麼佔用空間

[root@ticketb ~]# -h --max-depth=1 /home
16K /home/lost+found
2.6G /home/oracle
2.6G /home

可這里顯示空間已經釋放了啊,於是google下,

未釋放磁碟空間原因:

在Linux或者Unix系統中,通過rm或者文件管理器刪除文件將會從文件系統的文件夾結構上解除鏈接(unlink).然而假設文件是被
打開的(有一個進程正在使用),那麼進程將仍然能夠讀取該文件,磁碟空間也一直被佔用。而我刪除的是oracle的告警log文件
刪除的時候文件應該正在被使用

解決方法

首先獲得一個已經被刪除可是仍然被應用程序佔用的文件列表,例如以下所看到的:

[root@ticketb ~]# lsof |grep deleted
oracle 12639 oracle 5w REG 253,0 648 215907 /home/oracle/admin/dbticb/ump/dbticb_ora_12637.trc (deleted)
oracle 12639 oracle 6w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bmp/alert_dbticb.log (deleted)
oracle 12639 oracle 7u REG 253,0 0 36282 /home/oracle/oracle/proct/10.2.0/db_1/dbs/lkinstdbticb (deleted)
oracle 12639 oracle 8w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bmp/alert_dbticb.log (deleted)
oracle 12641 oracle 5w REG 253,0 648 215907 /home/oracle/admin/dbticb/ump/dbticb_ora_12637.trc (deleted)
oracle 12641 oracle 6w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bmp/alert_dbticb.log (deleted)



oracle 23492 oracle 6w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bmp/alert_dbticb.log (deleted)
oracle 23492 oracle 7u REG 253,0 0 36282 /home/oracle/oracle/proct/10.2.0/db_1/dbs/lkinstdbticb (deleted)
oracle 23492 oracle 8w REG 253,0 16749822091 215748 /home/oracle/admin/dbticb/bmp/alert_dbticb.log (deleted)
oracle 23494 oracle 10u REG 253,0 0 36307 /home/oracle/oracle/proct/10.2.0/db_1/dbs/lkinstrmandb (deleted)

從輸出結果能夠看到/home/oracle/admin/dbticb/bmp/alert_dbticb.log還被使用,未被釋放空間

怎樣讓進程釋放呢?

一種方法是kill掉相應的進程,或者停掉使用這個文件的應用,讓os自己主動回收磁碟空間
我這個環境有非常多進程在使用的這個文件,停掉進程有點麻煩,再有就是風險非常大

當linux打開一個文件的時候,Linux內核會為每個進程在/proc/ 『/proc/nnnn/fd/文件夾(nnnn為pid)』建立一個以其pid
為名的文件夾用來保存進程的相關信息,而其子文件夾fd保存的是該進程打開的全部文件的fd(fd:file descriptor)。
kill進程是通過截斷proc文件系統中的文件能夠強制要求系統回收分配給正在使用的的文件。
這是一項高級技術,僅到管理員確定不會對執行中的進程造成影響時使用。應用程序對這樣的方
式支持的並不好,當一個正在使用的文件被截斷可能會引發不可預知的問題

所以我還是採用停應用來解決

restart oracle資料庫,發現/home/oracle/admin/dbticb/bmp/alert_dbticb.log相應的空間被釋放

在查看磁碟空間的使用情況,發現空間已經回收了

[root@ticketb ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 981M 203M 729M 22% /
none 16G 0 16G 0% /dev/shm
/dev/sda9 2.9G 37M 2.7G 2% /tmp
/dev/sda7 4.9G 1.9G 2.7G 42% /usr
/dev/sda8 2.9G 145M 2.6G 6% /var
/dev/mapper/vghome-lvhome
20G 2.6G 16G 15% /home
/dev/mapper/vgoradata-lvoradata
144G 48G 90G 35% /u01/oradata
/dev/mapper/vgbackup-lvbackup
193G 7.8G 175G 5% /u01/backup

ok,問題解決,然後做下收尾工作就可以

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

學習下lsof命令

lsof全名list opened files,也就是列舉系統中已經被打開的文件。我們都知道,linux環境中,不論什麼事物都是文件,
設備是文件,文件夾是文件,甚至sockets也是文件。所以,用好lsof命令,對日常的linux管理非常有幫助。

lsof是linux最常常使用的命令之中的一個,通常的輸出格式為:

引用
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

F. linux 怎樣查看進程打開的所有句柄

名稱:ps
使用許可權:所有使用者
使用方式:ps [options] [--help]
說明:顯示瞬間行程 (process) 的動態
參數:ps的參數非常多, 在此僅列出幾個常用的參數並大略介紹含義
-A 列出所有的進程
-w 顯示加寬可以顯示較多的資訊
-au 顯示較詳細的資訊
-aux 顯示所有包含其他使用者的行程

G. linux如何獲取某個進程打開的句柄數,c代碼實現

可以通過指令查詢當前進程打開了多少句柄,Linux下有exec函數族可以執行指令,把指令寫進去就行了。
-查看當前進程打開了多少句柄數
# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
-根據ID號來查看進程名。
# ps aef|grep ID號

H. linux 文件句柄 是哪個線程打開

我想可能是這兩個原因造成的: 1:你在線程中打開句柄後又關閉,那麼在後面線程創建句柄時因為之前這個使用的句柄已經釋放,則後面線程可以繼續使用。 2:沒有加線程鎖的原因,前一個線程打開文件創建句柄時後一個線程也已經啟動並同時創建句柄...

I. linux查看打開的文件句柄

linux系統下查看進程打開文件 在/proc下,對應每個進程有一個以進程號命名的目錄,該目錄下有一個fd目錄,該目錄下面的每個文件是一個符號連接,其文件名對應該進程佔用的一個文件描述符,而連接指向的內容表示文件描述符對應的實際文件,有多少...

J. linux 文件句柄數高怎麼解決

打開文件做文件操作後請及時釋放文件句柄。
檢查一下有哪些文件操作,哪些操作完成後沒有釋放文件句柄。

閱讀全文

與linux句柄相關的資料

熱點內容
vi命令將文件創在桌面上 瀏覽:921
程序員做競價 瀏覽:696
江蘇中小學編程納入課程 瀏覽:730
單純形法包括動態規劃演算法 瀏覽:951
cpdf百度網盤 瀏覽:671
綜合布線工程中配線架的演算法 瀏覽:925
單片機碩士論文 瀏覽:329
股票預測演算法現狀 瀏覽:430
程序員三高 瀏覽:180
pythonfiddle 瀏覽:215
韓信分油總共有幾種演算法 瀏覽:941
程序員思維方案 瀏覽:970
編譯環境要裝c盤嗎 瀏覽:648
單片機生成pwm 瀏覽:206
線上租車有什麼app 瀏覽:908
php程序修改 瀏覽:684
下列能查找文件或文件夾的操作是 瀏覽:314
遙感科學與技術演算法待遇 瀏覽:136
cad標注半徑命令 瀏覽:367
打卡領購app邀請碼怎麼填 瀏覽:336