我們在開發linux在線服務器的時候經常會遇會句柄洩露的問題。因為在linux系統設計裡面遵循一切都是文件的原則,即磁盤文件、目錄、網絡套接字、磁盤、管道等,所有這些都是文件,在我們進行打開的時候會返回一個fd,即是文件句柄。如果頻繁的打開文件,或者打開網絡套接字而忘記釋放就會有句柄洩露的現象。在linux系統中對進程可以調用的文件句柄數進行了限制,在默認情況下每個進程可以調用的最大句柄數是1024個,如果超過了這個限制,進程將無法獲取新的句柄,而從導致不能打開新的文件或者網絡套接字,對於線上服務器即會出現服務被拒絕的情況。
在linux系統中可以通過ulimit–n查看每個進程限制的最大句柄數,通過ulimit –HSn 10240修改進程的最大句柄數。當句柄數目達到限制後,就回出現”too many files open”。
查看進程占用的句柄數有幾種辦法:
1) 通過cat/proc/pid/fd可以查看線程pid號打開的線程;
2) 通過lsof命令, /usr/sbin/lsof-p 21404 命令結果如下:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
COMMAND:進程的名稱
PID:進程標識符
USER:進程所有者
FD:文件描述符,應用程序通過文件描述符識別該文件。如 cwd、txt等
TYPE:文件類型,如 DIR、REG、IPV4、FIEO等
DEVICE:指定磁盤的名稱
SIZE:文件的大小
NODE:索引節點(文件在磁盤上的標識)
NAME:打開文件的確切名稱
另外通lsof命令也可以查看占用端口的進程:
/usr/sbin/lsof-i :9001