当前位置: 首页 > news >正文

监控 100 台服务器磁盘内存CPU利用率

监控 100 台服务器磁盘,内存,CPU利用率脚本

以下是一个优化后的监控脚本,用于同时监控100台服务器的磁盘、内存和CPU利用率,并支持并发执行以提高效率:

#!/bin/bash
# 服务器监控脚本 - 支持并发获取100台服务器系统指标
# 功能:同时监控磁盘、内存、CPU利用率
# 需要提前配置SSH免密登录和目标服务器IP列表# 配置参数
HOST_FILE="server_list.txt"   # 服务器IP列表文件
MAX_CONCURRENCY=20            # 最大并发数(避免过高负载)
LOG_DIR="monitor_logs"        # 日志存放目录
CURRENT_DATE=$(date +%Y%m%d)  # 当前日期# 创建日志目录
mkdir -p "$LOG_DIR"
OUTPUT_FILE="$LOG_DIR/monitor_report_$CURRENT_DATE.csv"# 检查服务器列表文件
if [[ ! -f "$HOST_FILE" ]]; thenecho "错误:服务器列表文件 $HOST_FILE 不存在!"exit 1
fi# 准备CSV文件表头
echo "Hostname,IP,Timestamp,DisktUsed(%),MemoryUsed(%),CPULoad" > "$OUTPUT_FILE"# 并发执行控制变量
declare -A running_ssh  # 跟踪正在运行的SSH进程
declare -A host_outputs # 存储主机输出
running_count=0# 核心监控函数
monitor_server() {local ip="$1"{# 获取主机名local hostname=$(ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no "$ip" 'hostname' 2>/dev/null)if [[ -z "$hostname" ]]; thenecho "$ip,,连接失败: $(date +%T),N/A,N/A,N/A"returnfi# 收集系统指标read -r timestamp disk_usage memory_usage cpu_load <<< $(ssh "$ip" \'ts=$(date +%T);disk=$(df -h / | awk "NR==2{print \$5}" | tr -d "%");mem=$(free | awk "/Mem/{printf \"%.0f\", (\$3-\$6-\$7)*100/\$2}");  # 计算真实内存使用cpu=$(top -bn1 | awk "/Cpu/ {printf \"%.1f\", 100 - \$8}");  # 获取CPU利用率echo "$ts $disk $mem $cpu"')# 输出CSV格式结果echo "$hostname,$ip,$timestamp,${disk_usage:-0},${memory_usage:-0},${cpu_load:-0}"} >> "$OUTPUT_FILE" 2>/dev/null
}# 主监控循环
while IFS= read -r ip; do# 跳过空行和注释[[ -z "$ip" || "$ip" =~ ^# ]] && continue# 等待空闲槽位while (( running_count >= MAX_CONCURRENCY )); dosleep 0.2# 检查已完成的进程for pid in "${!running_ssh[@]}"; doif ! kill -0 "$pid" 2>/dev/null; thenunset running_ssh["$pid"]((running_count--))fidonedone# 启动监控任务monitor_server "$ip" &running_ssh[$!]="$ip"((running_count++))
done < "$HOST_FILE"# 等待所有后台任务完成
wait
echo "监控完成! 结果已保存到: $OUTPUT_FILE"

脚本关键优化点与功能说明:

  1. 并发处理机制
while (( running_count >= MAX_CONCURRENCY )); dosleep 0.2for pid in "${!running_ssh[@]}"; doif ! kill -0 "$pid" 2>/dev/null; thenunset running_ssh["$pid"]((running_count--))fidone
done
  • 使用进程池技术控制并发数量(默认20)
  • 实时检测进程状态释放槽位
  • 避免同时发起过多SSH请求导致网络拥堵
  1. 指标收集函数
read -r timestamp disk_usage memory_usage cpu_load <<< $(ssh "$ip" \'ts=$(date +%T);disk=$(df -h / | awk "NR==2{print \$5}" | tr -d "%");mem=$(free | awk "/Mem/{printf \"%.0f\", (\$3-\$6-\$7)*100/\$2}"); cpu=$(top -bn1 | awk "/Cpu/ {printf \"%.1f\", 100 - \$8}");echo "$ts $disk $mem $cpu"')
  • 磁盘使用:监控根分区使用率(可修改为指定分区)

  • 真实内存计算

($3-$6-$7)/$2 * 100

计算公式

  • $3:已用内存

  • $6:缓存(cache)

  • $7:缓冲(buffer)

  • CPU利用率:100% - 空闲时间 = 实际使用率

  1. 错误处理与超时
local hostname=$(ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no "$ip" 'hostname' 2>/dev/null)
if [[ -z "$hostname" ]]; thenecho "$ip,,连接失败: $(date +%T),N/A,N/A,N/A"return
fi
  • SSH超时设置(5秒)
  • 连接失败自动记录错误信息
  • StrictHostKeyChecking跳过密钥确认
  1. 日志与输出
echo "Hostname,IP,Timestamp,DisktUsed(%),MemoryUsed(%),CPULoad" > "$OUTPUT_FILE"
  • CSV格式输出,兼容Excel分析
  • 按日期生成日志文件(自动创建目录)
  • 表头清晰标注指标单位
  1. 内存计算优化
mem=$(free | awk "/Mem/{printf \"%.0f\", (\$3-\$6-\$7)*100/\$2}")
  • 创新点:计算真实使用内存 = 总内存 - (free + buffers + cache)
  • 区别于简单计算 used/total*100,更准确反映应用实际内存占用

使用说明:

  1. 准备工作
# 创建服务器列表文件
echo "192.168.1.101" >> server_list.txt
echo "192.168.1.102" >> server_list.txt
# ...添加100台服务器IP# 配置SSH免密登录
ssh-keygen
for ip in $(cat server_list.txt); do ssh-copy-id $ip
done# 添加执行权限
chmod +x server_monitor.sh
  1. 执行监控
./server_monitor.sh
  1. 输出示例
Hostname,IP,Timestamp,DisktUsed(%),MemoryUsed(%),CPULoad
web-node1,192.168.1.101,14:35:22,35,68,24.5
db-master,192.168.1.102,14:35:23,12,45,8.3
...(100台数据)

注意事项:

  1. 内存计算使用CentOS/RHEL的free命令输出格式
  2. top -bn1 需要服务器支持batch模式
  3. 如需监控指定分区,修改df命令的挂载点
  4. 对于Ubuntu系统,调整内存计算公式(free -m输出列不同)
  5. 可添加阈值告警功能(在echo前添加判断)
  6. 日志文件可配置定时清理(如保留7天数据)

此脚本优化了服务器监控的效率和准确性,特别是改进了内存使用率的计算方式,能更真实地反映服务器的内存压力情况。

http://www.lqws.cn/news/69697.html

相关文章:

  • MPTCP 聚合吞吐
  • StarRocks部署方案详解:从单机到分布式集群
  • TDengine 的 AI 应用实战——电力需求预测
  • 【存储基础】存储设备和服务器的关系和区别
  • 第1篇:数据库中间件概述:架构演进、典型方案与应用场景
  • 序列搜索策略
  • PromQL 快速上手
  • 4.RV1126-OPENCV 图像轮廓识别
  • 【SpringBoot】| 接口架构风格—RESTful
  • 什么是 CPU 缓存模型?
  • 深入探讨redis:缓存
  • vue-13(延迟加载路由)
  • Vue-6-前端框架Vue之基于Plotly.js绘制曲线
  • 【软件测试】web自动化:Pycharm+Selenium+Firefox(一)
  • WebSocket与Reactor模式:构建实时交互应用
  • Qt OpenGL 实现交互功能(如鼠标、键盘操作)
  • 【基于阿里云搭建数据仓库(离线)】Data Studio创建资源与函数
  • [Java恶补day13] 53. 最大子数组和
  • AI大数据模型如何与thingsboard物联网结合
  • 基于SpringBoot运动会管理系统设计和实现(源码+文档+部署讲解)
  • 20250602在荣品的PRO-RK3566开发板的Android13下打开关机对话框
  • 【LeetCode 题解】两数之和(C++/Python 双解法):从语法到算法的全面解析
  • (LeetCode 每日一题)135. 分发糖果 ( 贪心 )
  • 基于Python学习《Head First设计模式》第三章 装饰者模式
  • Spring Security入门:创建第一个安全REST端点项目
  • 好用的C/C++/嵌入式 IDE: CLion的下载安装教程(保姆级教程)
  • 黑马Java面试笔记之 微服务篇(SpringCloud)
  • 【图论 拓扑排序 贪心 临项交换】P5603 小 C 与桌游 题解|普及+
  • XML-BEANS compiled schema: Could not locate compiled schema resource
  • Day43打卡(补41+42) @浙大疏锦行