Linux「一切皆檔案」,Socket、管道、目錄、裝置皆佔用檔案描述符(FD)。預設單進程上限 1024,洩漏會導致「Too many open files」,服務拒絕連線。
ulimit -n # 查看目前上限
ulimit -HSn 10240 # 硬/軟上限調大(需 root 或 /etc/security/limits.conf 永久生效)
ls -l /proc/<PID>/fd/ | wc -l # 計算 FD 數量
ls -l /proc/<PID>/fd/ # 列出所有 FD 指向
/usr/sbin/lsof -p 21404
# 輸出欄位:COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
# FD 欄位:cwd(工作目錄) txt(程式碼) mem(記憶體映射) 0u/1u/2u/3u...(編號+存取模式)
範例輸出:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
vas 21404 root cwd DIR 8,3 4096 30195729 /home/users/root/vas
vas 21404 root txt REG 8,3 112201650 30195914 /home/users/root/vas
vas 21404 root mem REG 8,2 105080 339377 /lib64/ld-2.3.4.so
...
/usr/sbin/lsof -i :9001
open()/socket()/pipe() 必配對 close()goto cleanup 模式)with 語句lsof -p <PID> 監控長期服務 FD 數量趨勢快速定位 FD 洩漏,守護線上服務穩定。