目錄
1. 基本介紹
1.1 核心功能
1.2 作用范圍
1.3 限制類型
2. 基本語法
3. 常用選項?
3.1 常見options
3.2 查看當前限制
4. 核心概念
4.1 軟限制(Soft Limit)
4.2 硬限制(Hard Limit)
5. 修改限制?
5.1 臨時修改
5.2 永久修改
方法1:修改?/etc/security/limits.conf
方法2:針對Systemd服務的限制
6. 正確配置優先級
7. 驗證限制
7.1 查看進程實際限制
?7.2 查看 Systemd 服務的當前限制
?7.3 查看某進程的文件描述符限制
?7.4?查看系統當前打開文件描述符總數
?7.5?查看系統最大文件描述符數
7.6?實時監控文件描述符使用情況?
?7.7?查看特定進程的當前限制?
8. 常見問題
8.1 修改后不生效?
8.2 權限不足?
9. 應用場景
9.1 Web 服務器 (Nginx/Apache)
9.2 數據庫 (MySQL/PostgreSQL):
9.3 調試程序崩潰:
9.4 防止資源耗盡攻擊:
9.5 嵌入式/資源受限系統:
9.6?容器化環境
10. 注意事項
10.1 謹慎修改硬限制??
10.2 不同shell的行為差異??
??10.3 故障排查??
10.4?nproc?限制與容器
10.5?限制繼承性
10.6?Limits.conf?的生效范圍
10.7?云環境限制
10.8 權限差異
10.9 Unlimited
1. 基本介紹
1.1 核心功能
? ? ????查看和設置?當前 Shell 進程及其啟動的子進程?可使用的?系統資源限制。
1.2 作用范圍
????????限制由 Shell 啟動的單個進程或用戶會話的資源使用,防止資源耗盡(如打開文件過多、內存泄露、進程爆炸等)。
1.3 限制類型
????????包括文件描述符數量、進程數、內存大小、堆棧大小、CPU 時間、core 文件大小等。
2. 基本語法
1.1 基本語法
ulimit [options] [limit]
其中,options為控制限制類型的標志,limit則是指定資源限制的值。若省略limit,ulimit將顯示當前設置。
3. 常用選項?
3.1 常見options
- -a:顯示所有當前限制。?
- -c:設置或顯示 core 文件的最大大小(以塊為單位)。?
- -d:設置或顯示進程數據段的最大大小(以 KB 為單位)。?
- -f:設置或顯示由 shell 及其子進程創建的文件的最大大小(以塊為單位)。?
- -l:設置或顯示可鎖定到內存中的最大大小(以 KB 為單位)。?
- -m:設置或顯示最大常駐集大小(以 KB 為單位)。?
- -n:設置或顯示最大打開文件描述符數。?
- -q:設置或顯示 POSIX 消息隊列的最大字節數。?
- -s:設置或顯示最大堆棧大小(以 KB 為單位)。?
- -t:設置或顯示最大 CPU 時間(以秒為單位)。?
- -u:設置或顯示單個用戶可用的最大進程數。?
- -v:設置或顯示 shell 可用的最大虛擬內存(以 KB 為單位)。
3.2 查看當前限制
ulimit -a
:列出所有當前資源限制
$ ulimit -a
core file size (blocks, -c) 0 # core 文件大小 (塊)
data seg size (kbytes, -d) unlimited # 數據段大小 (KB)
scheduling priority (-e) 0 # 調度優先級
file size (blocks, -f) unlimited # 文件大小 (塊)
pending signals (-i) 31111 # 掛起信號數量
max locked memory (kbytes, -l) 64 # 鎖定內存 (KB)
max memory size (kbytes, -m) unlimited # 常駐內存集大小 (KB)
open files (-n) 1024 # 打開文件描述符數
pipe size (512 bytes, -p) 8 # 管道緩沖區大小
POSIX message queues (bytes, -q) 819200 # POSIX 消息隊列
real-time priority (-r) 0 # 實時優先級
stack size (kbytes, -s) 8192 # 棧大小 (KB)
cpu time (seconds, -t) unlimited # CPU 時間 (秒)
max user processes (-u) 31111 # 用戶最大進程數
virtual memory (kbytes, -v) unlimited # 虛擬內存 (KB)
file locks (-x) unlimited # 文件鎖
4. 核心概念
4.1 軟限制(Soft Limit)
當前生效的資源閾值,進程可自行調整(不超過硬限制);超出時可能觸發警告而非直接終止
4.2 硬限制(Hard Limit)
系統強制上限,僅 root 可修改,超限時進程會被強制終止。
在設置限制時,如果不指定是軟限制還是硬限制,默認是軟限制。
設置硬限制,使用
-H
選項,例如ulimit -Hn 2048
設置文件描述符的硬限制為2048;設置軟限制,使用
-S
選項,如ulimit -Sn 1024。
5. 修改限制?
5.1 臨時修改
# 修改當前Shell的限制(僅對當前會話有效)
ulimit -n 65535 # 文件描述符數
ulimit -u 10000 # 用戶進程數
ulimit -f unlimited # 文件大小無限制
5.2 永久修改
方法1:修改?/etc/security/limits.conf
vim /etc/security/limits.conf
# 添加以下內容(示例)
* soft nofile 65535
* hard nofile 65535
username hard nproc 10000# 為用戶 'appuser' 設置打開文件描述符限制
appuser soft nofile 65536
appuser hard nofile 65536# 為用戶 'appuser' 設置進程數限制
appuser soft nproc 4096
appuser hard nproc 8192# 為所有用戶設置核心文件大小限制
* soft core 0* hard core 0# 為 'dba' 組成員設置更高的內存鎖定限制
@dba hard memlock 262144
@dba soft memlock 262144
-
/etc/security/limits.d/*.conf
:系統允許在/etc/security/limits.d/
目錄下放置額外的.conf
文件來管理特定服務或用戶的限制,便于模塊化管理。 -
/etc/default/
下的服務配置文件:某些服務(如sshd
,systemd
服務)可能有自己的默認配置文件,其中可以設置ulimit
或通過systemd
的Limit*
指令。 -
systemd
服務單元文件:對于由systemd
管理的服務,可以在服務的.service
文件中使用LimitNOFILE
,LimitNPROC
,LimitCORE
等指令來設置資源限制,這通常比/etc/security/limits.conf
更直接有效,特別是對于非交互式服務。 *
?表示所有用戶,也可替換為具體用戶名。soft
?為軟限制(可臨時突破),hard
?為硬限制(需root權限修改)。nproc
表示單個用戶能夠創建的最大進程數或線程數,在 Linux 中線程和進程的概念在資源限制上是一樣的)。這有助于防止某個用戶啟動過多的進程而導致系統資源耗盡,影響其他用戶的正常使用。nofile
代表一個進程可以同時打開的最大文件描述符數量(包括網絡連接、文件等)。文件描述符是操作系統用于管理和跟蹤文件、網絡連接等輸入輸出資源的一個抽象。
方法2:針對Systemd服務的限制
vim /etc/systemd/system.conf
# 修改以下參數
DefaultLimitNOFILE=65535
DefaultLimitNPROC=10000
# 重啟生效
sudo systemctl daemon-reload
6. 正確配置優先級
場景 | 正確配置方式 | 優先級 |
---|---|---|
Systemd 管理的服務 | 修改服務的?.service ?文件中的?Limit* ?指令 | ★★★★★ |
全局默認限制 (Systemd) | /etc/systemd/system.conf | ★★★★☆ |
用戶登錄會話 (SSH/終端) | /etc/security/limits.conf | ★★★☆☆ |
臨時調整當前 Shell | ulimit ?命令 | ★★☆☆☆ |
容器內進程 | 容器啟動參數 (如?docker run --ulimit ) | ★★★★★ |
7. 驗證限制
7.1 查看進程實際限制
# 查看進程實際限制
cat /proc/<PID>/limits# 示例:查看Nginx主進程限制
ps aux | grep nginx
cat /proc/$(pgrep nginx)/limits
cat /proc/$(pidof nginx)/limits
?7.2 查看 Systemd 服務的當前限制
# 查看 Systemd 服務的當前限制
systemctl show nginx | grep Limit
?7.3 查看某進程的文件描述符限制
grep -i "max open files" /proc/<pid>/limits?? ?
?7.4?查看系統當前打開文件描述符總數
lsof | wc -l
# 或者查看特定進程
lsof -p <PID> | wc -l
?7.5?查看系統最大文件描述符數
# 查看系統最大文件描述符數
cat /proc/sys/fs/file-max# 臨時修改(重啟失效)
echo 2000000 > /proc/sys/fs/file-max# 永久修改
echo "fs.file-max = 2000000" >> /etc/sysctl.conf
sysctl -p
7.6?實時監控文件描述符使用情況?
#實時監控文件描述符使用情況
watch -n 1 'ls -l /proc/$(pidof mysql)/fd | wc -l'
?7.7?查看特定進程的當前限制?
使用prlimit
命令可以查看指定進程的資源限制情況。
prlimit -p <進程ID>
8. 常見問題
8.1 修改后不生效?
- 檢查是否重啟了相關服務或Shell會話。
- 確認
/etc/security/limits.conf
或/etc/systemd/system.conf
語法正確。 - 確保未通過
ulimit -n
等命令在會話中覆蓋配置。
8.2 權限不足?
- 臨時修改需要當前用戶權限。
- 永久修改可能需要
root
權限或sudo
。
9. 應用場景
9.1 Web 服務器 (Nginx/Apache)
提高 nofile (文件描述符) 以應對高并發連接。
配置 systemd unit 文件。Systemd 通過?cgroups
?+ Unit 文件配置?實現更強大的資源隔離:
# /etc/systemd/system/nginx.service
[Service]
LimitNOFILE=65535 # 直接控制文件描述符
LimitNPROC=4096 # 直接控制進程數
MemoryMax=2G # 內存限制 (cgroups)
CPUQuota=80% # CPU 限制 (cgroups)
Nginx 報錯 “Too many open files”錯時的解決方案。
Systemd 的配置優先級更高且更精確,完全覆蓋?limits.conf
?。
9.2 數據庫 (MySQL/PostgreSQL):
提高 nofile 和 nproc,確保高并發連接穩定性。
9.3 調試程序崩潰:
設置 ulimit -c unlimited 允許生成 core dump 文件用于分析。
9.4 防止資源耗盡攻擊:
設置合理的 nproc 限制防止 fork 炸彈。
設置 fsize/as/data 限制進程內存/文件大小。
9.5 嵌入式/資源受限系統:
嚴格限制內存 (-v, -m)、棧大小 (-s)、進程數 (-u)
9.6?容器化環境
容器(Docker/Kubernetes)通過?cgroups/namespaces?直接控制資源:
docker run --ulimit nofile=1024:1024 ... # 容器內覆蓋所有限制
limits.conf
?對容器內進程完全無效。
10. 注意事項
10.1 謹慎修改硬限制??
因為硬限制是資源使用的上限,修改硬限制可能會影響系統的穩定性,尤其是對于系統級別的硬限制修改,需要謹慎操
10.2 不同shell的行為差異??
不同的shell可能會有不同的ulimit行為,所以在使用時要確保是在目標shell下進行設置。
??10.3 故障排查??
當遇到資源相關的錯誤,如“too many open files”時,可以先使用ulimit -n查看當前文件描述符的限制,如果懷疑是限制過低導致的,可以嘗試調整限制值來解決問題
10.4?nproc
?限制與容器
在容器環境 (Docker/K8s) 中,容器的進程數限制通常由 cgroups 控制,而非?ulimit -u
10.5?限制繼承性
子進程繼承父進程的限制設置
10.6?Limits.conf
?的生效范圍
-
僅影響通過 PAM (Pluggable Authentication Modules) 登錄的會話(如 SSH、本地終端登錄)。
-
不直接影響:
-
系統啟動的服務 (需用 systemd 配置)
-
圖形界面 (GUI) 中非終端啟動的程序
-
cron 作業 (需在 cron 配置或腳本中顯式設置)
-
10.7?云環境限制
部分云服務商鎖定硬限制,需通過平臺控制臺調整。
10.8 權限差異
非 root 用戶只能降低自己的軟限制,且硬限制不可超過系統預設值。
10.9 Unlimited
使用?unlimited
?時要非常謹慎,因為它可能允許進程耗盡系統資源。