ulimit 是 Shell 內建指令,用於查看與設定當前 Shell 及其子進程的資源限制。合理調整可防止單一程式耗盡系統資源(如檔案描述符、記憶體、進程數),是 Java 高併發、高連線服務上線前的必調項目。
ulimit [-aHS] [-c core] [-d data] [-f file] [-m memory] [-n nofile] [-s stack] [-t cpu] [-u nproc] [-v vmem]
| 參數 | 資源 | 單位 | 說明 |
|---|---|---|---|
-a | 所有限制 | - | 顯示目前所有設定值 |
-c | Core dump 檔案大小 | Blocks | 0 為禁用 core dump |
-d | 資料段大小 | KB | 進程資料區上限 |
-f | 建立檔案大小 | Blocks | Shell 建立檔案上限 |
-m | 實體記憶體 | KB | RSS 上限(Linux 多不強制) |
-n | 開啟檔案描述符數 | 個 | 關鍵參數,預設 1024 |
-s | 堆疊大小 | KB | 執行緒堆疊上限 |
-t | CPU 時間 | 秒 | 單一進程 CPU 佔用上限 |
-u | 使用者進程數 | 個 | 單一用戶最大進程數 |
-v | 虛擬記憶體 | KB | 位址空間上限 |
-H | Hard limit | - | 管理員設定的硬上限,不可超越 |
-S | Soft limit | - | 使用者可自行調整的軟上限(≤ Hard) |
ulimit -a
# 輸出範例:
# open files (-n) 1024
# max user processes (-u) 4096
Java Netty、Nginx、Redis 等大量長連線服務,預設 1024 遠不夠。
# 臨時生效(當前 Shell 及子進程)
ulimit -n 65535
# 或
ulimit -Sn 65535; ulimit -Hn 65535
ulimit -d unlimited # 資料段
ulimit -m unlimited # 實體記憶體
ulimit -s unlimited # 堆疊
ulimit -t unlimited # CPU 時間
ulimit -v unlimited # 虛擬記憶體
/etc/security/limits.conf# 格式: -
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
# 特定用戶
appuser soft nofile 100000
appuser hard nofile 100000
需確保 /etc/pam.d/login、sshd、su 等 PAM 設定檔包含:
session required pam_limits.so
重新登入後生效(ulimit -a 驗證)。
若服務透過 systemd 啟動,limits.conf 不生效,需在 [Service] 區塊加入:
LimitNOFILE=65535
LimitNPROC=65535
執行 systemctl daemon-reload 並重啟服務。
limits.conf 即時生效:需重新登入或重啟服務limits.conflimits.conf,必須在 unit 檔設定 Limit*掌握 ulimit 與 limits.conf,讓資源限制成為保護系統穩定的護欄,而非阻礙效能的絆腳石。