脚本如何检测系统负载平均值

wen 实用脚本 1

本文目录导读:

脚本如何检测系统负载平均值

  1. Shell 脚本(Linux/Unix)
  2. Python 脚本
  3. Go 语言
  4. Node.js
  5. 负载阈值建议
  6. 注意事项

检测系统负载平均值(Load Average)的方法取决于你使用的编程语言和操作系统,以下是几种常见的实现方案:

Shell 脚本(Linux/Unix)

#!/bin/bash
# 方法1:使用 uptime 命令
load=$(uptime | awk -F 'load average:' '{print $2}')
echo "Load Average: $load"
# 方法2:直接从 /proc/loadavg 读取
load=$(cat /proc/loadavg | awk '{print $1, $2, $3}')
echo "1分钟: $(echo $load | awk '{print $1}')"
echo "5分钟: $(echo $load | awk '{print $2}')"
echo "15分钟: $(echo $load | awk '{print $3}')"
# 方法3:检查是否超过阈值(CPU 核心数)
cores=$(nproc)
current_load=$(cat /proc/loadavg | awk '{print $1}')
if (( $(echo "$current_load > $cores * 0.8" | bc -l) )); then
    echo "警告:系统负载过高!"
fi

Python 脚本

import os
# Linux/Unix
def get_load_avg():
    try:
        with open('/proc/loadavg', 'r') as f:
            load = f.read().split()[:3]
            return {
                '1min': float(load[0]),
                '5min': float(load[1]),
                '15min': float(load[2])
            }
    except FileNotFoundError:
        return None
# 跨平台方案(使用 psutil)
import psutil
def get_cross_platform_load():
    load = psutil.getloadavg()
    return {
        '1min': load[0],
        '5min': load[1],
        '15min': load[2]
    }
# 使用示例
load = get_cross_platform_load()
print(f"Load Average: {load['1min']:.2f} / {load['5min']:.2f} / {load['15min']:.2f}")
# 检查是否需要告警
cpu_count = os.cpu_count()
if load['1min'] > cpu_count * 0.9:
    print(f"⚠️ 系统负载过高!1分钟平均: {load['1min']:.2f} (CPU核心数: {cpu_count})")

Go 语言

package main
import (
    "fmt"
    "io/ioutil"
    "strings"
    "strconv"
    "runtime"
)
func getLoadAverages() (float64, float64, float64, error) {
    data, err := ioutil.ReadFile("/proc/loadavg")
    if err != nil {
        return 0, 0, 0, err
    }
    fields := strings.Fields(string(data))
    load1, _ := strconv.ParseFloat(fields[0], 64)
    load5, _ := strconv.ParseFloat(fields[1], 64)
    load15, _ := strconv.ParseFloat(fields[2], 64)
    return load1, load5, load15, nil
}
func main() {
    load1, load5, load15, err := getLoadAverages()
    if err != nil {
        fmt.Printf("读取负载失败: %v\n", err)
        return
    }
    fmt.Printf("Load Average: %.2f / %.2f / %.2f\n", load1, load5, load15)
    cpuCores := runtime.NumCPU()
    fmt.Printf("CPU核心数: %d\n", cpuCores)
    if load1 > float64(cpuCores) * 0.9 {
        fmt.Println("⚠️ 系统负载过高!")
    }
}

Node.js

const os = require('os');
const fs = require('fs');
// 方法1:使用 os 模块
function getLoadFromOS() {
    const load = os.loadavg();
    return {
        '1min': load[0],
        '5min': load[1],
        '15min': load[2]
    };
}
// 方法2:从 /proc/loadavg 读取(Linux)
function getLoadFromProc() {
    try {
        const data = fs.readFileSync('/proc/loadavg', 'utf8');
        const parts = data.split(' ').slice(0, 3).map(Number);
        return {
            '1min': parts[0],
            '5min': parts[1],
            '15min': parts[2]
        };
    } catch (err) {
        return null;
    }
}
// 使用示例
const load = getLoadFromOS();
console.log(`Load Average: ${load['1min'].toFixed(2)} / ${load['5min'].toFixed(2)} / ${load['15min'].toFixed(2)}`);
const cpus = os.cpus().length;
if (load['1min'] > cpus * 0.8) {
    console.log(`⚠️ 警告:系统负载超过阈值!(${load['1min'].toFixed(2)} > ${cpus * 0.8})`);
}

负载阈值建议

  • 正常范围:负载平均值 < CPU核心数 * 0.7
  • 警告范围:CPU核心数 0.7 < 负载 < CPU核心数 1.0
  • 危险范围:负载 > CPU核心数 * 1.0

注意事项

  1. Windows 系统:直接读取 /proc/loadavg 不可用,需要使用 wmic 或性能计数器
  2. 权限问题:读取 /proc/loadavg 通常不需要 root 权限
  3. 监控集成:可以结合告警系统(如 Prometheus、Zabbix)进行自动化监控

选择一个适合你开发环境的方案即可,如果需要在多平台运行,推荐使用带有跨平台支持的库(如 Python 的 psutil)。

抱歉,评论功能暂时关闭!