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

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

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

bash 复制代码
#!/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" ]]; then
    echo "错误:服务器列表文件 $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" ]]; then
            echo "$ip,,连接失败: $(date +%T),N/A,N/A,N/A"
            return
        fi
        
        # 收集系统指标
        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 )); do
        sleep 0.2
        # 检查已完成的进程
        for pid in "${!running_ssh[@]}"; do
            if ! kill -0 "$pid" 2>/dev/null; then
                unset running_ssh["$pid"]
                ((running_count--))
            fi
        done
    done
    
    # 启动监控任务
    monitor_server "$ip" &
    running_ssh[$!]="$ip"
    ((running_count++))
done < "$HOST_FILE"

# 等待所有后台任务完成
wait
echo "监控完成! 结果已保存到: $OUTPUT_FILE"

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

  1. 并发处理机制
bash 复制代码
while (( running_count >= MAX_CONCURRENCY )); do
    sleep 0.2
    for pid in "${!running_ssh[@]}"; do
        if ! kill -0 "$pid" 2>/dev/null; then
            unset running_ssh["$pid"]
            ((running_count--))
        fi
    done
done
  • 使用进程池技术控制并发数量(默认20)
  • 实时检测进程状态释放槽位
  • 避免同时发起过多SSH请求导致网络拥堵
  1. 指标收集函数
bash 复制代码
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"')
  • 磁盘使用:监控根分区使用率(可修改为指定分区)

  • 真实内存计算

bash 复制代码
($3-$6-$7)/$2 * 100

计算公式

  • $3:已用内存

  • $6:缓存(cache)

  • $7:缓冲(buffer)

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

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

使用说明:

  1. 准备工作
bash 复制代码
# 创建服务器列表文件
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. 执行监控
bash 复制代码
./server_monitor.sh
  1. 输出示例
bash 复制代码
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天数据)

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

相关推荐
用户03284722207010 小时前
如何搭建本地yum源(上)
运维
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz3 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈3 天前
Unix 与 Linux 异同小叙
linux·服务器·unix
施努卡机器视觉4 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造