面试题答案
一键面试设计思路
- 脚本架构:采用模块化设计,将数据采集、阈值判断、自动调优操作分别封装成不同的函数,主脚本负责调用这些函数,并通过循环实现持续监控。
- 数据采集方法:
- 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
是常见网络接口,这里提取接收和发送字节数。
- CPU使用率:通过
- 阈值设定与监控逻辑:在脚本开头定义CPU、内存、网络流量的阈值。在主循环中,每次采集数据后,将实际值与阈值比较。若超出阈值,记录日志并调用相应的自动调优函数。
- 自动调优操作实现:
- 调整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_caches
,sync
将缓存数据写入磁盘,echo 3 | tee /proc/sys/vm/drop_caches
清理页缓存、目录项和inode缓存。
- 调整CPU调度策略:可以通过修改
关键部分代码示例
#!/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
注意事项:
- 上述代码中的网络接口假设为
eth0
,实际使用中需根据服务器实际网络接口调整。 - 执行某些调优操作可能需要root权限,脚本中部分命令使用
sudo
,确保运行脚本的用户有sudo
权限或提前配置好免密sudo
。 - 此脚本适用于Linux系统,不同系统版本可能在命令输出格式上有差异,需根据实际情况调整。