监控 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.pswp.cn/web/82535.shtml

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

相关文章

[5-02-04].第01节:Jmeter环境搭建:

JMeter笔记大纲 Jmeter依赖于JDK&#xff0c;所以必须确保当前计算机上已经安装了JDK&#xff0c;并且配置了环境变量 一、JMeter概述&#xff1a; 1.1.JMeter是什么&#xff1a; JMeter是Appache组织使用java开发的一款测试工具 可以用于对服务器、网络或对象模拟巨大的负载…

【兽医处方专用软件】佳易王兽医电子处方软件:高效智能的宠物诊疗管理方案

一、软件概述与核心优势 &#xff08;一&#xff09;试用版获取方式 资源下载路径&#xff1a;进入博主头像主页第一篇文章末尾&#xff0c;点击卡片按钮&#xff1b;或访问左上角博客主页&#xff0c;通过右侧按钮获取详细资料。 说明&#xff1a;下载文件为压缩包&#xff…

MapReduce(期末速成版)

起初在B站看3分钟的速成视频&#xff0c;感觉很多细节没听懂。 具体例子解析(文件内容去重) 对于两个输入文件&#xff0c;即文件A 和文件B&#xff0c;请编写MapReduce 程序&#xff0c;对两个文件进行合并&#xff0c;并剔除 其中重复的内容&#xff0c;得到一个新的输出文件…

Java高级 | 【实验四】Springboot 获取前端数据与返回Json数据

隶属文章&#xff1a; Java高级 | &#xff08;二十二&#xff09;Java常用类库-CSDN博客 系列文章&#xff1a; Java高级 | 【实验一】Spring Boot安装及测试 最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot …

从零打造AI面试系统全栈开发

&#x1f916; AI面试系统开发完整教程 &#x1f4cb; 项目概述 本教程将带你从零开始构建一个完整的AI面试系统&#xff0c;包含前端、后端、AI集成和部署的全流程。 源码地址 技术栈 前端: React TypeScript Vite Vaadin Components后端: Spring Boot Spring Securi…

【硬件】PCIe协议 | 电脑的高速公路

文章目录 PCIe | 外围设备高速互联通道&#xff08;peripheral component interconnect express&#xff09;的核心概念和应用 基础概念 1.1 电脑内的”高速“&#xff0c;连接CPU、显卡、SSD&#xff08;固态硬盘&#xff09;等核心组件&#xff1b;数据传输速度极快&#xff…

【 Redis | 完结篇 缓存优化 】

前言&#xff1a;本节包含常见redis缓存问题&#xff0c;包含缓存一致性问题&#xff0c;缓存雪崩&#xff0c;缓存穿透&#xff0c;缓存击穿问题及其解决方案 1. 缓存一致性 我们先看下目前企业用的最多的缓存模型。缓存的通用模型有三种&#xff1a; 缓存模型解释Cache Asi…

MySQL访问控制与账号管理:原理、技术与最佳实践

MySQL的安全体系建立在精细的访问控制和账号管理机制上。本文基于MySQL 9.3官方文档,深入解析其核心原理、关键技术、实用技巧和行业最佳实践。 一、访问控制核心原理:双重验证机制 连接验证 (Connection Verification) 客户端发起连接时,MySQL依据user_name@host_name组合进…

Go语言爬虫系列教程4:使用正则表达式解析HTML内容

Go语言爬虫系列教程4&#xff1a;使用正则表达式解析HTML内容 正则表达式&#xff08;Regular Expression&#xff0c;简称RegEx&#xff09;是处理文本数据的利器。在网络爬虫中&#xff0c;我们经常需要从HTML页面中提取特定的信息&#xff0c;正则表达式就像一个智能的&quo…

笔记 | docker构建失败

笔记 | docker构建失败 构建报错LOG1 rootThinkPad-FLY:/mnt/e/02-docker/ubunutu-vm# docker build -t ubuntu16.04:v1 . [] Building 714.5s (6/11) docker:default> [internal] load …

CentOS 7.9 安装 宝塔面板

在 CentOS 7.9 上安装 宝塔面板&#xff08;BT Panel&#xff09; 的完整步骤如下&#xff1a; 1. 准备工作 系统要求&#xff1a; CentOS 7.x&#xff08;推荐 7.9&#xff09;内存 ≥ 1GB&#xff08;建议 2GB&#xff09;硬盘 ≥ 20GBroot 权限&#xff08;需使用 root 用户…

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…

【AI News | 20250604】每日AI进展

AI Repos 1、jaaz Jaaz是一款免费开源的AI设计代理&#xff0c;作为Lovart的本地替代品&#xff0c;它能实现图像、海报、故事板的设计、编辑和生成。Jaaz集成了LLM&#xff0c;可智能生成提示并批量生成图像&#xff0c;支持Ollama、Stable Diffusion等本地及API模型。用户可…

Docker load 后镜像名称为空问题的解决方案

在使用 docker load命令从存档文件中加载Docker镜像时&#xff0c;有时会遇到镜像名称为空的情况。这种情况通常是由于在保存镜像时未正确标记镜像名称和标签&#xff0c;或者在加载镜像时出现了意外情况。本文将介绍如何诊断和解决这一问题。 一、问题描述 当使用 docker lo…

SQL进阶之旅 Day 14:数据透视与行列转换技巧

【SQL进阶之旅 Day 14】数据透视与行列转换技巧 开篇 欢迎来到“SQL进阶之旅”系列的第14天&#xff01;今天我们将探讨数据透视与行列转换技巧&#xff0c;这是数据分析和报表生成中的核心技能。无论你是数据库开发工程师、数据分析师还是后端开发人员&#xff0c;行转列或列…

haribote原型系统改进方向

在时钟中断、计时器和键盘输入方面&#xff0c;一些创新性的改进方向&#xff1a; 时钟中断 (PIT / inthandler20) 动态节拍 (Tickless Kernel)&#xff1a;当前的 PIT 中断以固定频率&#xff08;约 100Hz&#xff09;触发&#xff0c;即使系统空闲或没有即将到期的计时器&…

LabVIEW基于 DataSocket从 OPC 服务器读取数据

LabVIEW 中基于 DataSocket 函数从 OPC 服务器读取数据的功能&#xff0c;为工业自动化等场景下的数据交互提供了解决方案。通过特定函数实现 URL 指定、连接建立与管理、数据读取&#xff0c;相比传统 Socket 通信和 RESTful API &#xff0c;在 OPC 服务器数据交互场景有适配…

SimpleDateFormat 和 DateTimeFormatter 的异同

在Java开发中Date类型转String类型是比较常见的&#xff0c;其中最常用的是以下几种方式&#xff1a; 1. 使用SimpleDateFormat&#xff08;Java 8之前&#xff09; import java.text.SimpleDateFormat; import java.util.Date;public class DateToStringExample {public sta…

《前端面试题:CSS对浏览器兼容性》

CSS浏览器兼容性完全指南&#xff1a;从原理到实战 跨浏览器兼容性是前端开发的核心挑战&#xff0c;也是面试中的高频考点。查看所有css属性对各个浏览器兼容网站&#xff1a;https://caniuse.com 一、浏览器兼容性为何如此重要&#xff1f; 在当今多浏览器生态中&#xff0c…

【stm32开发板】单片机最小系统原理图设计

一、批量添加网络标签 可以选择浮动工具中的N&#xff0c;单独为引脚添加网络标签。 当芯片引脚非常多的时候&#xff0c;选中芯片&#xff0c;右键选择扇出网络标签/非连接标识 按住ctrl键即可选中多个引脚 点击将引脚名称填入网络名 就完成了引脚标签的批量添加 二、电源引…