目录
系统资源排查
内存资源
- 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 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 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级别最精细,适合现代容器化环境
- 系统级别设定全局天花板
- 用户级别实现多用户公平共享
- 进程级别保证继承性和安全性
- 会话级别提供临时调整灵活性
作用域:进程组/容器/服务单元
位置:/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)
- 多租户环境资源保障
作用域:整个操作系统
位置:/proc/sys/、/etc/sysctl.conf
实现:内核运行时参数- # 关键参数示例
- /proc/sys/fs/file-max # 系统总文件描述符数
- /proc/sys/kernel/pid_max # 系统最大PID数
- /proc/sys/vm/max_map_count # 最大内存映射区域
复制代码 特点与作用:
- 全局上限:为所有用户/进程设置天花板
- 内核行为控制:影响内核资源管理策略
- 需要root权限:只有root可以修改
- 影响深远:修改不当可能导致系统不稳定
应用场景:
作用域:特定用户或用户组
位置:/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运维)
- 防止用户消耗过多资源
作用域:单个进程及其线程
位置:/proc//limits、进程控制块(PCB)
实现:内核进程描述符- # 进程限制继承关系
- 父进程 limits → fork() → 子进程继承 → execve() → 保持限制
- # 进程树限制查看
- pstree -p | xargs -I {} cat /proc/{}/limits 2>/dev/null
复制代码 特点与作用:
- 继承性:子进程继承父进程限制
- 运行时不可增加:只能降低不能提高(除非有CAP_SYS_RESOURCE)
- 线程共享:同一进程的所有线程共享限制
- 实时查看:通过/proc文件系统动态查看
应用场景:
- 进程资源监控和调试
- 安全沙箱(如chroot环境)
- 服务进程资源控制
作用域:当前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:统一挂载,分层控制
- # 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)
复制代码 系统级别
- # 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 -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
复制代码修改系统级别资源限制
- # 备份原始配置
- 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
- # --------------------------------------------------
复制代码 用户级别
- 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 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
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |