Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux ulimit 參數詳解與系統資源限制優化最佳實踐

編輯:Linux 教學

前言

`ulimit` 是 Shell 內建命令,用於控制進程可用的系統資源上限 (Resource Limits)。正確配置文件描述符數、進程數、棧大小、核心轉儲等限制,是高併發服務器、容器宿主機、數據庫節點穩定運行的基礎。本文詳細解析各參數含義、臨時/永久修改方法、systemd 整合與常見踩坑。

一、核心參數對照表

選項資源單位默認值 (典型)建議高併發值說明
-n最大打開文件描述符數個102465535 / 1000000**最關鍵參數**,含 Socket、文件、管道
-u最大用戶進程數 (含線程)個3846 / 无限制65535 / 1000000防止 fork 炸彈,Nginx/Go/Java 線程池受限
-s棧大小KB8192 (8MB)256-1024 (KB)線程棧,過大限制線程數,過小導致棧溢出
-cCore Dump 文件最大值塊 (512B) / 0=禁用0unlimited生產環境建議開啟並配合目錄權限
-fShell 創建文件最大值塊 (512B)unlimitedunlimited極少調整
-tCPU 時間上限秒unlimitedunlimited防止失控進程佔用 CPU
-v虛擬內存上限KBunlimited視業務而定容器/沙箱限制記憶體
-m常駐內存上限KBunlimited通常不生效 (Linux 忽略)建議用 cgroups memory.limit_in_bytes
-l最大鎖定內存KB64 / 无限制unlimitedmlock()、大頁內存、實時系統關鍵
-p管道緩衝區大小512B 塊8默認即可
-r實時調度優先級上限優先級值099SCHED_FIFO/RR 需 CAP_SYS_NICE

二、查看與臨時修改

# 查看所有限制 (软限制)
ulimit -a

# 查看硬限制
ulimit -Ha

# 查看單項
ulimit -n        # 软限制
ulimit -Hn       # 硬限制

# 臨時修改 (僅當前 Shell 及其子進程生效)
ulimit -n 65535
ulimit -u 65535
ulimit -c unlimited

# 同時設置软/硬限制 (-S 软, -H 硬, 默認雙設置)
ulimit -SHn 65535

注意:软限制 ≤ 硬限制;普通用戶可降低软限制、不可超過硬限制;root 可任意設置。

三、永久生效配置方案

方案 1:/etc/security/limits.conf (PAM 登入生效,推薦)

# 格式:   
# * 代表所有用戶,root 需單獨寫

* soft nofile 655350
* hard nofile 655350
* soft nproc  11000
* hard nproc  11000
root soft nofile 655350
root hard nofile 655350
root soft nproc  11000
root hard nproc  11000

# 啟用 core dump
* soft core unlimited
* hard core unlimited

需確保 `/etc/pam.d/login`、`/etc/pam.d/sshd`、`/etc/pam.d/su` 包含:

session required pam_limits.so

方案 2:systemd 服務級限制 (systemd 管理的服務)

# /etc/systemd/system/your-service.service.d/limits.conf
[Service]
LimitNOFILE=655350
LimitNPROC=11000
LimitCORE=infinity
LimitMEMLOCK=infinity
LimitSTACK=1048576  # 1MB (單位 bytes)

# 重載並重啟
systemctl daemon-reload
systemctl restart your-service

**優先級**:systemd 服務配置 > limits.conf > 默認值。容器中 systemd 通常不運行,需在容器運行時參數或入口腳本設置。

方案 3:/etc/profile.d/limits.sh (登入 Shell 生效,不覆蓋 systemd)

ulimit -SHn 655350
ulimit -SHu 11000
ulimit -c unlimited

方案 4:內核參數 /etc/sysctl.conf (系統級硬上限)

# 文件描述符系統總上限
fs.file-max = 2097152
fs.nr_open = 1048576  # 單進程硬上限上限 (kernel 2.6.25+)

# 生效
sysctl -p

單進程 `ulimit -n` 不能超過 `fs.nr_open`。

四、驗證與排查

# 1. 確認當前進程限制
cat /proc/$$/limits

# 2. 確認指定 PID 進程限制
cat /proc//limits

# 3. 實時監控文件描述符使用
watch -n 1 'lsof -p  | wc -l'

# 4. 系統全局 FD 使用
cat /proc/sys/fs/file-nr
# 輸出:已分配FD數  已分配但未使用  系統最大FD數

五、容器環境特別說明

  • Docker:`docker run --ulimit nofile=65535:65535 --ulimit nproc=65535:65535`
  • Kubernetes:Pod `securityContext` 不直接支援 ulimit;需在容器啟動命令 `command: ["/bin/sh","-c","ulimit -n 65535 && exec myapp"]` 或宿主機節點配置生效。
  • systemd-nspawn / LXC:繼承宿主機 limits.conf 或配置文件設置。

六、常見踩坑與避坑

現象原因解決
ulimit -n 修改後重啟失效未寫入 limits.conf 或 pam_limits.so 未載入檢查 /etc/pam.d/* 包含 session required pam_limits.so
systemd 服務不生效 limits.confsystemd 讀取自身 LimitNOFILE使用 systemd drop-in 配置 LimitNOFILE
普通用戶無法提高硬限制硬限制需 root 權限在 limits.conf 由 root 預設
Java 應用報 "Too many open files"JVM 默認使用 ulimit -n,但 Netty 等可能預分配啟動腳本加 ulimit -n;JVM 參數 -XX:-MaxFDLimit
core 文件不生成ulimit -c 0 或目錄無寫權限 / kernel.core_pattern 導向管道ulimit -c unlimited;mkdir -m 1777 /var/crash;sysctl kernel.core_pattern=/var/crash/core.%e.%p
棧大小設置過小導致 Segfaultulimit -s 64 (64KB) 不足線程棧建議 256KB-1MB (ulimit -s 256-1024)

七、一鍵優化腳本 (生產環境參考)

#!/bin/bash
# /usr/local/sbin/optimize-limits.sh
cat > /etc/security/limits.d/99-optimize.conf <<'EOF'
* soft nofile 1048576
* hard nofile 1048576
* soft nproc  1048576
* hard nproc  1048576
* soft core unlimited
* hard core unlimited
* soft memlock unlimited
* hard memlock unlimited
root soft nofile 1048576
root hard nofile 1048576
root soft nproc  1048576
root hard nproc  1048576
root soft core unlimited
root hard core unlimited
root soft memlock unlimited
root hard memlock unlimited
EOF

cat > /etc/sysctl.d/99-fs-limits.conf <<'EOF'
fs.file-max = 2097152
fs.nr_open = 1048576
vm.max_map_count = 262144
EOF

sysctl --system
systemctl daemon-reload

echo "優化完成,請重新登入或重啟服務驗證。"

結語

資源限制是系統穩定性的「安全閥」。生產環境建議採用 **limits.conf (用戶登入) + systemd drop-in (服務級) + sysctl fs.nr_open (內核上限)** 三層配置,並納入自動化部署流程。定期用 `cat /proc//limits` 驗證關鍵服務實際生效值,防止配置漂移導致「Too many open files」等線上故障。

Copyright © Windows教程網 All Rights Reserved