服务器资源监控与容量规划实战

前言

服务器资源监控是运维基本功。CPU飙高、内存吃紧、磁盘快满……这些问题如果没有提前发现,等出故障再处理就被动了。除了实时监控,还需要做容量规划,预判什么时候该扩容。

本文整理服务器资源监控的方法和容量规划的思路,附带实用脚本和告警配置。


1. CPU监控

1.1 核心指标

指标含义关注点
user用户态CPU应用程序消耗
system内核态CPU系统调用、IO等
iowaitIO等待磁盘IO瓶颈
steal被偷取虚拟化超卖
load average负载等待CPU的任务数

1.2 查看命令

# 实时查看tophtop# CPU使用率mpstat -P ALL1# 负载历史uptimecat/proc/loadavg# 详细统计vmstat1# 按进程查看pidstat -u1

1.3 告警阈值建议

指标警告严重
CPU使用率>70%>90%
Load Average>核心数*0.7>核心数
iowait>20%>50%
steal>5%>20%

1.4 监控脚本

#!/bin/bash# cpu_monitor.shCPU_WARN=70CPU_CRIT=90LOAD_FACTOR=0.7# 获取CPU使用率cpu_usage=$(top-bn1|grep"Cpu(s)"|awk'{print 100 - $8}'|cut-d. -f1)# 获取CPU核心数和负载cores=$(nproc)load=$(cat/proc/loadavg|awk'{print $1}')load_threshold=$(echo"$cores*$LOAD_FACTOR"|bc)# CPU使用率检查if["$cpu_usage"-gt"$CPU_CRIT"];thenecho"[CRITICAL] CPU使用率:${cpu_usage}%"elif["$cpu_usage"-gt"$CPU_WARN"];thenecho"[WARNING] CPU使用率:${cpu_usage}%"elseecho"[OK] CPU使用率:${cpu_usage}%"fi# 负载检查load_int=$(echo"$load"|cut-d. -f1)threshold_int=$(echo"$load_threshold"|cut-d. -f1)if["$load_int"-gt"$cores"];thenecho"[CRITICAL] 系统负载:$load(核心数:$cores)"elif["$load_int"-gt"$threshold_int"];thenecho"[WARNING] 系统负载:$load(核心数:$cores)"elseecho"[OK] 系统负载:$load(核心数:$cores)"fi

2. 内存监控

2.1 核心指标

指标含义
total总内存
used已使用(不含buffer/cache)
free完全空闲
available可用内存(最重要)
buffer/cache缓存,可被回收
swap交换分区使用

2.2 查看命令

# 内存概览free-h# 详细信息cat/proc/meminfo# 按进程排序psaux --sort=-%mem|head-20# 实时监控watch-n1free-h# 查看内存占用最高的进程top-o %MEM

2.3 理解available vs free

$free-h total usedfreeshared buff/cache available Mem: 31Gi 12Gi1.2Gi1.5Gi 17Gi 16Gi
  • free只有1.2G,看起来很紧张
  • available有16G,因为buff/cache可以回收
  • 关注available,不是free

2.4 监控脚本

#!/bin/bash# memory_monitor.shMEM_WARN=70MEM_CRIT=85SWAP_WARN=30# 获取内存使用率(基于available)mem_info=$(free|grepMem)total=$(echo$mem_info|awk'{print $2}')available=$(echo$mem_info|awk'{print $7}')used=$((total-available))mem_usage=$((used*100/total))# 获取Swap使用率swap_info=$(free|grepSwap)swap_total=$(echo$swap_info|awk'{print $2}')swap_used=$(echo$swap_info|awk'{print $3}')if["$swap_total"-gt0];thenswap_usage=$((swap_used*100/swap_total))elseswap_usage=0fi# 内存检查if["$mem_usage"-gt"$MEM_CRIT"];thenecho"[CRITICAL] 内存使用率:${mem_usage}%"elif["$mem_usage"-gt"$MEM_WARN"];thenecho"[WARNING] 内存使用率:${mem_usage}%"elseecho"[OK] 内存使用率:${mem_usage}%"fi# Swap检查if["$swap_usage"-gt"$SWAP_WARN"];thenecho"[WARNING] Swap使用率:${swap_usage}%"# 找出使用Swap的进程echo"使用Swap的进程:"forpidin$(ls/proc|grep-E'^[0-9]+$');doswap=$(cat/proc/$pid/status2>/dev/null|grepVmSwap|awk'{print $2}')if[-n"$swap"]&&["$swap"-gt0];thenname=$(cat/proc/$pid/comm2>/dev/null)echo"$name(PID:$pid):${swap}kB"fidone|sort-t: -k2 -rn|head-5fi

3. 磁盘监控

3.1 核心指标

指标含义
使用率已用空间占比
inode使用率文件数量占比
IO利用率磁盘繁忙程度
IO等待读写延迟

3.2 查看命令

# 磁盘空间df-h# inode使用df-i# 目录大小du-sh /path/*du-sh /*|sort-rh|head-10# IO统计iostat -x1# 实时IO监控iotop# 查看大文件find/ -type f -size +100M -execls-lh{}\;2>/dev/null

3.3 监控脚本

#!/bin/bash# disk_monitor.shDISK_WARN=70DISK_CRIT=85INODE_WARN=70echo"=== 磁盘空间检查 ==="df-h|awk'NR>1'|whilereadline;dousage=$(echo$line|awk'{print $5}'|tr-d'%')mount=$(echo$line|awk'{print $6}')# 跳过临时文件系统echo"$mount"|grep-qE'^/(dev|run|sys|proc)'&&continueif["$usage"-gt"$DISK_CRIT"];thenecho"[CRITICAL]$mount使用率:${usage}%"elif["$usage"-gt"$DISK_WARN"];thenecho"[WARNING]$mount使用率:${usage}%"fidoneecho""echo"=== inode检查 ==="df-i|awk'NR>1'|whilereadline;dousage=$(echo$line|awk'{print $5}'|tr-d'%')mount=$(echo$line|awk'{print $6}')echo"$mount"|grep-qE'^/(dev|run|sys|proc)'&&continue[-z"$usage"]&&continueif["$usage"-gt"$INODE_WARN"];thenecho"[WARNING]$mountinode使用率:${usage}%"fidone

3.4 自动清理脚本

#!/bin/bash# disk_cleanup.sh - 磁盘空间不足时自动清理THRESHOLD=85current_usage=$(df/|awk'NR==2 {print $5}'|tr-d'%')if["$current_usage"-gt"$THRESHOLD"];thenecho"磁盘使用率${current_usage}%,开始清理..."# 清理系统日志journalctl --vacuum-time=7d# 清理包缓存yum clean all2>/dev/null||apt-getclean2>/dev/null# 清理/tmp下超过7天的文件find/tmp -type f -mtime +7 -delete# 清理应用日志(根据实际情况调整)find/var/log -name"*.log.*"-mtime +30 -deletenew_usage=$(df/|awk'NR==2 {print $5}'|tr-d'%')echo"清理完成,当前使用率:${new_usage}%"fi

4. 网络监控

4.1 核心指标

指标含义
带宽使用上传/下载速率
连接数TCP连接数量
错误包丢包、错误
延迟网络往返时间

4.2 查看命令

# 实时带宽iftop nload sar -n DEV1# 连接统计ss -snetstat-an|awk'{print $6}'|sort|uniq-c|sort-rn# 网卡错误ip-slinkshow eth0# 每个IP的连接数ss -tn|awk'{print $5}'|cut-d: -f1|sort|uniq-c|sort-rn|head

4.3 监控脚本

#!/bin/bash# network_monitor.shCONN_WARN=5000CONN_CRIT=10000TIMEWAIT_WARN=3000# TCP连接数total_conn=$(ss -tn|wc-l)established=$(ss -tn state established|wc-l)timewait=$(ss -tn state time-wait|wc-l)echo"=== TCP连接状态 ==="echo"总连接数:$total_conn"echo"ESTABLISHED:$established"echo"TIME_WAIT:$timewait"if["$total_conn"-gt"$CONN_CRIT"];thenecho"[CRITICAL] TCP连接数过高"elif["$total_conn"-gt"$CONN_WARN"];thenecho"[WARNING] TCP连接数较高"fiif["$timewait"-gt"$TIMEWAIT_WARN"];thenecho"[WARNING] TIME_WAIT过多,检查是否有短连接问题"fi# 带宽检测(需要安装vnstat或使用/proc/net/dev)echo""echo"=== 网卡流量 ==="cat/proc/net/dev|grep-E'eth0|ens'|awk'{print $1, "RX:", $2/1024/1024, "MB, TX:", $10/1024/1024, "MB"}'

5. 综合监控脚本

#!/bin/bash# server_check.sh - 服务器综合检查HOSTNAME=$(hostname)DATE=$(date'+%Y-%m-%d %H:%M:%S')echo"=========================================="echo"服务器巡检报告"echo"主机名:$HOSTNAME"echo"时间:$DATE"echo"=========================================="# CPUecho""echo"【CPU】"cpu_usage=$(top-bn1|grep"Cpu(s)"|awk'{printf "%.1f", 100 - $8}')load=$(cat/proc/loadavg|awk'{print $1, $2, $3}')cores=$(nproc)echo"使用率:${cpu_usage}%"echo"负载:$load(${cores}核)"# 内存echo""echo"【内存】"free-h|awk'/Mem:/ {printf "总计: %s, 已用: %s, 可用: %s\n", $2, $3, $7}'mem_usage=$(free|awk'/Mem:/ {printf "%.1f", ($2-$7)/$2*100}')echo"使用率:${mem_usage}%"# 磁盘echo""echo"【磁盘】"df-h|awk'NR>1 && !/tmpfs|devtmpfs/ {printf "%s: %s/%s (%s)\n", $6, $3, $2, $5}'# 网络echo""echo"【网络连接】"ss -s|head-2# 进程echo""echo"【Top 5 CPU进程】"psaux --sort=-%cpu|head-6|awk'NR>1 {printf "%s %.1f%% %s\n", $2, $3, $11}'echo""echo"【Top 5 内存进程】"psaux --sort=-%mem|head-6|awk'NR>1 {printf "%s %.1f%% %s\n", $2, $4, $11}'# 系统信息echo""echo"【系统信息】"echo"运行时间:$(uptime-p)"echo"内核版本:$(uname-r)"echo""echo"=========================================="

6. 多节点监控

6.1 批量巡检脚本

管理多台服务器时,需要批量执行巡检:

#!/bin/bash# batch_check.sh - 批量服务器巡检SERVERS=("192.168.1.10""192.168.1.11""192.168.1.12")forserverin"${SERVERS[@]}";doecho"======$server======"ssh-oConnectTimeout=5"$server"' echo "CPU: $(top -bn1 | grep "Cpu(s)" | awk "{printf \"%.1f%%\", 100 - \$8}")" echo "内存: $(free | awk "/Mem:/ {printf \"%.1f%%\", (\$2-\$7)/\$2*100}")" echo "磁盘: $(df / | awk "NR==2 {print \$5}")" echo "负载: $(cat /proc/loadavg | awk "{print \$1}")" '2>/dev/null||echo"连接失败"echo""done

6.2 跨网络监控方案

服务器分布在不同网络时,直接SSH连接可能有问题:

  • 云服务器在公网
  • 办公室服务器在NAT后
  • 家里的机器没有公网IP

解决方案

  1. 跳板机模式:所有机器都能连的中转点
  2. 组网工具:WireGuard、ZeroTier、星空组网等,把机器组成虚拟局域网

用组网工具后,不管机器实际在哪,都可以用虚拟内网IP直接访问。监控脚本里的IP列表直接写虚拟IP:

SERVERS=("10.10.0.1"# 云服务器"10.10.0.2"# 办公室"10.10.0.3"# 家里)

Prometheus监控也一样,配置虚拟IP就能跨网络采集数据。

6.3 Prometheus + Grafana方案

node_exporter配置:

# prometheus.ymlscrape_configs:-job_name:'node'static_configs:-targets:-'10.10.0.1:9100'-'10.10.0.2:9100'-'10.10.0.3:9100'

常用告警规则:

# alerts.ymlgroups:-name:noderules:-alert:HighCpuUsageexpr:100-(avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)>80for:5mlabels:severity:warningannotations:summary:"CPU使用率过高 {{ $labels.instance }}"-alert:HighMemoryUsageexpr:(1-node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100>85for:5mlabels:severity:warningannotations:summary:"内存使用率过高 {{ $labels.instance }}"-alert:DiskSpaceLowexpr:(1-node_filesystem_avail_bytes{fstype!~"tmpfs|devtmpfs"}/ node_filesystem_size_bytes) * 100>85for:5mlabels:severity:warningannotations:summary:"磁盘空间不足 {{ $labels.instance }} {{ $labels.mountpoint }}"

7. 容量规划

7.1 收集历史数据

#!/bin/bash# collect_metrics.sh - 每小时收集资源使用数据LOG_DIR="/var/log/capacity"mkdir-p"$LOG_DIR"DATE=$(date'+%Y-%m-%d %H:%M')# CPUcpu=$(top-bn1|grep"Cpu(s)"|awk'{printf "%.1f", 100 - $8}')# 内存mem=$(free|awk'/Mem:/ {printf "%.1f", ($2-$7)/$2*100}')# 磁盘disk=$(df/|awk'NR==2 {print $5}'|tr-d'%')# 记录echo"$DATE,$cpu,$mem,$disk">>"$LOG_DIR/metrics.csv"

crontab配置:

0* * * * /opt/scripts/collect_metrics.sh

7.2 趋势分析

#!/bin/bash# trend_analysis.sh - 趋势分析LOG_FILE="/var/log/capacity/metrics.csv"echo"=== 最近7天资源趋势 ==="# 计算平均值和最大值awk-F','' BEGIN { cpu_sum=0; cpu_max=0; cpu_count=0 mem_sum=0; mem_max=0 disk_sum=0; disk_max=0 } { if (NR > 1) { cpu_sum += $2; if ($2 > cpu_max) cpu_max = $2 mem_sum += $3; if ($3 > mem_max) mem_max = $3 disk_sum += $4; if ($4 > disk_max) disk_max = $4 cpu_count++ } } END { printf "CPU: 平均 %.1f%%, 峰值 %.1f%%\n", cpu_sum/cpu_count, cpu_max printf "内存: 平均 %.1f%%, 峰值 %.1f%%\n", mem_sum/cpu_count, mem_max printf "磁盘: 平均 %.1f%%, 峰值 %.1f%%\n", disk_sum/cpu_count, disk_max }'"$LOG_FILE"# 磁盘增长预测echo""echo"=== 磁盘增长预测 ==="first_disk=$(head-2"$LOG_FILE"|tail-1|cut-d','-f4)last_disk=$(tail-1"$LOG_FILE"|cut-d','-f4)days=7growth_per_day=$(echo"scale=2; ($last_disk-$first_disk) /$days"|bc)if["$(echo"$growth_per_day> 0"|bc)"-eq1];thendays_to_full=$(echo"scale=0; (85 -$last_disk) /$growth_per_day"|bc)echo"当前使用:${last_disk}%"echo"日增长率:${growth_per_day}%"echo"预计$days_to_full天后达到85%警戒线"fi

7.3 扩容决策

指标扩容建议
CPU持续>70%升级CPU或水平扩展
内存持续>80%增加内存或优化应用
磁盘增长快扩容或清理+归档
网络打满升级带宽或CDN分流

扩容原则

  1. 不要等到爆了再扩,预留缓冲
  2. 分析是突发还是趋势
  3. 优先优化,再考虑扩容
  4. 水平扩展优于垂直扩展

总结

资源关键指标告警阈值查看命令
CPU使用率、负载>70%警告,>90%严重top, mpstat
内存available>80%警告,>90%严重free -h
磁盘使用率、inode>80%警告,>90%严重df -h, df -i
网络连接数、带宽根据业务定ss -s, iftop

监控体系搭建建议

  1. 脚本级:简单场景,crontab + 脚本
  2. 工具级:单机用htop、glances
  3. 平台级:多机用Prometheus + Grafana
  4. 商业级:云厂商监控或Datadog、New Relic

监控的目的是提前发现问题,不是出问题后才看。建好告警规则,设置合理阈值,才能真正发挥作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1124769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爆肝实测!RAG技术让大模型在矿山领域拿到4+级认证?小白程序员也能学会的AI黑科技!

随着大模型逐步向深度认知推理领域拓展,以检索增强生成(Retrieval Augmented Generation,RAG)为核心的人工智能技术可显著提升其准确性和稳定性,为企业提供高性价比的行业解决方案。为推动产业健康持续发展&#xff0c…

Linux定时任务与自动化脚本实战

前言 服务器运维离不开定时任务:日志清理、数据备份、监控告警、报表生成……手动执行既繁琐又容易遗漏。crontab是Linux下最常用的定时任务工具,配合shell脚本可以实现各种自动化需求。 本文整理crontab的使用技巧和常见自动化脚本,附带踩坑…

零基础转行Java开发,学习路线推荐!

现在IT整体大环境不好,该怎么提升自己的核心竞争力?需要储备一些什么技术才能在Java立足呢?如果你对此没啥概念,毫无方向,不妨来看看阿里最新出品的P5~P7架构师学习路线,按着路线学习,技术上你能…

身份证二要素验证接口对接中常见问题汇总

在实际业务系统中接入身份证二要素验证接口(姓名 身份证号一致性校验)时,大多数问题并不来源于接口能力本身,而是集中出现在参数传递、签名生成、权限配置以及调用环境等细节上。 新诺韦尔从技术支持视角出发,结合接口文档规范与真实对接经…

AI悖论:技术迷雾中的人类抉择

当人工智能(AI)以前所未有的速度渗透进社会经济的每一个角落,一系列深刻的矛盾也随之浮现。这些悖论并非源于技术本身的缺陷,而是人类在开发、应用AI过程中,自身需求、认知与价值取向的集中投射。从就业格局到生产率变…

展望2026:出版业融合发展的深度观察与未来图景

当数字化浪潮席卷而来,出版业正站在一个前所未有的转折点上。2021至2024年,出版融合发展累计收入达358.62亿元,2024年单年收入97.24亿元,同比增长6.32%。这些数字背后,是一个传统行业在数字时代的艰难转身,也是一场关乎文化传承与创新的深刻变革。当我们将目光投向2026年,出版业…

2026年最新爆火!9款免费AI论文工具限时公开,一键生成初稿告别熬夜!

为什么你必须立刻行动?——论文冲刺的“最后72小时”危机 2026年的毕业季,比以往任何时候都更残酷: 答辩倒计时只剩最后3天,而你的论文还停留在框架阶段;导师凌晨发来修改意见,措辞严厉,暗示“…

Java之构造方法

什么是构造方法?构造方法是 Java 中一种特殊的方法,它的核心作用是:在创建对象(使用new关键字)时,初始化该对象的成员变量构造方法解决什么问题?构造方法解决给对象初始化的问题构造方法怎么使用…

‌性能测试认证备考全指南:从ISTQB到AI驱动的云原生实战

‌一、主流性能测试认证体系全景图‌认证体系认证级别适用人群核心考试内容权威性与行业认可度‌ISTQB Performance Testing‌基础级(FL)、进阶级(AT)、专家级(ET)初级测试员、测试经理、质量负责人七大知识…

mysql innodb_log_buffer_size 参数详解

innodb_log_buffer_size 是 MySQL InnoDB 存储引擎中的一个重要配置参数,用于控制 InnoDB 日志缓冲区(log buffer)的大小。这个缓冲区用于在将事务日志(redo log)写入磁盘之前,临时缓存这些日志数据。一、作…

前沿制造深度:传统系统如OEE是否有必要使用AI技术改造?

今天是2026年1月7日。欢迎来到《前沿智造》深度访谈节目。我是主持人闻道瑞伟。 制造业的数字化转型已进入深水区,和所有传统的制造运营绩效指标体系和数字化系统一样,作为衡量生产效能的“黄金指标”——整体设备效率系统,正站在一个技术十字路口。一边是运行多年、稳定但…

mysql innodb_flush_log_at_trx_commit 参数详解

innodb_flush_log_at_trx_commit 是 MySQL InnoDB 存储引擎中控制事务提交时 redo log(重做日志)刷盘行为的关键参数,直接影响 数据持久性 与 写入性能 之间的权衡。一、参数作用 该参数决定了:当一个事务执行 COMMIT 时&#xff…

救命神器!研究生必备10个AI论文平台深度测评

救命神器!研究生必备10个AI论文平台深度测评 一、不同维度核心推荐:10款AI工具各有所长 对于研究生而言,学术写作是一个复杂而繁琐的过程,从开题到初稿、查重、降重再到排版,每个环节都需要合适的工具来辅助。不同的AI…

‌2026年安全测试工具Top 10:AI驱动下的范式跃迁与从业者实战指南

一、2026年安全测试工具演进的底层逻辑‌2026年不再是“工具功能叠加”的时代,而是‌智能体(Agent)主导测试流程‌的元年。Gartner与Forrester在2025年报告中已明确指出:“AI在安全测试中的角色,已从‘辅助脚本生成’升…

2026年AI论文工具爆火!9款神器限时公开,从选题到降重一站式搞定

凌晨3点,导师的修改意见邮件第5次响起,查重率卡在29.9%,deadline只剩48小时……这样的至暗时刻,你还在独自硬扛吗?醒醒,2026年的学术圈,早已不是一个人的战场! 深夜赶稿、反复修改、…

从600万到3000万:揭秘中小商家的增长密码

引言 中小商家最头疼的问题:产品不错,但没钱做推广。 今天看更关键的部分——如何从600万做到3000万。这背后不是靠运气,而是一套可复制的商业架构。 一、传统生意困局:酒香也怕巷子深 大多数商家面临三重困境: 广告…

Java之匿名对象

有名对象:有名字的对象 Student stu new Student(); //有名字的对象//对象名: stu匿名对象:创建的对象没有名字 new Student(); //创建的对象没有名字 new Student("张三",23);匿名对象的使用方式 匿名对象可以像有名对象一样使用…

基于Springboot + vue3实现的家具商城系统

项目描述本系统包含管理员和用户两个角色。管理员角色:轮播图管理:管理轮播图配置参数。管理员管理:管理系统中的管理员信息,包括添加、删除和修改管理员。用户管理:管理系统中的用户信息,包括添加、删除和…

CTF入门指南:从零到拿下Flag的完整路径

📚 首先,正确认识CTFCTF(Capture The Flag,夺旗赛)是网络安全的“实战练兵场”。你需要通过挖掘漏洞、解密数据、逆向分析程序等手段,找到隐藏的特定字符串(Flag,通常格式为flag{xxx…

免费文献检索网站推荐:实用高效的学术资源获取平台

一、WisPaper:智能学术搜索激发科研灵感 科研创新的关键是了解前沿,找到突破口。但传统查文献方式往往效率低: Google Scholar 或 arXiv 搜索结果太多,难以筛选公众号推送滞后,容易错过最新研究文献阅读时间长&#…