- 系統資源排查
- 內存資源
- 磁盤資源
- 進程資源
- 系統資源限制
- Cgroup級別
- 系統級別
-
- 修改/etc/sysctl.conf
-
- 用户級別
系統資源排查
內存資源
- 最常用的內存查看命令
free -h # 人類可讀格式(GB/MB)
free -m # 以MB為單位
free -g # 以GB為單位
free -t # 顯示總計行
cat /proc/meminfo # 查看所有內存信息
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 3.7G 295M 3.2G 19M 161M 3.2G
Swap: 3.9G 0B 3.9G
各列含義:
total:總內存used:已使用內存free:空閒內存shared:共享內存buff/cache:緩衝區/緩存內存(可回收)available:可用內存(包括可回收的緩存)
內存健康檢查腳本
#!/bin/bash
# memory_check.sh
echo "=== 內存健康檢查報告 ==="
echo "檢查時間: $(date)"
echo ""
echo "1. 內存使用概覽:"
echo "----------------"
free -h
echo ""
echo "2. 關鍵內存指標:"
echo "----------------"
awk '
BEGIN {print "指標 值 單位"}
/MemTotal/ {printf "總內存 %12.2f GB\n", $2/1024/1024}
/MemFree/ {printf "空閒內存 %12.2f GB\n", $2/1024/1024}
/MemAvailable/ {printf "可用內存 %12.2f GB\n", $2/1024/1024}
/Buffers/ {printf "緩衝區 %12.2f GB\n", $2/1024/1024}
/Cached/ {printf "緩存 %12.2f GB\n", $2/1024/1024}
/SwapTotal/ {printf "總Swap %12.2f GB\n", $2/1024/1024}
/SwapFree/ {printf "空閒Swap %12.2f GB\n", $2/1024/1024}
/SwapCached/ {printf "Swap緩存 %12.2f GB\n", $2/1024/1024}
/Dirty/ {printf "髒頁 %12.2f MB\n", $2/1024}
' /proc/meminfo
echo ""
echo "3. 內存使用前10的進程:"
echo "----------------"
ps aux --sort=-rss | head -11
echo ""
echo "4. Swap使用情況:"
echo "----------------"
swapon --show
echo ""
echo "5. 內存壓力指標:"
echo "----------------"
# 檢查內存壓力
PRESSURE=$(cat /proc/pressure/memory 2>/dev/null || echo "無pressure信息")
if [ "$PRESSURE" != "無pressure信息" ]; then
echo "$PRESSURE"
else
# 使用傳統方法估計
AVAIL=$(free -m | awk '/^Mem:/ {print $7}')
TOTAL=$(free -m | awk '/^Mem:/ {print $2}')
RATIO=$((AVAIL*100/TOTAL))
echo "內存可用率: ${RATIO}%"
if [ $RATIO -lt 10 ]; then
echo "警告: 內存可用率低於10%!"
fi
fi
磁盤資源
- 查看磁盤使用情況
# 基本用法
df # 默認以1K blocks顯示
df -h # 人類可讀格式(GB/MB)
df -hT # 顯示文件系統類型
df -i # 查看inode使用情況
df -Th # 類型+人類可讀格式
# 按使用率排序
df -h | sort -k5 -rh # 按使用百分比降序排序
# 查看特定文件系統
df -h /home # 查看/home分區
df -h /var /tmp /home # 查看多個目錄
# 排除特定文件系統類型
df -h -x tmpfs -x devtmpfs # 排除tmpfs和devtmpfs
- 查看目錄佔用空間
# 查看當前目錄總大小
du -sh # 顯示總大小
du -sh * # 顯示每個文件/目錄大小
du -sh .[!.]* # 顯示隱藏文件大小
# 深度查看
du -h --max-depth=1 # 只顯示一級子目錄
du -h --max-depth=2 # 顯示兩級子目錄
# 排序查看
du -sh * | sort -rh # 按大小降序排列
du -sh * | sort -h # 按大小升序排列
# 查找大文件
du -ah /path | sort -rh | head -20 # 查找大文件
du -ah /path --exclude="*.log" | sort -rh | head -20 # 排除日誌文件
# 實時監控目錄變化
watch -n 5 'du -sh /var/log'
- 詳細磁盤信息
# 查看所有塊設備
lsblk # 樹狀顯示
lsblk -f # 顯示文件系統信息
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,LABEL # 自定義輸出列
lsblk -d -o NAME,SIZE,TYPE,ROTA,RM,SCHED # 查看磁盤屬性
# JSON格式輸出
lsblk -J
lsblk --json
進程資源
- ps - 進程快照
# 查看所有進程
ps aux # BSD格式,最常用
ps -ef # UNIX格式
ps -eLf # 顯示線程(LWP)
# 按資源排序
ps aux --sort=-%cpu | head -10 # 按CPU使用排序
ps aux --sort=-%mem | head -10 # 按內存使用排序
ps aux --sort=-rss | head -10 # 按實際內存排序
ps aux --sort=-vsz | head -10 # 按虛擬內存排序
# 查看特定進程
ps aux | grep nginx # 查找nginx進程
ps -p 1234 -o pid,ppid,user,%cpu,%mem,cmd # 查看指定PID
ps -C nginx -o pid,cmd,%cpu,%mem # 查看指定命令
# 樹狀顯示進程關係
ps auxf # 顯示進程樹
ps -ejH # 顯示進程層級
ps -e --forest # 樹狀圖顯示
# 自定義輸出格式
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -10
ps axo pid,user,comm,rss,vsz,%mem,%cpu --sort=-rss | head -10
- pgrep/pkill - 進程查找/殺除
# 查找進程
pgrep nginx # 查找nginx進程的PID
pgrep -u root # 查找root用户的進程
pgrep -f "nginx.*master" # 通過完整命令行查找
pgrep -l nginx # 顯示進程名和PID
# 查找並顯示詳細信息
pgrep nginx | xargs ps -p # 查找並顯示詳細信息
# 殺除進程
pkill nginx # 殺除nginx進程
pkill -9 nginx # 強制殺除
pkill -u username # 殺除用户的進程
pkill -f "pattern" # 通過模式殺除
# 發送信號
pkill -HUP nginx # 發送HUP信號
pkill -USR1 nginx # 發送USR1信號
- 進程網絡連接
# 查看進程網絡連接
ss -tunap # 顯示所有連接
ss -tunap | grep $PID # 查看特定進程
ss -tunap | grep :80 # 查看80端口連接
# 查看監聽端口
ss -tunlp # 顯示監聽端口
ss -tunlp | grep nginx # 查看nginx監聽
# 統計信息
ss -s # socket統計摘要
ss -t state established # 只顯示已建立連接
ss -t state established | wc -l # 已建立連接數
# 按進程顯示
ss -tup # 顯示進程信息
系統資源限制
Linux系統提供了多層次的資源限制機制,主要分為以下幾個級別:
- Cgroup級別最精細,適合現代容器化環境
- 系統級別設定全局天花板
- 用户級別實現多用户公平共享
- 進程級別保證繼承性和安全性
- 會話級別提供臨時調整靈活性
- Cgroup級別(Control Groups)
作用域:進程組/容器/服務單元
位置:/sys/fs/cgroup/ (cgroup v2)
實現:內核cgroup子系統
# 層級結構示例
/sys/fs/cgroup/
├── system.slice/ # 系統服務
├── user.slice/ # 用户會話
├── docker/ # Docker容器
└── kubepods/ # Kubernetes Pods
特點與作用:
- 資源隔離:CPU、內存、IO、網絡完全隔離
- 層次化控制:父子cgroup繼承和覆蓋限制
- 動態調整:運行時可以修改限制
- 統計監控:提供詳細的資源使用統計
- 現代容器基礎:Docker、Kubernetes的核心依賴
應用場景:
- 容器化部署(Docker、Podman)
- 雲原生應用(Kubernetes)
- 系統服務資源隔離(systemd)
- 多租户環境資源保障
- 系統級別(System-wide)
作用域:整個操作系統
位置:/proc/sys/、/etc/sysctl.conf
實現:內核運行時參數
# 關鍵參數示例
/proc/sys/fs/file-max # 系統總文件描述符數
/proc/sys/kernel/pid_max # 系統最大PID數
/proc/sys/vm/max_map_count # 最大內存映射區域
特點與作用:
- 全局上限:為所有用户/進程設置天花板
- 內核行為控制:影響內核資源管理策略
- 需要root權限:只有root可以修改
- 影響深遠:修改不當可能導致系統不穩定
應用場景:
- 服務器性能調優
- 防止系統級資源耗盡
- 內核行為定製
- 用户級別(User/Group)
作用域:特定用户或用户組
位置:/etc/security/limits.conf、/etc/security/limits.d/
實現:PAM(Pluggable Authentication Modules)
# 配置格式解析
# domain type item value
user1 hard nofile 10000 # 硬限制,不可超過
user1 soft nofile 5000 # 軟限制,可臨時超過
@devs - nproc 200 # 組限制
* hard core 0 # 所有用户
特點與作用:
- 基於登錄會話:用户登錄時通過PAM應用
- 軟硬限制:soft(當前限制)vs hard(最大限制)
- 持久化配置:配置文件重啓後保持
- 需要重新登錄:修改後用户需重新登錄生效
應用場景:
- 多用户服務器(如學校、公司)
- 不同用户不同權限(如開發vs運維)
- 防止用户消耗過多資源
- 進程級別(Process/Thread)
作用域:單個進程及其線程
位置:/proc/<pid>/limits、進程控制塊(PCB)
實現:內核進程描述符
# 進程限制繼承關係
父進程 limits → fork() → 子進程繼承 → execve() → 保持限制
# 進程樹限制查看
pstree -p | xargs -I {} cat /proc/{}/limits 2>/dev/null
特點與作用:
- 繼承性:子進程繼承父進程限制
- 運行時不可增加:只能降低不能提高(除非有CAP_SYS_RESOURCE)
- 線程共享:同一進程的所有線程共享限制
- 實時查看:通過/proc文件系統動態查看
應用場景:
- 進程資源監控和調試
- 安全沙箱(如chroot環境)
- 服務進程資源控制
- 會話級別(Shell/Session)
作用域:當前shell會話及其子進程
位置:shell內置變量、環境
實現:ulimit命令(bash內置)、setrlimit()系統調用
# 臨時修改,會話結束失效
ulimit -n 65535 # 僅當前shell
(ulimit -n 65535; command) # 僅子shell
特點與作用:
- 臨時性:退出shell後失效
- 便捷性:快速測試不同限制
- 子進程繼承:在shell中啓動的進程繼承限制
- 無法突破硬限制:只能設置在硬限制範圍內
應用場景:
- 臨時測試應用程序
- 開發環境調試
- 腳本中臨時調整限制
優先級層次(從高到低):
Cgroup限制 > 系統限制 > 用户限制 > 進程限制 > 會話限制
Cgroup級別
-
查看Cgroup版本
cgroup v1:每個控制器單獨掛載(cpu、memory等)
cgroup v2:統一掛載,分層控制
mount | grep cgroup
# centos7.9環境
[root@localhost ~]# mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuacct,cpu)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_prio,net_cls)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
#Ubuntu2404環境
root@huhy:~# mount | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
系統級別
- 通過/proc/sys文件系統查看
# 1. 文件描述符相關
cat /proc/sys/fs/file-max # 系統總文件描述符數
cat /proc/sys/fs/file-nr # 當前已分配/使用/最大文件描述符數
cat /proc/sys/fs/nr_open # 單進程最大文件描述符數
# 2. 進程相關
cat /proc/sys/kernel/pid_max # 系統最大進程數
cat /proc/sys/kernel/threads-max # 系統最大線程數
# 3. 內存相關
cat /proc/sys/vm/max_map_count # 最大內存映射區域數(影響Java等)
cat /proc/sys/vm/overcommit_memory # 內存分配策略
cat /proc/sys/vm/overcommit_ratio # 內存過量使用比例
# 4. 網絡相關
cat /proc/sys/net/core/somaxconn # TCP連接隊列最大長度
cat /proc/sys/net/ipv4/tcp_max_syn_backlog # SYN隊列長度
cat /proc/sys/net/core/netdev_max_backlog # 網卡接收隊列長度
- 使用sysctl命令查看
# 查看所有內核參數
sysctl -a
# 按類別查看
sysctl -a | grep "^fs\."
sysctl -a | grep "^kernel\."
sysctl -a | grep "^vm\."
sysctl -a | grep "^net\."
# 查看特定參數
sysctl fs.file-max
sysctl kernel.pid_max
sysctl vm.max_map_count
# 查看多個參數
sysctl fs.file-max kernel.pid_max vm.max_map_count
修改系統級別資源限制
-
修改/etc/sysctl.conf
# 備份原始配置
cp /etc/sysctl.conf /etc/sysctl.conf.backup
# 編輯配置文件
vi /etc/sysctl.conf
# 添加或修改以下參數(示例配置):
# --------------------------------------------------
# 文件系統相關
fs.file-max = 2097152 # 系統最大文件描述符數
fs.nr_open = 1048576 # 進程最大文件描述符數
# 內核進程相關
kernel.pid_max = 65536 # 系統最大進程數
kernel.threads-max = 65536 # 系統最大線程數
kernel.sysrq = 1 # 啓用SysRq鍵
# 虛擬內存相關
vm.swappiness = 10 # 減少swap使用傾向(0-100)
vm.vfs_cache_pressure = 50 # 目錄項和inode緩存壓力
vm.overcommit_memory = 0 # 內存分配策略:0-啓發式,1-總是,2-拒絕
vm.overcommit_ratio = 50 # 允許過量使用的內存百分比
vm.max_map_count = 262144 # 最大內存映射區域數(重要!)
# 網絡相關
net.core.somaxconn = 65535 # TCP連接隊列最大長度
net.core.netdev_max_backlog = 5000 # 網卡接收隊列長度
net.core.rmem_max = 16777216 # 最大接收緩衝區
net.core.wmem_max = 16777216 # 最大發送緩衝區
net.ipv4.ip_local_port_range = 10000 65000 # 本地端口範圍(擴大臨時端口範圍)
# IPv4相關
net.ipv4.tcp_max_syn_backlog = 8192 # SYN隊列長度
net.ipv4.tcp_syncookies = 1 # 啓用SYN cookies
net.ipv4.ip_local_port_range = 1024 65000 # 本地端口範圍
# IPv6相關
net.ipv6.conf.all.disable_ipv6 = 0 # 不禁用IPv6
net.ipv6.conf.default.forwarding = 1
# --------------------------------------------------
- 使配置立即生效
sysctl -p
用户級別
- 查看當前用户的所有限制
ulimit -a
core file size (blocks, -c) 0 # 核心轉儲文件最大大小,0表示禁用生成core文件
data seg size (kbytes, -d) unlimited # 進程數據段最大內存限制;無影響,不限制內存使用
scheduling priority (-e) 0 # 進程調度優先級,0為默認;無影響,不影響資源分配
file size (blocks, -f) unlimited # 進程可創建的最大文件大小;無影響,不限制文件大小
pending signals (-i) 14989 # 進程可掛起的最大信號數量;低影響,數值足夠,不會觸發限制
max locked memory (kbytes, -l) 64 # 進程可鎖定的最大內存(KB)
max memory size (kbytes, -m) unlimited # 進程可使用的最大物理內存;無影響,不限制內存使用
open files (-n) 1024 # 單個進程可打開的最大文件句柄數;高風險!默認1024過小
pipe size (512 bytes, -p) 8 # 管道緩衝區大小(8*512=4096字節);無影響,默認值足夠
POSIX message queues (bytes, -q) 819200 # POSIX消息隊列最大字節數
real-time priority (-r) 0 # 實時進程調度優先級;無影響,非實時系統無需調整
stack size (kbytes, -s) 8192 # 進程棧空間最大大小(KB)
cpu time (seconds, -t) unlimited # 進程可使用的最大CPU時間;無影響,不限制CPU使用時長
max user processes (-u) 14989 # 單個用户可創建的最大進程/線程數;核心影響!若服務器進程數接近該值,無法fork新進程,觸發Resource unavailable
virtual memory (kbytes, -v) unlimited # 進程可使用的最大虛擬內存;無影響,不限制虛擬內存使用
file locks (-x) unlimited # 進程可持有的最大文件鎖數量;無影響,不限制文件鎖
- 查看其他用户的限制
su - <用户名> -c 'ulimit -a'
修改用户級別限制
- 臨時修改(當前會話有效)
# 修改當前shell的限制(僅當前會話有效)
ulimit -n 65536 # 設置打開文件數為65536
ulimit -u 4096 # 設置最大進程數為4096
ulimit -c unlimited # 允許生成無限大的core文件
ulimit -s unlimited # 設置棧大小為無限制
# 修改硬限制(需要先設置硬限制較高)
# 注意:普通用户只能降低硬限制,不能提高
ulimit -Hn 65536
ulimit -Hu 4096
-
永久修改用户限制
修改/etc/security/limits.conf(主配置文件)
# 備份原始配置
sudo cp /etc/security/limits.conf /etc/security/limits.conf.backup.$(date +%Y%m%d)
# 編輯配置文件
sudo vi /etc/security/limits.conf
# 文件格式説明:
# <domain> <type> <item> <value>
# domain可以是:用户名、@組名、*(所有用户)
# type可以是:soft、hard、-(both)
# item是資源類型(nofile、nproc等)
# value是限制值,可以是數字或unlimited
# =================================================
# 示例配置:
# 為所有用户設置基礎限制
* soft nofile 10240
* hard nofile 65536
* soft nproc 1024
* hard nproc 4096
* soft core 0 # 禁止生成core文件
* hard core 0
# 為特定用户alice設置更高限制
alice soft nofile 65536
alice hard nofile 262144
alice soft nproc 4096
alice hard nproc 16384
alice soft memlock unlimited
alice hard memlock unlimited
# 為用户組developers設置限制
@developers soft nofile 32768
@developers hard nofile 131072
@developers - nproc 2048
@developers - core 1073741824 # 1GB core文件
# 為系統用户nginx設置限制
nginx - nofile 65536
nginx - nproc 4096
nginx - memlock unlimited
# 為MySQL用户設置特殊限制
mysql soft nofile 65536
mysql hard nofile 65536
mysql soft nproc unlimited
mysql hard nproc unlimited
# =================================================
# 保存後,用户需要重新登錄才能生效
- 常用資源項説明
| 項目 | 説明 | 推薦值 | 示例 |
|---|---|---|---|
nofile |
打開文件描述符數 | 服務: 65536+ 用户: 4096+ | hard nofile 65536 |
nproc |
最大進程數 | 服務: 4096+ 用户: 1024+ | hard nproc 4096 |
core |
核心轉儲文件大小 | 調試: unlimited 生產: 0 | soft core 0 |
memlock |
鎖定內存大小 | 數據庫: unlimited | hard memlock unlimited |
stack |
棧大小 | 默認: 8192KB | soft stack 32768 |
data |
數據段大小 | 大內存應用: unlimited | hard data unlimited |
as |
虛擬內存大小 | 通常unlimited | hard as unlimited |
fsize |
文件大小 | 根據需求 | hard fsize 1073741824 |
cpu |
CPU時間(分鐘) | 限制惡意進程 | hard cpu 1000 |
maxlogins |
最大登錄數 | 防止多登錄 | hard maxlogins 3 |
maxsyslogins |
系統最大登錄數 | 系統級限制 | hard maxsyslogins 100 |
priority |
進程優先級 | nice值 | soft priority 0 |