echo "====== 每日平均资源使用率 ======"
find /var/log/sa/sa[0-9]* -mtime -90 | sort | while read FILE; do
DATE=$(stat -c %y "$FILE" | cut -d' ' -f1)
# CPU
CPU_AVG=$(sar -u -f "$FILE" 2>/dev/null | awk '
{sum+=100-$NF; count++}
END {printf "%.1f", sum/count}
')
# 内存
MEM_AVG=$(sar -r -f "$FILE" 2>/dev/null | awk '
/kbmemused/ {for(i=1;i<=NF;i++) if($i=="%memused") col=i}
/^[0-9]/ && $col~/^[0-9]/ {sum+=$col; count++}
END {printf "%.1f", sum/count}
')
echo "$DATE | CPU平均: ${CPU_AVG}% | 内存平均: ${MEM_AVG}%"
done
echo "====== 90天内真实CPU/内存峰值 ======"
find /var/log/sa/sa[0-9]* -mtime -90 -exec sh -c '
FILE="$1"
DATE=$(date -d @$(stat -c %Y "$FILE") +%F)
# CPU峰值(严格校验数据)
CPU=$(sar -u -f "$FILE" 2>/dev/null | awk '\''
BEGIN {max=0}
/^[0-9]/ && $8 ~ /^[0-9]/ { # 第8列为%idle(根据实际调整)
usage = 100 - $8
if (usage > max && usage <= 100) {
max = usage
time = $1
}
}
END {if (max > 0) printf "%s %.1f%%", time, max}
'\'')
# 内存峰值
MEM=$(sar -r -f "$FILE" 2>/dev/null | awk '\''
BEGIN {max=0}
/kbmemused/ {for(i=1;i<=NF;i++) if($i=="%memused") col=i}
/^[0-9]/ && $col ~ /^[0-9]/ {
if ($col > max && $col <= 100) {
max = $col
time = $1
}
}
END {if (max > 0) printf "%s %.1f%%", time, max}
'\'')
# 只输出有数据的行
if [ -n "$CPU" ] || [ -n "$MEM" ]; then
echo "$DATE | CPU峰值: ${CPU:-无数据} | 内存峰值: ${MEM:-无数据}"
fi
' sh {} \; | sort -t'|' -k3 -rn
echo "====== 历史资源总平均使用率 ======"
# CPU
find /var/log/sa/sa[0-9]* -exec sar -u -f {} \; 2>/dev/null |
awk '{sum+=100-$NF; count++} END {printf "CPU: %.1f%%\n", sum/count}'
# 内存
find /var/log/sa/sa[0-9]* -exec sar -r -f {} \; 2>/dev/null |
awk '
/kbmemused/ {for(i=1;i<=NF;i++) if($i=="%memused") col=i}
/^[0-9]/ && $col~/^[0-9]/ {sum+=$col; count++}
END {printf "内存: %.1f%%\n", sum/count}
'
# Swap
find /var/log/sa/sa[0-9]* -exec sar -S -f {} \; 2>/dev/null |
awk '
/kbswpused/ {for(i=1;i<=NF;i++) if($i=="%swpused") col=i}
/^[0-9]/ && $col~/^[0-9]/ {sum+=$col; count++}
END {printf "Swap: %.1f%%\n", sum/count}
'