找回密码
 立即注册
首页 业界区 安全 Linux系统资源排查以及修改限制

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

蓬森莉 昨天 21:30
目录

  • 系统资源排查

    • 内存资源
    • 磁盘资源
    • 进程资源

  • 系统资源限制

    • Cgroup级别
    • 系统级别



        • 修改/etc/sysctl.conf


    • 用户级别


系统资源排查

内存资源


  • 最常用的内存查看命令
  1. free -h                    # 人类可读格式(GB/MB)
  2. free -m                    # 以MB为单位
  3. free -g                    # 以GB为单位
  4. free -t                    # 显示总计行
  5. cat /proc/meminfo          # 查看所有内存信息
复制代码
  1. [root@localhost ~]# free -h
  2.               total        used        free      shared  buff/cache   available
  3. Mem:           3.7G        295M        3.2G         19M        161M        3.2G
  4. Swap:          3.9G          0B        3.9G
复制代码
各列含义

  • total:总内存
  • used:已使用内存
  • free:空闲内存
  • shared:共享内存
  • buff/cache:缓冲区/缓存内存(可回收)
  • available:可用内存(包括可回收的缓存)
内存健康检查脚本
  1. #!/bin/bash
  2. # memory_check.sh
  3. echo "=== 内存健康检查报告 ==="
  4. echo "检查时间: $(date)"
  5. echo ""
  6. echo "1. 内存使用概览:"
  7. echo "----------------"
  8. free -h
  9. echo ""
  10. echo "2. 关键内存指标:"
  11. echo "----------------"
  12. awk '
  13. BEGIN {print "指标              值             单位"}
  14. /MemTotal/ {printf "总内存          %12.2f GB\n", $2/1024/1024}
  15. /MemFree/ {printf "空闲内存        %12.2f GB\n", $2/1024/1024}
  16. /MemAvailable/ {printf "可用内存        %12.2f GB\n", $2/1024/1024}
  17. /Buffers/ {printf "缓冲区          %12.2f GB\n", $2/1024/1024}
  18. /Cached/ {printf "缓存            %12.2f GB\n", $2/1024/1024}
  19. /SwapTotal/ {printf "总Swap         %12.2f GB\n", $2/1024/1024}
  20. /SwapFree/ {printf "空闲Swap       %12.2f GB\n", $2/1024/1024}
  21. /SwapCached/ {printf "Swap缓存       %12.2f GB\n", $2/1024/1024}
  22. /Dirty/ {printf "脏页            %12.2f MB\n", $2/1024}
  23. ' /proc/meminfo
  24. echo ""
  25. echo "3. 内存使用前10的进程:"
  26. echo "----------------"
  27. ps aux --sort=-rss | head -11
  28. echo ""
  29. echo "4. Swap使用情况:"
  30. echo "----------------"
  31. swapon --show
  32. echo ""
  33. echo "5. 内存压力指标:"
  34. echo "----------------"
  35. # 检查内存压力
  36. PRESSURE=$(cat /proc/pressure/memory 2>/dev/null || echo "无pressure信息")
  37. if [ "$PRESSURE" != "无pressure信息" ]; then
  38.     echo "$PRESSURE"
  39. else
  40.     # 使用传统方法估计
  41.     AVAIL=$(free -m | awk '/^Mem:/ {print $7}')
  42.     TOTAL=$(free -m | awk '/^Mem:/ {print $2}')
  43.     RATIO=$((AVAIL*100/TOTAL))
  44.     echo "内存可用率: ${RATIO}%"
  45.     if [ $RATIO -lt 10 ]; then
  46.         echo "警告: 内存可用率低于10%!"
  47.     fi
  48. fi
复制代码
磁盘资源


  • 查看磁盘使用情况
  1. # 基本用法
  2. df                         # 默认以1K blocks显示
  3. df -h                      # 人类可读格式(GB/MB)
  4. df -hT                     # 显示文件系统类型
  5. df -i                      # 查看inode使用情况
  6. df -Th                     # 类型+人类可读格式
  7. # 按使用率排序
  8. df -h | sort -k5 -rh       # 按使用百分比降序排序
  9. # 查看特定文件系统
  10. df -h /home                # 查看/home分区
  11. df -h /var /tmp /home      # 查看多个目录
  12. # 排除特定文件系统类型
  13. df -h -x tmpfs -x devtmpfs # 排除tmpfs和devtmpfs
复制代码

  • 查看目录占用空间
  1. # 查看当前目录总大小
  2. du -sh                      # 显示总大小
  3. du -sh *                    # 显示每个文件/目录大小
  4. du -sh .[!.]*               # 显示隐藏文件大小
  5. # 深度查看
  6. du -h --max-depth=1         # 只显示一级子目录
  7. du -h --max-depth=2         # 显示两级子目录
  8. # 排序查看
  9. du -sh * | sort -rh         # 按大小降序排列
  10. du -sh * | sort -h          # 按大小升序排列
  11. # 查找大文件
  12. du -ah /path | sort -rh | head -20    # 查找大文件
  13. du -ah /path --exclude="*.log" | sort -rh | head -20  # 排除日志文件
  14. # 实时监控目录变化
  15. watch -n 5 'du -sh /var/log'
复制代码

  • 详细磁盘信息
  1. # 查看所有块设备
  2. lsblk                       # 树状显示
  3. lsblk -f                    # 显示文件系统信息
  4. lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,LABEL  # 自定义输出列
  5. lsblk -d -o NAME,SIZE,TYPE,ROTA,RM,SCHED    # 查看磁盘属性
  6. # JSON格式输出
  7. lsblk -J
  8. lsblk --json
复制代码
进程资源


  • ps - 进程快照
  1. # 查看所有进程
  2. ps aux                     # BSD格式,最常用
  3. ps -ef                     # UNIX格式
  4. ps -eLf                    # 显示线程(LWP)
  5. # 按资源排序
  6. ps aux --sort=-%cpu | head -10      # 按CPU使用排序
  7. ps aux --sort=-%mem | head -10      # 按内存使用排序
  8. ps aux --sort=-rss | head -10       # 按实际内存排序
  9. ps aux --sort=-vsz | head -10       # 按虚拟内存排序
  10. # 查看特定进程
  11. ps aux | grep nginx                 # 查找nginx进程
  12. ps -p 1234 -o pid,ppid,user,%cpu,%mem,cmd  # 查看指定PID
  13. ps -C nginx -o pid,cmd,%cpu,%mem    # 查看指定命令
  14. # 树状显示进程关系
  15. ps auxf                             # 显示进程树
  16. ps -ejH                             # 显示进程层级
  17. ps -e --forest                      # 树状图显示
  18. # 自定义输出格式
  19. ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head -10
  20. ps axo pid,user,comm,rss,vsz,%mem,%cpu --sort=-rss | head -10
复制代码

  • pgrep/pkill - 进程查找/杀除
  1. # 查找进程
  2. pgrep nginx                      # 查找nginx进程的PID
  3. pgrep -u root                    # 查找root用户的进程
  4. pgrep -f "nginx.*master"         # 通过完整命令行查找
  5. pgrep -l nginx                   # 显示进程名和PID
  6. # 查找并显示详细信息
  7. pgrep nginx | xargs ps -p        # 查找并显示详细信息
  8. # 杀除进程
  9. pkill nginx                      # 杀除nginx进程
  10. pkill -9 nginx                   # 强制杀除
  11. pkill -u username                # 杀除用户的进程
  12. pkill -f "pattern"               # 通过模式杀除
  13. # 发送信号
  14. pkill -HUP nginx                 # 发送HUP信号
  15. pkill -USR1 nginx                # 发送USR1信号
复制代码

  • 进程网络连接
  1. # 查看进程网络连接
  2. ss -tunap                      # 显示所有连接
  3. ss -tunap | grep $PID          # 查看特定进程
  4. ss -tunap | grep :80           # 查看80端口连接
  5. # 查看监听端口
  6. ss -tunlp                      # 显示监听端口
  7. ss -tunlp | grep nginx         # 查看nginx监听
  8. # 统计信息
  9. ss -s                          # socket统计摘要
  10. ss -t state established        # 只显示已建立连接
  11. ss -t state established | wc -l        # 已建立连接数
  12. # 按进程显示
  13. ss -tup                        # 显示进程信息
复制代码
系统资源限制

Linux系统提供了多层次的资源限制机制,主要分为以下几个级别:

  • Cgroup级别最精细,适合现代容器化环境
  • 系统级别设定全局天花板
  • 用户级别实现多用户公平共享
  • 进程级别保证继承性和安全性
  • 会话级别提供临时调整灵活性

  • Cgroup级别(Control Groups)
作用域:进程组/容器/服务单元
位置:/sys/fs/cgroup/ (cgroup v2)
实现:内核cgroup子系统
  1. # 层级结构示例
  2. /sys/fs/cgroup/
  3. ├── system.slice/          # 系统服务
  4. ├── user.slice/           # 用户会话
  5. ├── docker/               # Docker容器
  6. └── kubepods/             # Kubernetes Pods
复制代码
特点与作用

  • 资源隔离:CPU、内存、IO、网络完全隔离
  • 层次化控制:父子cgroup继承和覆盖限制
  • 动态调整:运行时可以修改限制
  • 统计监控:提供详细的资源使用统计
  • 现代容器基础:Docker、Kubernetes的核心依赖
应用场景

  • 容器化部署(Docker、Podman)
  • 云原生应用(Kubernetes)
  • 系统服务资源隔离(systemd)
  • 多租户环境资源保障

  • 系统级别(System-wide)
作用域:整个操作系统
位置:/proc/sys/、/etc/sysctl.conf
实现:内核运行时参数
  1. # 关键参数示例
  2. /proc/sys/fs/file-max           # 系统总文件描述符数
  3. /proc/sys/kernel/pid_max        # 系统最大PID数
  4. /proc/sys/vm/max_map_count      # 最大内存映射区域
复制代码
特点与作用

  • 全局上限:为所有用户/进程设置天花板
  • 内核行为控制:影响内核资源管理策略
  • 需要root权限:只有root可以修改
  • 影响深远:修改不当可能导致系统不稳定
应用场景

  • 服务器性能调优
  • 防止系统级资源耗尽
  • 内核行为定制

  • 用户级别(User/Group)
作用域:特定用户或用户组
位置:/etc/security/limits.conf、/etc/security/limits.d/
实现:PAM(Pluggable Authentication Modules)
  1. # 配置格式解析
  2. # domain    type    item        value
  3. user1       hard    nofile      10000    # 硬限制,不可超过
  4. user1       soft    nofile      5000     # 软限制,可临时超过
  5. @devs       -       nproc       200      # 组限制
  6. *           hard    core        0        # 所有用户
复制代码
特点与作用

  • 基于登录会话:用户登录时通过PAM应用
  • 软硬限制:soft(当前限制)vs hard(最大限制)
  • 持久化配置:配置文件重启后保持
  • 需要重新登录:修改后用户需重新登录生效
应用场景

  • 多用户服务器(如学校、公司)
  • 不同用户不同权限(如开发vs运维)
  • 防止用户消耗过多资源

  • 进程级别(Process/Thread)
作用域:单个进程及其线程
位置:/proc//limits、进程控制块(PCB)
实现:内核进程描述符
  1. # 进程限制继承关系
  2. 父进程 limits → fork() → 子进程继承 → execve() → 保持限制
  3. # 进程树限制查看
  4. pstree -p | xargs -I {} cat /proc/{}/limits 2>/dev/null
复制代码
特点与作用

  • 继承性:子进程继承父进程限制
  • 运行时不可增加:只能降低不能提高(除非有CAP_SYS_RESOURCE)
  • 线程共享:同一进程的所有线程共享限制
  • 实时查看:通过/proc文件系统动态查看
应用场景

  • 进程资源监控和调试
  • 安全沙箱(如chroot环境)
  • 服务进程资源控制

  • 会话级别(Shell/Session)
作用域:当前shell会话及其子进程
位置:shell内置变量、环境
实现:ulimit命令(bash内置)、setrlimit()系统调用
  1. # 临时修改,会话结束失效
  2. ulimit -n 65535      # 仅当前shell
  3. (ulimit -n 65535; command)  # 仅子shell
复制代码
特点与作用

  • 临时性:退出shell后失效
  • 便捷性:快速测试不同限制
  • 子进程继承:在shell中启动的进程继承限制
  • 无法突破硬限制:只能设置在硬限制范围内
应用场景

  • 临时测试应用程序
  • 开发环境调试
  • 脚本中临时调整限制
优先级层次(从高到低):
Cgroup限制 > 系统限制 > 用户限制 > 进程限制 > 会话限制
Cgroup级别


  • 查看Cgroup版本
    cgroup v1:每个控制器单独挂载(cpu、memory等)
    cgroup v2:统一挂载,分层控制
  1. mount | grep cgroup
复制代码
  1. # centos7.9环境
  2. [root@localhost ~]# mount | grep cgroup
  3. tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
  4. 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)
  5. cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)
  6. cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
  7. cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuacct,cpu)
  8. cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
  9. cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
  10. cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
  11. cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
  12. cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_prio,net_cls)
  13. cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
  14. cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
复制代码
  1. #Ubuntu2404环境
  2. root@huhy:~# mount | grep cgroup
  3. cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
复制代码
系统级别


  • 通过/proc/sys文件系统查看
  1. # 1. 文件描述符相关
  2. cat /proc/sys/fs/file-max           # 系统总文件描述符数
  3. cat /proc/sys/fs/file-nr            # 当前已分配/使用/最大文件描述符数
  4. cat /proc/sys/fs/nr_open            # 单进程最大文件描述符数
  5. # 2. 进程相关
  6. cat /proc/sys/kernel/pid_max        # 系统最大进程数
  7. cat /proc/sys/kernel/threads-max    # 系统最大线程数
  8. # 3. 内存相关
  9. cat /proc/sys/vm/max_map_count      # 最大内存映射区域数(影响Java等)
  10. cat /proc/sys/vm/overcommit_memory  # 内存分配策略
  11. cat /proc/sys/vm/overcommit_ratio   # 内存过量使用比例
  12. # 4. 网络相关
  13. cat /proc/sys/net/core/somaxconn    # TCP连接队列最大长度
  14. cat /proc/sys/net/ipv4/tcp_max_syn_backlog  # SYN队列长度
  15. cat /proc/sys/net/core/netdev_max_backlog   # 网卡接收队列长度
复制代码

  • 使用sysctl命令查看
  1. # 查看所有内核参数
  2. sysctl -a
  3. # 按类别查看
  4. sysctl -a | grep "^fs\."
  5. sysctl -a | grep "^kernel\."
  6. sysctl -a | grep "^vm\."
  7. sysctl -a | grep "^net\."
  8. # 查看特定参数
  9. sysctl fs.file-max
  10. sysctl kernel.pid_max
  11. sysctl vm.max_map_count
  12. # 查看多个参数
  13. sysctl fs.file-max kernel.pid_max vm.max_map_count
复制代码
修改系统级别资源限制


  • 修改/etc/sysctl.conf
  1. # 备份原始配置
  2. cp /etc/sysctl.conf /etc/sysctl.conf.backup
  3. # 编辑配置文件
  4. vi /etc/sysctl.conf
  5. # 添加或修改以下参数(示例配置):
  6. # --------------------------------------------------
  7. # 文件系统相关
  8. fs.file-max = 2097152          # 系统最大文件描述符数
  9. fs.nr_open = 1048576           # 进程最大文件描述符数
  10. # 内核进程相关
  11. kernel.pid_max = 65536         # 系统最大进程数
  12. kernel.threads-max = 65536     # 系统最大线程数
  13. kernel.sysrq = 1               # 启用SysRq键
  14. # 虚拟内存相关
  15. vm.swappiness = 10             # 减少swap使用倾向(0-100)
  16. vm.vfs_cache_pressure = 50     # 目录项和inode缓存压力
  17. vm.overcommit_memory = 0       # 内存分配策略:0-启发式,1-总是,2-拒绝
  18. vm.overcommit_ratio = 50       # 允许过量使用的内存百分比
  19. vm.max_map_count = 262144      # 最大内存映射区域数(重要!)
  20. # 网络相关
  21. net.core.somaxconn = 65535     # TCP连接队列最大长度
  22. net.core.netdev_max_backlog = 5000  # 网卡接收队列长度
  23. net.core.rmem_max = 16777216   # 最大接收缓冲区
  24. net.core.wmem_max = 16777216   # 最大发送缓冲区
  25. net.ipv4.ip_local_port_range = 10000 65000 # 本地端口范围(扩大临时端口范围)
  26. # IPv4相关
  27. net.ipv4.tcp_max_syn_backlog = 8192  # SYN队列长度
  28. net.ipv4.tcp_syncookies = 1    # 启用SYN cookies
  29. net.ipv4.ip_local_port_range = 1024 65000  # 本地端口范围
  30. # IPv6相关
  31. net.ipv6.conf.all.disable_ipv6 = 0   # 不禁用IPv6
  32. net.ipv6.conf.default.forwarding = 1
  33. # --------------------------------------------------
复制代码

  • 使配置立即生效
  1. sysctl -p
复制代码
用户级别


  • 查看当前用户的所有限制
  1. ulimit -a
复制代码
  1. core file size          (blocks, -c) 0    # 核心转储文件最大大小,0表示禁用生成core文件
  2. data seg size           (kbytes, -d) unlimited    # 进程数据段最大内存限制;无影响,不限制内存使用
  3. scheduling priority             (-e) 0    # 进程调度优先级,0为默认;无影响,不影响资源分配
  4. file size               (blocks, -f) unlimited    # 进程可创建的最大文件大小;无影响,不限制文件大小
  5. pending signals                 (-i) 14989    # 进程可挂起的最大信号数量;低影响,数值足够,不会触发限制
  6. max locked memory       (kbytes, -l) 64    # 进程可锁定的最大内存(KB)
  7. max memory size         (kbytes, -m) unlimited    # 进程可使用的最大物理内存;无影响,不限制内存使用
  8. open files                      (-n) 1024    # 单个进程可打开的最大文件句柄数;高风险!默认1024过小
  9. pipe size            (512 bytes, -p) 8    # 管道缓冲区大小(8*512=4096字节);无影响,默认值足够
  10. POSIX message queues     (bytes, -q) 819200    # POSIX消息队列最大字节数
  11. real-time priority              (-r) 0    # 实时进程调度优先级;无影响,非实时系统无需调整
  12. stack size              (kbytes, -s) 8192    # 进程栈空间最大大小(KB)
  13. cpu time               (seconds, -t) unlimited    # 进程可使用的最大CPU时间;无影响,不限制CPU使用时长
  14. max user processes              (-u) 14989    # 单个用户可创建的最大进程/线程数;核心影响!若服务器进程数接近该值,无法fork新进程,触发Resource unavailable
  15. virtual memory          (kbytes, -v) unlimited    # 进程可使用的最大虚拟内存;无影响,不限制虚拟内存使用
  16. file locks                      (-x) unlimited    # 进程可持有的最大文件锁数量;无影响,不限制文件锁
复制代码

  • 查看其他用户的限制
  1. su - <用户名> -c 'ulimit -a'
复制代码
修改用户级别限制


  • 临时修改(当前会话有效)
  1. # 修改当前shell的限制(仅当前会话有效)
  2. ulimit -n 65536          # 设置打开文件数为65536
  3. ulimit -u 4096           # 设置最大进程数为4096
  4. ulimit -c unlimited      # 允许生成无限大的core文件
  5. ulimit -s unlimited      # 设置栈大小为无限制
  6. # 修改硬限制(需要先设置硬限制较高)
  7. # 注意:普通用户只能降低硬限制,不能提高
  8. ulimit -Hn 65536
  9. ulimit -Hu 4096
复制代码

  • 永久修改用户限制
    修改/etc/security/limits.conf(主配置文件)
  1. # 备份原始配置
  2. sudo cp /etc/security/limits.conf /etc/security/limits.conf.backup.$(date +%Y%m%d)
  3. # 编辑配置文件
  4. sudo vi /etc/security/limits.conf
  5. # 文件格式说明:
  6. # <domain>    <type>    <item>    <value>
  7. # domain可以是:用户名、@组名、*(所有用户)
  8. # type可以是:soft、hard、-(both)
  9. # item是资源类型(nofile、nproc等)
  10. # value是限制值,可以是数字或unlimited
  11. # =================================================
  12. # 示例配置:
  13. # 为所有用户设置基础限制
  14. *               soft    nofile     10240
  15. *               hard    nofile     65536
  16. *               soft    nproc      1024
  17. *               hard    nproc      4096
  18. *               soft    core       0         # 禁止生成core文件
  19. *               hard    core       0
  20. # 为特定用户alice设置更高限制
  21. alice           soft    nofile     65536
  22. alice           hard    nofile     262144
  23. alice           soft    nproc      4096
  24. alice           hard    nproc      16384
  25. alice           soft    memlock    unlimited
  26. alice           hard    memlock    unlimited
  27. # 为用户组developers设置限制
  28. @developers     soft    nofile     32768
  29. @developers     hard    nofile     131072
  30. @developers     -       nproc      2048
  31. @developers     -       core       1073741824  # 1GB core文件
  32. # 为系统用户nginx设置限制
  33. nginx           -       nofile     65536
  34. nginx           -       nproc      4096
  35. nginx           -       memlock    unlimited
  36. # 为MySQL用户设置特殊限制
  37. mysql           soft    nofile     65536
  38. mysql           hard    nofile     65536
  39. mysql           soft    nproc      unlimited
  40. mysql           hard    nproc      unlimited
  41. # =================================================
  42. # 保存后,用户需要重新登录才能生效
复制代码

  • 常用资源项说明
项目说明推荐值示例nofile打开文件描述符数服务: 65536+ 用户: 4096+hard nofile 65536nproc最大进程数服务: 4096+ 用户: 1024+hard nproc 4096core核心转储文件大小调试: unlimited 生产: 0soft core 0memlock锁定内存大小数据库: unlimitedhard memlock unlimitedstack栈大小默认: 8192KBsoft stack 32768data数据段大小大内存应用: unlimitedhard data unlimitedas虚拟内存大小通常unlimitedhard as unlimitedfsize文件大小根据需求hard fsize 1073741824cpuCPU时间(分钟)限制恶意进程hard cpu 1000maxlogins最大登录数防止多登录hard maxlogins 3maxsyslogins系统最大登录数系统级限制hard maxsyslogins 100priority进程优先级nice值soft priority 0
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册