服务器性能基准测试脚本

代码脚本 · 基础巡检

对服务器进行全面性能基准测试,包括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"}]
性能测试基准测试CPU内存磁盘IO网络

更多基础巡检