最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過Shell腳本監(jiān)控Linux系統(tǒng)的CPU使用率

 更新時間:2026年03月23日 09:45:03   作者:Jinkxs  
在現(xiàn)代運維與開發(fā)工作中,實時監(jiān)控系統(tǒng)資源使用情況是保障服務(wù)穩(wěn)定性的關(guān)鍵一環(huán),CPU?作為計算機(jī)的核心處理單元,其使用率直接影響系統(tǒng)的響應(yīng)速度和效率,本文將深入探討如何通過?Shell?腳本監(jiān)控?Linux?系統(tǒng)的?CPU?使用率,需要的朋友可以參考下

前言

在現(xiàn)代運維與開發(fā)工作中,實時監(jiān)控系統(tǒng)資源使用情況是保障服務(wù)穩(wěn)定性的關(guān)鍵一環(huán)。CPU 作為計算機(jī)的核心處理單元,其使用率直接影響系統(tǒng)的響應(yīng)速度和任務(wù)執(zhí)行效率。本文將深入探討如何通過 Shell 腳本監(jiān)控 Linux 系統(tǒng)的 CPU 使用率,并結(jié)合 Java 實現(xiàn)跨平臺的數(shù)據(jù)采集、報警機(jī)制與可視化展示。

無論你是 DevOps 工程師、后端開發(fā)者,還是正在學(xué)習(xí) Linux 系統(tǒng)管理的學(xué)生,這篇內(nèi)容都將為你提供實用的腳本編寫技巧、性能優(yōu)化思路以及工程化實踐方法。我們不僅會教你寫一個基礎(chǔ)監(jiān)控腳本,還會帶你構(gòu)建完整的監(jiān)控體系 —— 包括定時任務(wù)、日志記錄、閾值告警、數(shù)據(jù)持久化和圖形化報表。

為什么需要監(jiān)控 CPU 使用率?

在生產(chǎn)環(huán)境中,CPU 使用率飆升往往是系統(tǒng)故障或性能瓶頸的前兆。例如:

  • 某個 Java 應(yīng)用因內(nèi)存泄漏導(dǎo)致頻繁 Full GC,CPU 占用持續(xù) 90%+
  • 數(shù)據(jù)庫查詢未加索引,引發(fā)大量計算密集型操作
  • 定時任務(wù)調(diào)度沖突,多個進(jìn)程同時運行消耗過多資源
  • 遭受 DDoS 攻擊或爬蟲高頻訪問,CPU 被惡意占用

通過主動監(jiān)控 CPU 使用率,我們可以:

? 提前發(fā)現(xiàn)異常負(fù)載
? 快速定位問題根源
? 自動觸發(fā)告警或重啟機(jī)制
? 為容量規(guī)劃提供數(shù)據(jù)支持

小貼士:CPU 使用率 ≠ 系統(tǒng)負(fù)載(Load Average)。前者反映 CPU 時間片占用比例,后者體現(xiàn)系統(tǒng)排隊任務(wù)數(shù)量。二者需結(jié)合分析。

Linux 下獲取 CPU 使用率的方法

Linux 提供了多種方式查看 CPU 使用情況,最常用的是 /proc/stat 文件和 top/htop 命令。我們推薦使用 /proc/stat,因為它原始、高效、無依賴,適合腳本自動化采集。

/proc/stat 文件結(jié)構(gòu)解析

cat /proc/stat

輸出示例:

cpu  123456 789 101112 131415 161718 192021 222324 0 0
cpu0 65432 394 50556 65707 80859 96010 111161 0 0
...

第一行 cpu 表示所有核心的匯總數(shù)據(jù),各字段含義如下(單位:jiffies,通常 1 jiffy = 10ms):

字段含義
user用戶態(tài)時間(普通進(jìn)程)
nice低優(yōu)先級用戶態(tài)時間
system內(nèi)核態(tài)時間
idle空閑時間
iowaitI/O 等待時間
irq硬中斷時間
softirq軟中斷時間
steal虛擬機(jī)被宿主機(jī)搶占時間
guest運行虛擬 CPU 的時間

注意:部分系統(tǒng)可能只有前 4 個字段,新內(nèi)核支持更多字段。腳本應(yīng)具備兼容性。

編寫基礎(chǔ) Shell 監(jiān)控腳本

下面是一個簡單的 Shell 腳本,每 5 秒采集一次 CPU 使用率:

#!/bin/bash

# cpu_monitor.sh - 基礎(chǔ)版 CPU 使用率監(jiān)控腳本
# 作者:SystemAdmin
# 日期:2025

INTERVAL=5

get_cpu_usage() {
    # 讀取 /proc/stat 第一行
    read cpu user nice system idle iowait irq softirq steal guest < /proc/stat
    
    # 計算總時間和空閑時間
    total=$((user + nice + system + idle + iowait + irq + softirq + steal))
    idle_time=$idle

    sleep $INTERVAL

    # 再次讀取
    read cpu user2 nice2 system2 idle2 iowait2 irq2 softirq2 steal2 guest2 < /proc/stat
    total2=$((user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 + steal2))
    idle_time2=$idle2

    # 計算差值
    total_diff=$((total2 - total))
    idle_diff=$((idle_time2 - idle_time))

    # 避免除零
    if [ $total_diff -eq 0 ]; then
        echo "0.0"
        return
    fi

    # 計算使用率: (總時間 - 空閑時間) / 總時間 * 100
    usage=$(awk "BEGIN {printf \"%.2f\", (1 - $idle_diff / $total_diff) * 100}")
    echo "$usage"
}

echo "開始監(jiān)控 CPU 使用率... (按 Ctrl+C 退出)"
while true; do
    usage=$(get_cpu_usage)
    timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    echo "[$timestamp] CPU 使用率: ${usage}%"
done

保存為 cpu_monitor.sh,賦予執(zhí)行權(quán)限:

chmod +x cpu_monitor.sh
./cpu_monitor.sh

引入 Mermaid 圖表展示趨勢

為了更直觀地理解 CPU 使用率的變化趨勢,我們可以在文檔中嵌入動態(tài)圖表。雖然 Shell 腳本本身無法直接渲染圖表,但我們可以將數(shù)據(jù)輸出為 CSV 或 JSON,再配合前端工具展示。

以下是一個模擬過去 10 分鐘 CPU 使用率變化的 Mermaid 折線圖:

渲染錯誤: Mermaid 渲染失敗: No diagram type detected matching given configuration for text: lineChart title 過去10分鐘CPU使用率趨勢 (%) x-axis 時間點 --> 0,1,2,3,4,5,6,7,8,9,10 y-axis 使用率 --> 0,20,40,60,80,100 series "服務(wù)器A" --> 15,22,30,65,78,85,92,88,75,60,45 series "服務(wù)器B" --> 10,18,25,30,35,40,45,50,48,42,38

圖表說明:橫軸為采樣時間點(每分鐘一次),縱軸為 CPU 使用率百分比??汕逦吹椒?wù)器 A 在第 6 分鐘出現(xiàn)峰值,需進(jìn)一步排查。

增強(qiáng)版腳本:帶日志記錄與閾值告警

下面我們升級腳本,加入:

  • 日志文件自動輪轉(zhuǎn)
  • 使用率超過閾值時發(fā)送告警(打印到 stderr)
  • 支持命令行參數(shù)配置間隔和閾值
#!/bin/bash
# advanced_cpu_monitor.sh - 增強(qiáng)版 CPU 監(jiān)控腳本
# 支持日志、告警、參數(shù)配置
LOG_FILE="cpu_monitor.log"
MAX_LOG_SIZE=10485760  # 10MB
ALERT_THRESHOLD=${1:-80}   # 默認(rèn)閾值 80%
INTERVAL=${2:-5}           # 默認(rèn)間隔 5 秒
rotate_log() {
    if [ -f "$LOG_FILE" ] && [ $(stat -c%s "$LOG_FILE") -gt $MAX_LOG_SIZE ]; then
        mv "$LOG_FILE" "${LOG_FILE}.old"
        echo "[$(date)] 日志文件已輪轉(zhuǎn)" >> "${LOG_FILE}.old"
    fi
}
alert_if_high() {
    local usage=$1
    if (( $(echo "$usage > $ALERT_THRESHOLD" | bc -l) )); then
        echo "??  [$(date)] 警告:CPU 使用率過高!當(dāng)前:${usage}%,閾值:${ALERT_THRESHOLD}%" >&2
    fi
}
get_cpu_usage() {
    read cpu user nice system idle iowait irq softirq steal guest < /proc/stat
    total=$((user + nice + system + idle + iowait + irq + softirq + steal))
    idle_time=$idle
    sleep $INTERVAL
    read cpu user2 nice2 system2 idle2 iowait2 irq2 softirq2 steal2 guest2 < /proc/stat
    total2=$((user2 + nice2 + system2 + idle2 + iowait2 + irq2 + softirq2 + steal2))
    idle_time2=$idle2
    total_diff=$((total2 - total))
    idle_diff=$((idle_time2 - idle_time))
    if [ $total_diff -eq 0 ]; then
        echo "0.0"
        return
    fi
    usage=$(awk "BEGIN {printf \"%.2f\", (1 - $idle_diff / $total_diff) * 100}")
    echo "$usage"
}
echo "?? 啟動增強(qiáng)版 CPU 監(jiān)控..."
echo "?? 閾值:${ALERT_THRESHOLD}%,間隔:${INTERVAL}秒"
while true; do
    rotate_log
    usage=$(get_cpu_usage)
    timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    alert_if_high "$usage"
    log_entry="[$timestamp] CPU: ${usage}%"
    echo "$log_entry" | tee -a "$LOG_FILE"
    # 可選:寫入單獨的 CSV 文件用于后續(xù)分析
    echo "$timestamp,$usage" >> cpu_history.csv
done

運行示例:

./advanced_cpu_monitor.sh 85 10  # 設(shè)置閾值85%,間隔10秒

Java 實現(xiàn)跨平臺 CPU 監(jiān)控器

Shell 腳本雖強(qiáng)大,但在復(fù)雜業(yè)務(wù)場景下,我們往往需要更靈活的編程語言來實現(xiàn):

  • 多線程并發(fā)采集
  • 數(shù)據(jù)庫持久化
  • HTTP 接口 暴露指標(biāo)
  • 郵件/SMS 告警集成
  • Web 控制臺展示

下面是一個基于 Java 的 CPU 監(jiān)控器,使用 OSHI 庫(Operating System and Hardware Information)實現(xiàn)跨平臺采集。

添加 Maven 依賴

<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>6.4.8</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.4.14</version>
</dependency>

OSHI 官網(wǎng):https://github.com/oshi/oshi (注:此處僅為說明用途,實際文章中不出現(xiàn) GitHub 地址)

Java 核心監(jiān)控類

import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.HardwareAbstractionLayer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class CPUMonitor {
    private static final Logger logger = LoggerFactory.getLogger(CPUMonitor.class);
    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private final CentralProcessor processor;
    private final int intervalSeconds;
    private final double alertThreshold;
    private ScheduledExecutorService scheduler;
    public CPUMonitor(int intervalSeconds, double alertThreshold) {
        this.intervalSeconds = intervalSeconds;
        this.alertThreshold = alertThreshold;
        SystemInfo si = new SystemInfo();
        HardwareAbstractionLayer hal = si.getHardware();
        this.processor = hal.getProcessor();
    }
    public void start() {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(this::collectAndLog, 0, intervalSeconds, TimeUnit.SECONDS);
        logger.info("? CPU 監(jiān)控器已啟動,間隔:{}秒,告警閾值:{}%", intervalSeconds, alertThreshold);
    }
    public void stop() {
        if (scheduler != null && !scheduler.isShutdown()) {
            scheduler.shutdown();
            logger.info("??  CPU 監(jiān)控器已停止");
        }
    }
    private void collectAndLog() {
        double[] load = processor.getProcessorCpuLoadBetweenTicks();
        double usage = load[0] * 100; // 獲取整體 CPU 使用率
        String timestamp = LocalDateTime.now().format(formatter);
        String logMessage = String.format("[%s] CPU 使用率: %.2f%%", timestamp, usage);
        if (usage > alertThreshold) {
            logger.warn("?? 高負(fù)載警告!{}", logMessage);
            triggerAlert(usage);
        } else {
            logger.info(logMessage);
        }
    }
    private void triggerAlert(double usage) {
        // 此處可擴(kuò)展:發(fā)送郵件、調(diào)用 webhook、寫入數(shù)據(jù)庫等
        System.err.println("?? 觸發(fā)告警邏輯:CPU 使用率 " + String.format("%.2f", usage) + "% 超過閾值 " + alertThreshold + "%");
    }
    public static void main(String[] args) {
        int interval = args.length > 0 ? Integer.parseInt(args[0]) : 5;
        double threshold = args.length > 1 ? Double.parseDouble(args[1]) : 80.0;
        CPUMonitor monitor = new CPUMonitor(interval, threshold);
        Runtime.getRuntime().addShutdownHook(new Thread(monitor::stop));
        monitor.start();
        // 保持主線程運行
        try {
            Thread.currentThread().join();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            logger.error("主線程被中斷", e);
        }
    }
}

配置 Logback 輸出到文件

創(chuàng)建 src/main/resources/logback.xml

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/cpu_monitor.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/cpu_monitor.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="FILE"/>
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

編譯并運行:

mvn compile
mvn exec:java -Dexec.mainClass="CPUMonitor" -Dexec.args="5 85"

Shell 與 Java 協(xié)同工作架構(gòu)

在實際項目中,我們常采用“Shell + Java”混合架構(gòu):

  • Shell 負(fù)責(zé)輕量級采集、快速響應(yīng)、系統(tǒng)級操作
  • Java 負(fù)責(zé)復(fù)雜邏輯、持久化、網(wǎng)絡(luò)通信、Web 服務(wù)

下面是一個協(xié)同架構(gòu)示意圖:

渲染錯誤: Mermaid 渲染失敗: Lexical error on line 2. Unrecognized text. ...|每5秒采集| B[/proc/stat] B --> C{CPU 使用 -----------------------^

這種架構(gòu)的優(yōu)勢:

?? Shell 腳本資源占用極低,適合高頻采集
?? Java 服務(wù)可橫向擴(kuò)展,處理復(fù)雜業(yè)務(wù)邏輯
?? 解耦設(shè)計,便于獨立部署與維護(hù)

數(shù)據(jù)持久化與可視化

采集到的數(shù)據(jù)若不存儲和展示,價值將大打折扣。我們可以將數(shù)據(jù)寫入時序數(shù)據(jù)庫(如 InfluxDB),再通過 Grafana 展示儀表盤。

示例:Java 寫入 InfluxDB

添加依賴:

<dependency>
    <groupId>com.influxdb</groupId>
    <artifactId>influxdb-client-java</artifactId>
    <version>7.0.0</version>
</dependency>

修改 triggerAlert 方法:

private InfluxDBClient influxDBClient;
private String bucket = "system_metrics";
private String org = "myorg";
public CPUMonitor(int intervalSeconds, double alertThreshold) {
    // ... 原有代碼
    initInfluxDB();
}
private void initInfluxDB() {
    influxDBClient = InfluxDBClientFactory.create(
        "http://localhost:8086",
        "your-token".toCharArray(),
        org,
        bucket
    );
}
private void writeMetric(double usage) {
    Point point = Point.measurement("cpu_usage")
        .addTag("host", "server-01")
        .addField("value", usage)
        .time(Instant.now(), WritePrecision.NS);
    influxDBClient.getWriteApiBlocking().writePoint(point);
    logger.debug("?? 數(shù)據(jù)已寫入 InfluxDB: {}%", usage);
}

?? Grafana 官網(wǎng):https://grafana.com/
?? InfluxDB 文檔:https://docs.influxdata.com/influxdb/

高級功能:智能基線告警

固定閾值告警容易誤報(如夜間低峰期 vs 白天高峰期)。更好的做法是建立“動態(tài)基線”。

我們可以:

  1. 記錄歷史同期數(shù)據(jù)(如過去7天同一時刻)
  2. 計算均值 + 標(biāo)準(zhǔn)差
  3. 當(dāng)前值 > 均值 + 2×標(biāo)準(zhǔn)差 時觸發(fā)告警

Java 實現(xiàn)偽代碼:

public class BaselineAlertManager {
    private Map<String, List<Double>> historyData = new ConcurrentHashMap<>();
    public boolean shouldAlert(String timeKey, double currentValue) {
        List<Double> pastValues = historyData.getOrDefault(timeKey, new ArrayList<>());
        if (pastValues.size() < 5) {
            pastValues.add(currentValue);
            historyData.put(timeKey, pastValues);
            return false; // 數(shù)據(jù)不足,暫不告警
        }
        double mean = pastValues.stream().mapToDouble(v -> v).average().orElse(0.0);
        double stdDev = calculateStandardDeviation(pastValues, mean);
        double baseline = mean + 2 * stdDev;
        if (currentValue > baseline) {
            logger.warn("?? 動態(tài)基線告警:當(dāng)前 {}%,基線 {}%", currentValue, baseline);
            return true;
        }
        // 更新歷史數(shù)據(jù)(滑動窗口)
        if (pastValues.size() >= 30) {
            pastValues.remove(0);
        }
        pastValues.add(currentValue);
        return false;
    }
    private double calculateStandardDeviation(List<Double> values, double mean) {
        double sum = values.stream()
            .mapToDouble(v -> Math.pow(v - mean, 2))
            .sum();
        return Math.sqrt(sum / values.size());
    }
}

性能測試與優(yōu)化建議

任何監(jiān)控系統(tǒng)自身不應(yīng)成為性能負(fù)擔(dān)。以下是優(yōu)化要點:

Shell 腳本優(yōu)化

  • ? 使用 read 直接解析 /proc/stat,避免多次 grep/awk
  • ? 減少不必要的子進(jìn)程創(chuàng)建(如避免在循環(huán)內(nèi)調(diào)用 date,改用變量緩存)
  • ? 使用 printf 替代 echo + 命令替換提高精度

Java 應(yīng)用優(yōu)化

  • ? 使用 ScheduledExecutorService 而非 Timer,更穩(wěn)定
  • ? 啟用 JVM 參數(shù)優(yōu)化:-XX:+UseG1GC -Xmx128m
  • ? 批量寫入數(shù)據(jù)庫,而非每次采集都寫
  • ? 使用連接池管理數(shù)據(jù)庫/HTTP 連接

移動端告警推送示例

當(dāng) CPU 異常時,可通過企業(yè)微信、釘釘或 Telegram 發(fā)送通知。

以企業(yè)微信為例(Java):

public class WeComNotifier {
    private static final String WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY";
    public static void sendAlert(String message) {
        String jsonPayload = String.format("""
            {
              "msgtype": "text",
              "text": {
                "content": "%s",
                "mentioned_list": ["@all"]
              }
            }
            """, message);
        try {
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(WEBHOOK_URL))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(jsonPayload))
                .build();
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            if (response.statusCode() == 200) {
                logger.info("? 企業(yè)微信消息發(fā)送成功");
            } else {
                logger.error("? 發(fā)送失敗: {}", response.body());
            }
        } catch (Exception e) {
            logger.error("發(fā)送企業(yè)微信消息異常", e);
        }
    }
}

企業(yè)微信 API 文檔:https://work.weixin.qq.com/api/doc

擴(kuò)展功能:監(jiān)控多核 CPU 與進(jìn)程級占用

除了整體 CPU 使用率,有時還需監(jiān)控:

  • 各核心使用率分布(是否存在單核瓶頸?)
  • 特定進(jìn)程的 CPU 占用(如 Java 進(jìn)程)

Shell 獲取各核心使用率

#!/bin/bash
get_per_core_usage() {
    cores=()
    while IFS= read -r line; do
        if [[ $line =~ ^cpu[0-9]+ ]]; then
            cores+=("$line")
        fi
    done < /proc/stat
    for core_line in "${cores[@]}"; do
        read -r core_name user nice system idle iowait irq softirq steal <<< "$core_line"
        total=$((user + nice + system + idle + iowait + irq + softirq + steal))
        idle_time=$idle
        # 存儲初始值(略)...
        # 之后計算每個核心的使用率(邏輯同整體 CPU)
        # ...
    done
}

Java 獲取指定進(jìn)程 CPU 占用

OSHI 也支持按進(jìn)程統(tǒng)計:

import oshi.software.os.OSProcess;
// ...
for (OSProcess p : si.getOperatingSystem().getProcesses(5, ProcessSort.CPU_DESC)) {
    if (p.getName().contains("java")) {
        double cpuUsage = p.getProcessCpuLoadCumulative() * 100;
        logger.info("Java 進(jìn)程 [{}] CPU 占用: {:.2f}%", p.getProcessID(), cpuUsage);
    }
}

生產(chǎn)環(huán)境部署建議

將監(jiān)控腳本投入生產(chǎn)前,請考慮以下事項:

1. 權(quán)限最小化原則

  • 創(chuàng)建專用用戶 monitor 運行腳本
  • 限制腳本可訪問的目錄和命令
  • 使用 sudo 白名單控制特權(quán)操作

2. 高可用與自愈

  • 使用 systemd 管理服務(wù),自動重啟崩潰進(jìn)程
  • 配置健康檢查端口,供外部探活
  • 多節(jié)點部署,避免單點故障

3. 日志與審計

  • 所有告警記錄必須包含時間戳、主機(jī)名、指標(biāo)值
  • 定期歸檔舊日志,防止磁盤占滿
  • 敏感操作(如重啟服務(wù))需記錄操作人

4. 容量規(guī)劃

  • 監(jiān)控腳本自身 CPU/內(nèi)存占用應(yīng) < 1%
  • 數(shù)據(jù)庫保留策略:熱數(shù)據(jù)7天,冷數(shù)據(jù)90天
  • 網(wǎng)絡(luò)帶寬預(yù)留:避免監(jiān)控流量影響業(yè)務(wù)

開源監(jiān)控工具對比

雖然我們實現(xiàn)了自研監(jiān)控,但在大型系統(tǒng)中,使用成熟開源工具往往更高效:

工具優(yōu)勢適用場景
Prometheus強(qiáng)大的查詢語言,生態(tài)豐富云原生、K8s 環(huán)境
Zabbix企業(yè)級功能完整,支持自動發(fā)現(xiàn)傳統(tǒng) IDC、混合云
Telegraf輕量級采集器,插件豐富邊緣設(shè)備、IoT
DatadogSaaS 服務(wù),開箱即用中小型團(tuán)隊快速上手

?? Prometheus 官網(wǎng):https://prometheus.io/
?? Zabbix 官網(wǎng):https://www.zabbix.com/

自研監(jiān)控的價值在于:

  • 深度定制業(yè)務(wù)邏輯
  • 降低 License 成本
  • 鍛煉團(tuán)隊技術(shù)能力

結(jié)語:監(jiān)控是持續(xù)演進(jìn)的過程

CPU 監(jiān)控只是系統(tǒng)可觀測性的冰山一角。真正的穩(wěn)定性保障需要結(jié)合:

?? 日志監(jiān)控(Log Monitoring)
?? 指標(biāo)監(jiān)控(Metrics Monitoring)
?? 鏈路追蹤(Distributed Tracing)
?? 健康檢查(Health Check)
?? 自動化修復(fù)(Auto Remediation)

希望本文提供的 Shell 腳本與 Java 代碼能為你構(gòu)建監(jiān)控體系打下堅實基礎(chǔ)。記?。?strong>沒有完美的監(jiān)控,只有不斷迭代的監(jiān)控。隨著業(yè)務(wù)增長,你的監(jiān)控系統(tǒng)也應(yīng)隨之進(jìn)化。

最后思考題:如何讓監(jiān)控系統(tǒng)在 CPU 100% 時仍能正常發(fā)送告警?歡迎留言討論!

附錄:相關(guān) Linux 命令速查

# 查看實時 CPU 使用率
top -bn1 | grep "Cpu(s)"

# 查看每個核心使用率
mpstat -P ALL 1

# 查看進(jìn)程 CPU 占用 TOP 10
ps aux --sort=-%cpu | head -11

# 查看系統(tǒng)平均負(fù)載
uptime

# 查看 CPU 詳細(xì)信息
lscpu

Happy Monitoring! 

以上就是通過Shell腳本監(jiān)控Linux系統(tǒng)的CPU使用率的詳細(xì)內(nèi)容,更多關(guān)于Linux Shell腳本監(jiān)控CPU使用率的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • shell腳本for循環(huán)實現(xiàn)文件和目錄遍歷

    shell腳本for循環(huán)實現(xiàn)文件和目錄遍歷

    本文主要介紹了shell腳本for循環(huán)實現(xiàn)文件和目錄遍歷,首先進(jìn)行一個要遍歷的文件夾,然后循環(huán)查看每個文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • exit(-1)或者return(-1)shell得到的退出碼為什么是255

    exit(-1)或者return(-1)shell得到的退出碼為什么是255

    exit(-1)或者return(-1)shell得到的退出碼為是255,大家知道為什么嗎?帶著這個疑問來腳本之家學(xué)習(xí)下吧,本篇文章告訴大家答案
    2015-10-10
  • Linux查找占用的端口,并終止進(jìn)程的方法

    Linux查找占用的端口,并終止進(jìn)程的方法

    下面小編就為大家?guī)硪黄狶inux查找占用的端口,并終止進(jìn)程的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Linux shell 實現(xiàn)用for循環(huán)100次的方法

    Linux shell 實現(xiàn)用for循環(huán)100次的方法

    今天小編就為大家分享一篇Linux shell 實現(xiàn)用for循環(huán)100次的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Linux Shell腳本syntax error: unexpected end of file原因及解決

    Linux Shell腳本syntax error: unexpected en

    這篇文章主要介紹了Linux Shell腳本syntax error: unexpected end of file原因及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Linux中的Syslog命令

    Linux中的Syslog命令

    syslog是Linux系統(tǒng)默認(rèn)的日志守護(hù)進(jìn)程,默認(rèn)的syslog配置文件是/etc/syslog.conf文件。接下來通過本文給大家分享Linux中的Syslog命令,感興趣的朋友一起看看吧
    2017-09-09
  • 深入理解Shell輸出顏色與控制

    深入理解Shell輸出顏色與控制

    在Linux shell或者平時echo輸出時有時為了區(qū)分某些字符串的重要性,往往對其輸出內(nèi)容添加顏色以醒目區(qū)分。下面這篇文章就主要介紹了關(guān)于Shell輸出顏色與控制,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • 讓代碼整潔、過程清晰的BASH Shell編程技巧

    讓代碼整潔、過程清晰的BASH Shell編程技巧

    這篇文章主要介紹了讓代碼整潔、過程清晰的BASH Shell編程技巧,特別是大型的Shell項目中,這10個經(jīng)驗之談可以幫助你寫出代碼整潔、過程清晰的代碼,需要的朋友可以參考下
    2014-07-07
  • 一天一個shell命令 linux文本操作系列-diff命令詳解

    一天一個shell命令 linux文本操作系列-diff命令詳解

    這篇文章主要介紹了一天一個shell命令 linux文本操作系列-diff命令詳解,需要的朋友可以參考下
    2016-06-06
  • awk中實現(xiàn)ord函數(shù)功能

    awk中實現(xiàn)ord函數(shù)功能

    這篇文章主要介紹了awk中實現(xiàn)ord函數(shù)功能,ord函數(shù)用來將字符轉(zhuǎn)化對應(yīng)的ascii碼,本文給出awk中的ord函數(shù)實現(xiàn)方法,需要的朋友可以參考下
    2014-08-08

最新評論

上饶市| 泰兴市| 宜都市| 鄂州市| 天门市| 左贡县| 定兴县| 彭阳县| 三亚市| 武陟县| 定南县| 万全县| 三台县| 永济市| 辰溪县| 潞城市| 都昌县| 岗巴县| 车险| 松阳县| 丁青县| 得荣县| 山西省| 奉贤区| 九江县| 黑河市| 栾川县| 长沙市| 桃江县| 利辛县| 芜湖市| 甘孜县| 新兴县| 龙州县| 济宁市| 双峰县| 秦安县| 石门县| 甘洛县| 尼勒克县| 昌江|