MST

星途 面试题库

面试题:Bash在复杂系统监控场景下的综合应用与调优

假设有一个由多台服务器组成的分布式系统,你需要使用Bash脚本来监控每台服务器的CPU、内存、网络流量等关键指标,并能实时发现性能异常。同时,当某个指标超出阈值时,要自动进行一些预定义的性能调优操作(如调整CPU调度策略、清理缓存等)。请详细阐述你的设计思路,包括脚本架构、数据采集方法、阈值设定与监控逻辑、自动调优操作实现等,并给出关键部分的代码示例。
12.8万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 脚本架构:采用模块化设计,将数据采集、阈值判断、自动调优操作分别封装成不同的函数,主脚本负责调用这些函数,并通过循环实现持续监控。
  2. 数据采集方法
    • CPU使用率:通过top -bn1 | grep 'Cpu(s)' | awk '{print $2 + $4}'命令获取。top -bn1表示以非交互模式运行一次top命令,grep 'Cpu(s)'筛选出CPU相关信息行,awk提取用户态和系统态CPU使用率之和。
    • 内存使用率free -h | awk 'NR==2{printf "%.2f%%", ($2 - $NF) / $2 * 100}'free -h以人类可读格式显示内存信息,NR==2定位到内存总量和使用量所在行,awk计算并格式化输出内存使用率。
    • 网络流量cat /proc/net/dev | awk '/eth0/ {print $2, $10}'/proc/net/dev文件记录网络设备统计信息,eth0是常见网络接口,这里提取接收和发送字节数。
  3. 阈值设定与监控逻辑:在脚本开头定义CPU、内存、网络流量的阈值。在主循环中,每次采集数据后,将实际值与阈值比较。若超出阈值,记录日志并调用相应的自动调优函数。
  4. 自动调优操作实现
    • 调整CPU调度策略:可以通过修改/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor文件来改变CPU调度策略,如echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
    • 清理缓存sudo sync && sudo echo 3 | sudo tee /proc/sys/vm/drop_cachessync将缓存数据写入磁盘,echo 3 | tee /proc/sys/vm/drop_caches清理页缓存、目录项和inode缓存。

关键部分代码示例

#!/bin/bash

# 定义阈值
CPU_THRESHOLD=80
MEMORY_THRESHOLD=80
NETWORK_THRESHOLD=1000000 # 假设单位为字节

# 数据采集函数
get_cpu_usage() {
    top -bn1 | grep 'Cpu(s)' | awk '{print $2 + $4}'
}

get_memory_usage() {
    free -h | awk 'NR==2{printf "%.2f%%", ($2 - $NF) / $2 * 100}'
}

get_network_traffic() {
    cat /proc/net/dev | awk '/eth0/ {print $2, $10}'
}

# 自动调优函数
tune_cpu() {
    echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
    echo "CPU调度策略已调整为performance"
}

tune_memory() {
    sudo sync && sudo echo 3 | sudo tee /proc/sys/vm/drop_caches
    echo "缓存已清理"
}

# 主监控循环
while true; do
    cpu_usage=$(get_cpu_usage)
    memory_usage=$(get_memory_usage)
    read -r receive_bytes send_bytes <<< $(get_network_traffic)

    if (( $(echo "$cpu_usage > $CPU_THRESHOLD" | bc -l) )); then
        echo "CPU使用率 $cpu_usage% 超出阈值 $CPU_THRESHOLD%,开始调优"
        tune_cpu
    fi

    if (( $(echo "${memory_usage%?} > $MEMORY_THRESHOLD" | bc -l) )); then
        echo "内存使用率 $memory_usage 超出阈值 $MEMORY_THRESHOLD%,开始调优"
        tune_memory
    fi

    if (( receive_bytes > NETWORK_THRESHOLD || send_bytes > NETWORK_THRESHOLD )); then
        echo "网络流量超出阈值,接收: $receive_bytes 发送: $send_bytes"
        # 这里可添加网络相关调优操作
    fi

    sleep 60 # 每60秒采集一次数据
done

注意事项:

  1. 上述代码中的网络接口假设为eth0,实际使用中需根据服务器实际网络接口调整。
  2. 执行某些调优操作可能需要root权限,脚本中部分命令使用sudo,确保运行脚本的用户有sudo权限或提前配置好免密sudo
  3. 此脚本适用于Linux系统,不同系统版本可能在命令输出格式上有差异,需根据实际情况调整。