伺服器部署應用遇到 Socket/File: Can't open so many files 錯誤。Linux 對文件句柄(file descriptor)有限制,預設 **1024**,生產環境極易耗盡。
ulimit -a
# open files (-n) 1024
此為**當前用戶啟動程序的限制**,非系統全域限制。
例:啟動程式 A → ulimit -n 2048 → 啟動程式 B → 退出 Shell 重登 → 啟動程式 C。結果:**僅程式 B 享有 2048 句柄額度**。
將 ulimit 放入 /etc/profile **非最佳做法**。正確修改 /etc/security/limits.conf:
* soft nofile 2048
* hard nofile 32768
所有用戶軟限制 2048,硬限制 32768。首欄 * 表全域,可針對特定用戶差異化配置。
| 類型 | 含義 |
|---|---|
| 硬限制 | 實際上限,程序無法超越 |
| 軟限制 | 警告線,達到收到警告但可繼續增至硬限制 |
ulimit -H 設硬限、-S 設軟限。無參數修改時軟硬同改。預設顯示軟限制。
修改後**重新登入**即時生效。已啟動程序需**重啟**套用新值(部分發行版需重開機)。
file-max:系統全域可開啟句柄最大數(cat 查看、echo 值 > file-max 立即修改)file-nr:唯讀,顯示系統當前已使用句柄數lsof -p PIDlsof /path/to/file排查句柄洩漏、佔用異常的利器。