Linux系统资源排查以及修改限制

系统资源排查

内存资源

  • 最常用的内存查看命令
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
posted @ 2025-12-23 16:30  huhy  阅读(6)  评论(0)    收藏  举报
--> --> /*文章评论*/