服务器监控Skill:性能与健康监测

自动化服务器监控

一、服务器监控Skill的设计

服务器监控Skill的核心目标是实现服务器健康状态和性能指标的自动化监测,帮助运维人员和开发团队快速发现并诊断性能问题。通过将监控能力封装为Claude Code Skill,可以在日常开发运维工作中随时调起监控流程,无需切换工具或平台。

1.1 设计原则

1.2 Skill定义示例

# CLAUDE.md 中的Skill定义 server-monitor: description: 执行服务器性能和健康监控 triggers: - /monitor server - /server-health args: - name: target description: 监控目标(如 localhost、IP地址 或 服务器组名) required: false - name: duration description: 监控持续时间(秒),默认60 required: false steps: - 收集指定服务器的系统资源指标(CPU、内存、磁盘、网络) - 检查关键进程运行状态和端口可达性 - 扫描应用日志中的ERROR级别异常 - 分析性能瓶颈并提供优化建议 - 生成健康状态报告
设计思路:将服务器监控Skill设计为通用可配置的斜杠命令。通过target参数指定监控目标,duration参数控制采样时长,使其既可用于快速健康检查,也可用于深度性能诊断。

二、系统资源监控

系统资源监控是服务器监控的基础层,涵盖CPU、内存、磁盘和网络四大核心资源。实时的资源数据采集和趋势分析是发现性能问题的第一道防线。

2.1 CPU使用率和负载监控

CPU监控需要关注以下关键指标:整体使用率、用户态/内核态占比、I/O等待时间、以及系统平均负载(load average)。通过采集这些指标可以判断CPU是否成为系统瓶颈。

#!/bin/bash # CPU监控采集脚本 echo "=== CPU 使用率 ===" # 使用 top 获取CPU使用率概况(批处理模式,单次采集) top -bn1 | head -5 echo "" echo "=== CPU 负载平均值 ===" cat /proc/loadavg echo "" echo "=== 每个CPU核心使用率 ===" mpstat -P ALL 1 1 echo "" echo "=== 上下文切换次数 ===" vmstat 1 1 | tail -1

2.2 内存使用分析和泄漏检测

内存监控需要关注总内存、已用内存、空闲内存、缓存/缓冲区和Swap使用情况。内存泄漏是长期运行服务的常见问题,需要通过进程级别的内存增长趋势来检测。

#!/bin/bash # 内存监控采集脚本 echo "=== 内存使用概况 ===" free -h echo "" echo "=== 内存详细统计 ===" cat /proc/meminfo echo "" echo "=== 按内存使用率排序的进程 Top 10 ===" ps aux --sort=-%mem | head -11 echo "" echo "=== SWAP 使用情况 ===" swapon --show
注意:内存泄漏的典型特征是进程RSS( Resident Set Size)持续增长不回落,即使在没有活跃请求的空闲状态下也是如此。建议对关键服务设置进程内存上限,并结合历史数据做趋势对比。

2.3 磁盘使用率和IO统计

磁盘监控包含两个维度:空间使用率(是否会写满)和IO性能(是否成为瓶颈)。空间使用率关注各分区的已用百分比和Inode使用率;IO性能关注iowait%、IOPS、吞吐量和平均服务时间。

#!/bin/bash # 磁盘监控采集脚本 echo "=== 磁盘分区使用率 ===" df -h echo "" echo "=== Inode 使用率 ===" df -i echo "" echo "=== 磁盘IO统计 ===" iostat -x 1 3 echo "" echo "=== IO密集型进程 ===" iotop -b -n 1 -o

2.4 网络流量和连接数监控

网络监控关注带宽使用率、连接数、连接状态分布和错误包统计。异常的连接数增长或大量TIME_WAIT状态连接通常预示着应用层问题。

#!/bin/bash # 网络监控采集脚本 echo "=== 网络接口流量统计 ===" ip -s link echo "" echo "=== 当前TCP连接状态分布 ===" ss -t state all | awk '{print $1}' | sort | uniq -c | sort -rn echo "" echo "=== 监听端口列表 ===" ss -tlnp echo "" echo "=== 各连接状态的计数 ===" netstat -n | awk '/^tcp/ {print $6}' | sort | uniq -c

2.5 关键指标趋势分析

单次采集只能反映瞬态状态,趋势分析才能揭示问题的演变规律。通过定时采集(如每分钟一次)并将数据存入时序数据库,可以绘制出资源使用趋势图,用于容量规划和异常检测。

最佳实践:建议将监控数据持久化到时序数据库(如Prometheus、InfluxDB或VictoriaMetrics),并结合Grafana等可视化工具展示趋势图表。保留周期建议:原始数据保留7天,聚合数据(5分钟粒度)保留30天,日聚合数据保留1年。

三、进程和应用监控

进程和应用监控关注的是运行在服务器上的软件服务的健康状态。与系统资源监控不同,应用监控更关注服务是否按预期工作,而不仅仅是资源是否充足。

3.1 关键进程运行状态检查

通过检查关键进程的存在性、运行时长和资源消耗来判断服务是否正常运行。对于守护进程,还需要检查其子进程管理是否正常。

#!/bin/bash # 进程状态检查脚本 APP_LIST=("nginx" "mysqld" "redis-server" "java") echo "=== 关键进程状态检查 ===" for proc in "${APP_LIST[@]}"; do pid=$(pgrep -x "$proc" | head -1) if [ -n "$pid" ]; then cpu=$(ps -p "$pid" -o %cpu --no-headers) mem=$(ps -p "$pid" -o %mem --no-headers) rss=$(ps -p "$pid" -o rss --no-headers) uptime_sec=$(ps -p "$pid" -o etime --no-headers) echo "[OK] $proc | PID=$pid | CPU=$cpu% | MEM=$mem% | RSS=${rss}KB | Uptime=$uptime_sec" else echo "[DOWN] $proc - 进程未运行!" fi done

3.2 应用端口和HTTP端点可达性

端口监听检查只能确认进程绑定了端口,但不能保证应用正常工作。HTTP端点健康检查通过访问应用的健康检查接口(如 /health、/actuator/health)来验证应用是否真正可用。

#!/bin/bash # HTTP端点健康检查脚本 SERVICES=( "nginx:80:/health" "app:8080:/actuator/health" "api:3000:/api/v1/health" ) echo "=== HTTP端点可达性检查 ===" for service in "${SERVICES[@]}"; do IFS=':' read -r name port path <<< "$service" response=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 "http://localhost:${port}${path}" 2>&1) if [ "$response" = "200" ] || [ "$response" = "204" ]; then echo "[OK] $name (端口 $port) - HTTP $response" else echo "[WARN] $name (端口 $port) - HTTP $response" fi done

3.3 应用日志中的ERROR级别异常检测

日志是了解应用内部状态最重要的途径。通过实时扫描日志中的ERROR、FATAL、Exception等关键字,可以在用户发现问题之前主动告警。同时需要对日志风暴(短时间内大量重复日志)进行检测,避免日志淹没存储。

#!/bin/bash # 日志异常检测脚本 LOG_DIR="/var/log/applications" SINCE="5 minutes ago" echo "=== 最近5分钟日志异常分析 ===" for logfile in "$LOG_DIR"/*.log; do [ -f "$logfile" ] || continue filename=$(basename "$logfile") error_count=$(grep -c -i "ERROR\|FATAL\|Exception\|NullPointer" "$logfile" 2>/dev/null) warn_count=$(grep -c -i "WARN\|WARNING" "$logfile" 2>/dev/null) if [ "$error_count" -gt 0 ]; then echo "[ALERT] $filename - $error_count 条错误, $warn_count 条警告" echo " 最新错误:" grep -i "ERROR\|FATAL\|Exception" "$logfile" | tail -3 else echo "[OK] $filename - 无错误 ($warn_count 条警告)" fi done

3.4 进程资源使用异常检测

进程资源使用异常往往是最先出现的预警信号。CPU使用率突增、内存持续增长、文件描述符泄漏、线程数异常增长等都需要纳入检测范围。

#!/bin/bash # 进程资源异常检测脚本 THRESHOLD_CPU=80 THRESHOLD_MEM=70 THRESHOLD_FD=1000 echo "=== 进程资源异常检测 ===" ps aux --sort=-%cpu | tail -n +2 | while read -r line; do pid=$(echo "$line" | awk '{print $2}') cpu=$(echo "$line" | awk '{print $3}') mem=$(echo "$line" | awk '{print $4}') cmd=$(echo "$line" | awk '{for(i=11;i<=NF;i++) printf "%s ", $i; print ""}') fd_count=$(ls /proc/"$pid"/fd 2>/dev/null | wc -l) [ -z "$fd_count" ] && continue if [ "$(echo "$cpu > $THRESHOLD_CPU" | bc -l)" -eq 1 ]; then echo "[WARN] CPU超标: PID=$pid CPU=$cpu% CMD=$cmd" fi if [ "$(echo "$mem > $THRESHOLD_MEM" | bc -l)" -eq 1 ]; then echo "[WARN] MEM超标: PID=$pid MEM=$mem% CMD=$cmd" fi if [ "$fd_count" -gt "$THRESHOLD_FD" ]; then echo "[WARN] FD超标: PID=$pid FD=$fd_count CMD=$cmd" fi done

四、性能瓶颈分析

性能瓶颈分析是在发现异常指标后进行的深度诊断。目标是从系统层面定位导致性能下降的根本原因,并给出可行的优化建议。

4.1 CPU密集型进程识别

当系统CPU使用率持续偏高时,需要找出消耗CPU最多的进程,并进一步分析是用户态(用户代码逻辑)还是内核态(系统调用)消耗了CPU。

#!/bin/bash # CPU性能瓶颈深度分析 echo "=== CPU 密集型进程 Top 10 ===" ps aux --sort=-%cpu | head -11 echo "" echo "=== CPU 负载趋势(最近1、5、15分钟)===" uptime echo "" echo "=== 每个核心的中断分布 ===" cat /proc/interrupts | head -10 echo "" echo "=== 如果是Java应用,采集线程栈 ===" # jstack $PID > /tmp/thread_dump_$(date +%s).txt echo "建议: 连续采集3次线程栈(间隔5秒),分析锁竞争和热点"

4.2 内存使用异常进程定位

内存问题通常表现为内存泄漏或内存碎片。定位内存异常需要通过进程级内存使用趋势分析和堆内存转储(heap dump)来确诊。

#!/bin/bash # 内存异常深度诊断 echo "=== 按RSS排序的进程 Top 15 ===" ps aux --sort=-%mem | head -16 echo "" echo "=== 检查OOM Killer历史记录 ===" dmesg | grep -i "oom" | tail -5 echo "" echo "=== 检查Swap使用趋势 ===" vmstat 1 5 | awk '{print $7, $8}'
小技巧:内存泄漏的典型诊断方法是:在服务低峰期记录进程RSS基线值,然后每隔10分钟采集一次,连续采集1小时。如果RSS持续增长而业务流量没有明显变化,大概率存在内存泄漏。

4.3 磁盘IO高延迟问题诊断

磁盘IO延迟高会影响所有依赖磁盘操作的应用性能。诊断时需要区分是IO吞吐达到上限、存在IO冲突、还是特定进程的IO模式导致性能下降。

#!/bin/bash # 磁盘IO延迟诊断脚本 echo "=== 磁盘IO延迟统计 ===" iostat -x 1 3 echo "" echo "=== 等待IO的进程 ===" ps -eo state,pid,cmd | grep "^D" echo "" echo "=== IO队列深度 ===" for disk in $(lsblk -d -o name | tail -n +2); do echo "磁盘 $disk 队列深度: $(cat /sys/block/$disk/queue/nr_requests)" done echo "" echo "=== 文件系统使用率 ===" df -h | grep -E "^/dev|Filesystem"

4.4 网络延迟和丢包分析

网络性能问题可以从延迟、吞吐、丢包和重传四个维度进行分析。使用ping测量基础延迟,使用mtr进行逐跳路径分析,使用ss/tcpdump进行TCP状态分析。

#!/bin/bash # 网络性能诊断脚本 TARGET_HOST="your-api-server.com" echo "=== 基础延迟测试 ===" ping -c 10 "$TARGET_HOST" | tail -1 echo "" echo "=== 路由路径分析 ===" mtr -r -c 5 "$TARGET_HOST" 2>/dev/null || echo "mtr 未安装" echo "" echo "=== TCP重传统计 ===" netstat -s | grep -i "retransmit" echo "" echo "=== 网络错误统计 ===" netstat -s | grep -i "error\|drop\|overflow" echo "" echo "=== 带宽测试建议 ===" echo "使用 iperf3 -c 测试TCP吞吐量" echo "使用 iperf3 -u -c 测试UDP吞吐量和丢包"

4.5 优化建议汇总

CPU优化:优化热点代码逻辑、增加缓存减少重复计算、使用连接池减少线程创建销毁开销、考虑水平扩展分散负载。

内存优化:修复内存泄漏、调整JVM/应用内存参数、使用对象池复用大对象、对大集合设置最大容量限制。

磁盘IO优化:使用SSD替代HDD、调整文件系统挂载参数(noatime等)、优化SQL查询减少全表扫描、增加缓存层减少直接IO。

网络优化:启用TCP快速打开(TFO)、调整内核网络参数(net.core.somaxconn等)、使用CDN减少跨区域延迟、开启HTTP/2多路复用。

五、告警阈值设置与通知

告警系统是监控体系的价值输出端。合理的阈值设置能有效平衡"不漏报"和"不误报",高效的通知渠道确保问题及时触达责任人。

5.1 告警阈值配置

阈值的设定需要结合实际业务场景和历史数据,避免使用一刀切的固定值。推荐采用三级告警体系:

监控指标 警告(WARN) 严重(CRITICAL) 说明
CPU使用率 > 70% 持续5分钟 > 90% 持续2分钟 需排除短时突发
内存使用率 > 80% > 90% 关注Swap使用量
磁盘使用率 > 80% > 90% 区分数据盘和系统盘
磁盘IO等待 > 30% 持续10分钟 > 50% 持续5分钟 需要结合IOPS综合判断
网络连接数 > 基线值的150% > 基线值的200% 基线值根据业务峰谷动态调整
进程状态 进程重启 进程停止 结合进程管理工具自动拉起
日志ERROR率 > 5次/分钟 > 20次/分钟 排除已知的周期性错误

5.2 告警通知渠道配置

不同的告警级别应该对应不同的通知渠道和响应时效:

# 告警通知配置示例(CLAUDE.md Alert Skill) alert-manager: description: 发送监控告警通知 args: - name: level description: 告警级别 (info/warn/critical) required: true - name: message description: 告警内容 required: true - name: source description: 告警来源(服务器名称) required: true steps: - 根据告警级别选择通知渠道 - 格式化告警消息内容 - 通过Webhook发送到对应渠道 - 记录告警到历史数据库

六、综合健康报告生成

综合健康报告是监控数据的最终产品形态,将采集和分析结果汇总为结构化的报告文档,便于团队了解服务器整体健康状况、跟踪问题处理进度和规划容量。

6.1 报告模板设计

# 服务器健康状态报告 报告时间: $(date '+%Y-%m-%d %H:%M:%S') 服务器: $SERVER_NAME 报告类型: $REPORT_TYPE(快速检查/全面检查/深度诊断) ## 一、整体健康评分 健康评分: 85/100 状态: 良好(存在需要注意的指标) 关键发现: 发现 2 个警告, 0 个严重问题 ## 二、系统资源概览 - CPU: 使用率 45% - [OK] - 内存: 使用率 67% - [OK] - 磁盘 /: 使用率 72% - [WARN] - 磁盘 /data: 使用率 85% - [WARN] - 网络入站: 125 Mbps - [OK] ## 三、进程状态 - nginx: running (PID 12345) - [OK] - mysql: running (PID 12346) - [OK] - redis: running (PID 12347) - [OK] - app-server: running (PID 12348) - [OK] ## 四、性能瓶颈分析 无严重性能瓶颈。磁盘 /data 使用率接近阈值,建议关注。 ## 五、优化建议 1. 磁盘 /data 使用率已达85%,建议在1周内扩容或清理数据 2. 近期内存使用呈上升趋势,建议关注是否为业务正常增长

6.2 定期检查计划

不同类型和级别的检查应按照不同的频率执行,以平衡监控覆盖面和资源消耗:

实践建议:在生产环境中,将监控Skill与CI/CD流水线或定时任务(Cron Job)集成,实现完全自动化的周期性检查。结合Claude Code的Schedule功能,可以配置每天上午9点自动执行全面健康检查并推送报告到团队群聊。

七、核心要点总结

全面覆盖
监控体系应当覆盖CPU、内存、磁盘、网络、进程和日志六大维度,不留盲区
阈值科学
告警阈值应基于历史数据和业务特征设定,采用三级告警体系减少误报和漏报
趋势为王
单次指标无法反映问题全貌,持续的趋势分析和历史数据比对才是发现隐患的关键
闭环处理
从发现告警到诊断分析到修复验证到复盘总结,形成完整的运维闭环
优化驱动
监控的最终目的是驱动优化,每个告警和发现都应转化为具体的优化行动项
自动化
将监控流程封装为Skill,配合Schedule实现全自动定期检查和告警通知

服务器监控Skill的建设目标:

第一,将所有日常服务器监控工作封装为可复用的Claude Code Skill,实现"一句话"唤起监控能力。

第二,建立从数据采集、指标分析、告警通知到优化建议的全链路自动化体系。

第三,通过持续的趋势分析和容量预测,将运维工作从被动救火转变为主动预防。