監控 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
繁體地址,請注明出處:http://hk.pswp.cn/web/82535.shtml
英文地址,請注明出處:http://en.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鍵即可選中多個引腳 點擊將引腳名稱填入網絡名 就完成了引腳標簽的批量添加 二、電源引…