博客 / 詳情

返回

Linux系統資源排查以及修改限制

目錄
  • 系統資源排查
    • 內存資源
    • 磁盤資源
    • 進程資源
  • 系統資源限制
    • 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級別最精細,適合現代容器化環境
  • 系統級別設定全局天花板
  • 用户級別實現多用户公平共享
  • 進程級別保證繼承性和安全性
  • 會話級別提供臨時調整靈活性
  1. 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)
  • 多租户環境資源保障
  1. 系統級別(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可以修改
  • 影響深遠:修改不當可能導致系統不穩定

應用場景

  • 服務器性能調優
  • 防止系統級資源耗盡
  • 內核行為定製
  1. 用户級別(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運維)
  • 防止用户消耗過多資源
  1. 進程級別(Process/Thread)

作用域:單個進程及其線程
位置/proc/<pid>/limits、進程控制塊(PCB)
實現:內核進程描述符

# 進程限制繼承關係
父進程 limits → fork() → 子進程繼承 → execve() → 保持限制

# 進程樹限制查看
pstree -p | xargs -I {} cat /proc/{}/limits 2>/dev/null

特點與作用

  • 繼承性:子進程繼承父進程限制
  • 運行時不可增加:只能降低不能提高(除非有CAP_SYS_RESOURCE)
  • 線程共享:同一進程的所有線程共享限制
  • 實時查看:通過/proc文件系統動態查看

應用場景

  • 進程資源監控和調試
  • 安全沙箱(如chroot環境)
  • 服務進程資源控制
  1. 會話級別(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
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.