Linux系统性能分析与优化建议
全面分析Linux系统性能指标(CPU、内存、磁盘IO、网络),识别瓶颈并给出优化建议
详细内容
#!/bin/bash
# ==========================================
# Linux系统性能分析与优化建议
# 用途:全面分析系统性能,识别瓶颈,给出优化建议
# 使用方法:bash system_perf_analysis.sh
# ==========================================
echo "========== 系统性能分析报告 =========="
echo "分析时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "主机名: $(hostname)"
echo "系统: $(uname -r)"
echo ""
# 1. CPU分析
echo "【1. CPU性能分析】"
CPU_CORES=$(nproc)
CPU_LOAD=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | sed 's/,//')
LOAD_PER_CORE=$(echo "scale=2; $CPU_LOAD / $CPU_CORES" | bc)
echo " CPU核心数: $CPU_CORES"
echo " 1分钟平均负载: $CPU_LOAD"
echo " 每核负载: $LOAD_PER_CORE"
if (( $(echo "$LOAD_PER_CORE > 0.7" | bc -l) )); then
echo " ⚠️ CPU负载较高,建议:"
echo " - 检查高CPU占用进程: ps aux --sort=-%cpu | head -10"
echo " - 考虑升级CPU或增加核心数"
echo " - 优化应用程序,减少CPU密集型操作"
else
echo " ✅ CPU负载正常"
fi
# CPU使用率
CPU_IDLE=$(top -bn1 | grep "Cpu(s)" | awk '{print $8}' | sed 's/%id,//')
CPU_USAGE=$(echo "scale=1; 100 - $CPU_IDLE" | bc)
echo " CPU使用率: ${CPU_USAGE}%"
echo ""
# 2. 内存分析
echo "【2. 内存性能分析】"
MEM_TOTAL=$(free -m | awk 'NR==2{print $2}')
MEM_USED=$(free -m | awk 'NR==2{print $3}')
MEM_AVAILABLE=$(free -m | awk 'NR==2{print $7}')
MEM_USAGE_PCT=$(echo "scale=1; $MEM_USED * 100 / $MEM_TOTAL" | bc)
echo " 总内存: ${MEM_TOTAL}MB"
echo " 已使用: ${MEM_USED}MB"
echo " 可用: ${MEM_AVAILABLE}MB"
echo " 使用率: ${MEM_USAGE_PCT}%"
if (( $(echo "$MEM_USAGE_PCT > 85" | bc -l) )); then
echo " ⚠️ 内存使用率较高,建议:"
echo " - 检查高内存占用进程: ps aux --sort=-%mem | head -10"
echo " - 考虑增加内存"
echo " - 检查是否有内存泄漏"
echo " - 调整swappiness参数: sysctl vm.swappiness=10"
else
echo " ✅ 内存使用正常"
fi
# Swap使用
SWAP_TOTAL=$(free -m | awk 'NR==3{print $2}')
SWAP_USED=$(free -m | awk 'NR==3{print $3}')
if [ "$SWAP_TOTAL" -gt 0 ]; then
SWAP_PCT=$(echo "scale=1; $SWAP_USED * 100 / $SWAP_TOTAL" | bc)
echo " Swap使用率: ${SWAP_PCT}%"
if (( $(echo "$SWAP_PCT > 50" | bc -l) )); then
echo " ⚠️ Swap使用较多,可能存在内存压力"
fi
fi
echo ""
# 3. 磁盘IO分析
echo "【3. 磁盘IO性能分析】"
if command -v iostat &> /dev/null; then
echo " 磁盘IO统计 (iostat):"
iostat -dx 1 2 | tail -n +4 | head -n 10 | awk '{printf " %-15s 读: %-8s 写: %-8s 利用率: %s%%
", $1, $6, $7, $14}'
else
echo " ⚠️ iostat未安装,建议安装sysstat: yum install sysstat"
fi
# 磁盘空间
echo " 磁盘空间使用:"
df -h | grep -v tmpfs | grep -v devtmpfs | awk 'NR>1{printf " %-20s 使用率: %-6s 可用: %s
", $6, $5, $4}'
echo ""
# 4. 网络分析
echo "【4. 网络性能分析】"
if command -v ss &> /dev/null; then
TCP_CONN=$(ss -s | grep 'TCP:' | awk '{print $2}')
echo " TCP连接数: $TCP_CONN"
echo " 监听端口:"
ss -tlnp | grep LISTEN | awk '{printf " %-20s %s
", $4, $6}' | head -10
fi
# 网络流量
if command -v ifstat &> /dev/null; then
echo " 网络流量 (ifstat):"
ifstat 1 1 2>/dev/null | tail -3
fi
echo ""
# 5. 优化建议汇总
echo "【5. 系统优化建议汇总】"
echo " 1. 文件描述符限制:"
CURRENT_ULIMIT=$(ulimit -n)
echo " 当前: $CURRENT_ULIMIT,建议: 65535"
if [ "$CURRENT_ULIMIT" -lt 65535 ]; then
echo " → 修改 /etc/security/limits.conf 添加: * soft nofile 65535"
fi
echo " 2. 内核参数优化:"
echo " → net.core.somaxconn = 65535 (提高连接队列)"
echo " → net.ipv4.tcp_max_syn_backlog = 65535"
echo " → vm.swappiness = 10 (减少swap使用)"
echo " → fs.file-max = 1000000 (系统级文件描述符)"
echo " 3. 定时任务:"
echo " → 建议配置定时性能监控,记录历史数据"
echo " → 定期清理日志文件,避免磁盘占满"
echo ""
echo "========== 分析完成 =========="
适配环境
适配系统:CentOS 7+,Ubuntu 18.04+,Debian 10+
依赖环境:bash 4.0+
参数说明
[]