服务器性能基准测试脚本
对服务器进行全面性能基准测试,包括CPU、内存、磁盘IO、网络带宽,输出性能评分和对比报告
详细内容
#!/bin/bash
# ==========================================
# 服务器性能基准测试脚本
# 用途:测试CPU、内存、磁盘IO、网络性能,输出性能评分
# 使用方法:bash performance_test.sh
# ==========================================
echo "========== 服务器性能基准测试 =========="
echo "测试时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "主机名: $(hostname)"
echo "系统: $(uname -a | cut -d' ' -f1-3)"
echo ""
# 检查是否为root
if [ "$EUID" -ne 0 ]; then
echo "⚠️ 建议使用root用户运行以获得更准确的测试结果"
echo ""
fi
TOTAL_SCORE=0
TEST_COUNT=0
# 1. 系统信息
echo "【1. 系统信息】"
echo " CPU型号: $(grep 'model name' /proc/cpuinfo | head -1 | cut -d: -f2 | xargs)"
echo " CPU核心数: $(nproc)"
echo " CPU频率: $(grep 'cpu MHz' /proc/cpuinfo | head -1 | cut -d: -f2 | xargs) MHz"
echo " 总内存: $(free -h | awk '/^Mem:/ {print $2}')"
echo " Swap: $(free -h | awk '/^Swap:/ {print $2}')"
echo " 磁盘: $(df -h / | tail -1 | awk '{print $2}')"
echo " 内核版本: $(uname -r)"
echo " 系统版本: $(cat /etc/os-release 2>/dev/null | grep PRETTY_NAME | cut -d= -f2 | tr -d '"')"
echo ""
# 2. CPU性能测试
echo "【2. CPU性能测试】"
echo " 测试: 计算PI到5000位..."
START_TIME=$(date +%s.%N)
echo "scale=5000; 4*a(1)" | bc -l > /dev/null 2>&1
END_TIME=$(date +%s.%N)
CPU_TIME=$(echo "$END_TIME - $START_TIME" | bc)
echo " 耗时: ${CPU_TIME}秒"
# 评分(耗时越短分数越高)
CPU_SCORE=$(echo "scale=1; 100 - ($CPU_TIME - 5) * 5" | bc)
CPU_SCORE=$(echo "if ($CPU_SCORE < 0) 0 else if ($CPU_SCORE > 100) 100 else $CPU_SCORE" | bc)
echo " CPU评分: ${CPU_SCORE}/100"
TOTAL_SCORE=$(echo "$TOTAL_SCORE + $CPU_SCORE" | bc)
TEST_COUNT=$((TEST_COUNT + 1))
echo ""
# 3. 内存性能测试
echo "【3. 内存性能测试】"
echo " 测试: 内存读写速度..."
# 内存写入测试
if command -v dd &> /dev/null; then
START_TIME=$(date +%s.%N)
dd if=/dev/zero of=/dev/shm/memtest bs=1M count=512 2>/dev/null
END_TIME=$(date +%s.%N)
MEM_WRITE_TIME=$(echo "$END_TIME - $START_TIME" | bc)
MEM_WRITE_SPEED=$(echo "scale=1; 512 / $MEM_WRITE_TIME" | bc)
echo " 写入速度: ${MEM_WRITE_SPEED} MB/s"
# 内存读取测试
START_TIME=$(date +%s.%N)
dd if=/dev/shm/memtest of=/dev/null bs=1M 2>/dev/null
END_TIME=$(date +%s.%N)
MEM_READ_TIME=$(echo "$END_TIME - $START_TIME" | bc)
MEM_READ_SPEED=$(echo "scale=1; 512 / $MEM_READ_TIME" | bc)
echo " 读取速度: ${MEM_READ_SPEED} MB/s"
rm -f /dev/shm/memtest
# 评分
MEM_AVG_SPEED=$(echo "scale=1; ($MEM_WRITE_SPEED + $MEM_READ_SPEED) / 2" | bc)
MEM_SCORE=$(echo "scale=1; $MEM_AVG_SPEED / 10" | bc)
MEM_SCORE=$(echo "if ($MEM_SCORE > 100) 100 else $MEM_SCORE" | bc)
echo " 内存评分: ${MEM_SCORE}/100"
TOTAL_SCORE=$(echo "$TOTAL_SCORE + $MEM_SCORE" | bc)
TEST_COUNT=$((TEST_COUNT + 1))
else
echo " ⚠️ dd命令不可用,跳过内存测试"
fi
echo ""
# 4. 磁盘IO性能测试
echo "【4. 磁盘IO性能测试】"
TEST_DIR="${TEST_DIR:-/tmp}"
echo " 测试目录: $TEST_DIR"
# 磁盘写入测试
echo " 测试: 顺序写入..."
START_TIME=$(date +%s.%N)
dd if=/dev/zero of="$TEST_DIR/disk_test" bs=1M count=1024 oflag=direct 2>/dev/null
END_TIME=$(date +%s.%N)
DISK_WRITE_TIME=$(echo "$END_TIME - $START_TIME" | bc)
DISK_WRITE_SPEED=$(echo "scale=1; 1024 / $DISK_WRITE_TIME" | bc)
echo " 写入速度: ${DISK_WRITE_SPEED} MB/s"
# 磁盘读取测试
echo " 测试: 顺序读取..."
START_TIME=$(date +%s.%N)
dd if="$TEST_DIR/disk_test" of=/dev/null bs=1M iflag=direct 2>/dev/null
END_TIME=$(date +%s.%N)
DISK_READ_TIME=$(echo "$END_TIME - $START_TIME" | bc)
DISK_READ_SPEED=$(echo "scale=1; 1024 / $DISK_READ_TIME" | bc)
echo " 读取速度: ${DISK_READ_SPEED} MB/s"
rm -f "$TEST_DIR/disk_test"
# 评分
DISK_AVG_SPEED=$(echo "scale=1; ($DISK_WRITE_SPEED + $DISK_READ_SPEED) / 2" | bc)
DISK_SCORE=$(echo "scale=1; $DISK_AVG_SPEED / 5" | bc)
DISK_SCORE=$(echo "if ($DISK_SCORE > 100) 100 else $DISK_SCORE" | bc)
echo " 磁盘评分: ${DISK_SCORE}/100"
TOTAL_SCORE=$(echo "$TOTAL_SCORE + $DISK_SCORE" | bc)
TEST_COUNT=$((TEST_COUNT + 1))
echo ""
# 5. 网络性能测试
echo "【5. 网络性能测试】"
echo " 测试: 网络延迟和带宽..."
# 延迟测试
PING_TARGET="${PING_TARGET:-www.baidu.com}"
if command -v ping &> /dev/null; then
PING_RESULT=$(ping -c 10 -W 2 "$PING_TARGET" 2>/dev/null)
if echo "$PING_RESULT" | grep -q "0 received"; then
echo " ⚠️ 无法ping通 $PING_TARGET"
else
AVG_LATENCY=$(echo "$PING_RESULT" | grep "rtt min" | awk -F'/' '{print $5}')
PACKET_LOSS=$(echo "$PING_RESULT" | grep "packet loss" | awk '{print $6}' | tr -d '%')
echo " 平均延迟: ${AVG_LATENCY}ms"
echo " 丢包率: ${PACKET_LOSS}%"
# 评分
NET_SCORE=$(echo "scale=1; 100 - $AVG_LATENCY" | bc)
NET_SCORE=$(echo "if ($NET_SCORE < 0) 0 else if ($NET_SCORE > 100) 100 else $NET_SCORE" | bc)
echo " 网络评分: ${NET_SCORE}/100"
TOTAL_SCORE=$(echo "$TOTAL_SCORE + $NET_SCORE" | bc)
TEST_COUNT=$((TEST_COUNT + 1))
fi
else
echo " ⚠️ ping命令不可用,跳过网络测试"
fi
echo ""
# 6. 综合评分
echo "【6. 综合性能评分】"
if [ "$TEST_COUNT" -gt 0 ]; then
AVG_SCORE=$(echo "scale=1; $TOTAL_SCORE / $TEST_COUNT" | bc)
echo " 总评分: ${AVG_SCORE}/100"
echo " 测试项目数: $TEST_COUNT"
echo ""
if (( $(echo "$AVG_SCORE >= 90" | bc -l) )); then
echo " 🏆 性能等级: 优秀"
echo " 服务器性能出色,适合高负载生产环境"
elif (( $(echo "$AVG_SCORE >= 75" | bc -l) )); then
echo " 🥈 性能等级: 良好"
echo " 服务器性能良好,可满足大部分业务需求"
elif (( $(echo "$AVG_SCORE >= 60" | bc -l) )); then
echo " 🥉 性能等级: 一般"
echo " 服务器性能一般,建议优化或升级硬件"
else
echo " ⚠️ 性能等级: 较差"
echo " 服务器性能较差,建议升级硬件或优化配置"
fi
else
echo " 无有效测试结果"
fi
echo ""
# 7. 优化建议
echo "【7. 优化建议】"
echo " CPU优化:"
echo " - 检查是否有高CPU占用进程: top / htop"
echo " - 考虑使用任务调度: nice / renice"
echo " - 高并发场景考虑负载均衡"
echo ""
echo " 内存优化:"
echo " - 检查内存使用: free -m / vmstat"
echo " - 调整Swappiness: sysctl vm.swappiness=10"
echo " - 大内存应用考虑使用 HugePages"
echo ""
echo " 磁盘优化:"
echo " - 使用SSD替代HDD"
echo " - 调整IO调度器: cat /sys/block/sda/queue/scheduler"
echo " - 数据库场景考虑RAID10"
echo ""
echo " 网络优化:"
echo " - 调整TCP参数: sysctl net.core.somaxconn=65535"
echo " - 开启TCP BBR: sysctl net.ipv4.tcp_congestion_control=bbr"
echo " - 高带宽场景考虑网卡绑定"
echo ""
echo "========== 测试完成 =========="
适配环境
适配系统:CentOS 7+,Ubuntu 18.04+,Debian 10+
依赖环境:bash 4.0+
参数说明
[{"name": "TEST_DIR", "label": "\u78c1\u76d8\u6d4b\u8bd5\u76ee\u5f55", "default": "/tmp"}, {"name": "PING_TARGET", "label": "\u7f51\u7edc\u6d4b\u8bd5\u76ee\u6807", "default": "www.baidu.com"}]