你的飞牛NAS性能如何?来跑个分看看吧~

发表于:2024-12-25 22:50:05 应用分享 447

今天在飞牛群看到有人提问飞牛能不能跑个分看看,这需求有点意思。现在电脑有跑分排行榜,手机有跑分,服务器也有跑分,有的nas也有跑分,但飞牛还没有,那就手搓一个飞牛的跑分排行榜。

#!/bin/bash

# 检查操作系统类型是否为 Debian
os_check=$(grep '^ID=' /etc/os-release | awk -F '=' '{print $2}' | tr -d '"')
if [[ "$os_check" != "debian" ]]; then
    echo "检测到非 Debian 系统。该脚本仅支持在 Debian 系统上运行。"
    exit 1
fi

# 检查是否为命令行交互式环境
if [[ ! -t 0 ]]; then
    echo "检测到非交互式环境。该脚本仅支持通过命令行运行。"
    exit 1
fi

# 获取唯一标识符
generate_unique_id() {
    if [[ -f /etc/machine-id ]]; then
        cat /etc/machine-id
    else
        cpu_info=$(lscpu | grep -m 1 "Model name" | awk -F ':' '{print $2}' | xargs)
        memory_info=$(free -h | awk '/^Mem:/ {print $2}')
        disk_info=$(lsblk -d -o NAME,SIZE,MODEL | grep -E 'disk' | md5sum | awk '{print $1}')
        echo -n "${cpu_info}_${memory_info}_${disk_info}" | md5sum | awk '{print $1}'
    fi
}

# 定义基准值(整数)
baseline_cpu=1000         # 每秒事件
baseline_memory=5000      # MiB/sec
baseline_disk_write=32000 # IOPS(4 线程)

# 定义权重(百分比)
weight_cpu=40
weight_memory=30
weight_disk_write=30

# 根据权重因子计算评分
calculate_score() {
    actual=$1
    baseline=$2
    weight=$3

    if (( actual >= baseline )); then
        base_score=$(( 1000 + (actual - baseline) * 1000 / baseline ))
    else
        base_score=$(( actual * 1000 / baseline ))
    fi

    echo $(( base_score * weight / 100 ))
}

# 检查并安装依赖
if ! command -v sysbench &> /dev/null; then
    echo "sysbench 未安装,正在安装..."
    sudo apt update
    sudo apt install -y sysbench || { echo "安装 sysbench 失败"; exit 1; }
fi

if ! command -v fio &> /dev/null; then
    echo "fio 未安装,正在安装..."
    sudo apt update
    sudo apt install -y fio || { echo "安装 fio 失败"; exit 1; }
fi

if ! command -v jq &> /dev/null; then
    echo "jq 未安装,正在安装..."
    sudo apt update
    sudo apt install -y jq || { echo "安装 jq 失败"; exit 1; }
fi

# 检查是否重复运行
last_run_file="/tmp/benchmark_last_run"
if [[ -f $last_run_file ]]; then
    last_run_time=$(cat $last_run_file)
    current_time=$(date +%s)
    if (( current_time - last_run_time < 120 )); then
        echo "检测到 2 分钟内已运行过测试,请稍后再试。"
        exit 1
    fi
fi
date +%s > $last_run_file

# 获取硬件信息
echo "================= 硬件信息 ================="
cpu_model=$(lscpu | grep "Model name" | head -n 1 | sed 's/Model name:\s*//;s/\s@.*//')  # 提取 CPU 型号
cpu_cores=$(lscpu | grep "^CPU(s):" | awk '{print $2}')
cpu_threads=$(lscpu | grep "^Thread(s) per core:" | awk '{print $4}')
memory_info=$(free -h | awk '/^Mem:/ {print $2}')  # 只提取总内存大小
unique_id=$(generate_unique_id)
echo "CPU 型号:$cpu_model"
echo "CPU 核心数:$cpu_cores"
echo "CPU 线程数:$cpu_threads"
echo "总内存:$memory_info"
echo "唯一标识符:$unique_id"
echo "========================================="

# 性能测试

# CPU 性能测试
echo "开始 CPU 性能测试..."
num_threads=$(lscpu | grep "^CPU(s):" | awk '{print $2}')
cpu_test=$(sysbench cpu --cpu-max-prime=20000 --threads=$num_threads run) || { echo "CPU 性能测试失败"; exit 1; }
cpu_events=$(echo "$cpu_test" | grep "events per second:" | awk '{print $4}')
cpu_events=$(printf "%.0f" "$cpu_events")  # 转换为整数
cpu_score=$(calculate_score $cpu_events $baseline_cpu $weight_cpu)
echo "CPU 性能测试完成,每秒事件:$cpu_events,评分:$cpu_score"

# 内存性能测试(多线程)
echo "开始内存性能测试(多线程)..."
memory_threads=4  # 定义使用的线程数
memory_test=$(sysbench memory --threads=$memory_threads run) || { echo "内存性能测试失败"; exit 1; }
memory_bandwidth=$(echo "$memory_test" | grep -oP '\(\K[0-9.]+(?= MiB/sec)')  # 提取带宽
memory_bandwidth=$(printf "%.0f" "$memory_bandwidth")  # 转换为整数
memory_score=$(calculate_score $memory_bandwidth $baseline_memory $weight_memory)
echo "内存性能测试完成,带宽:$memory_bandwidth MiB/sec,评分:$memory_score"

# 硬盘性能测试(随机写入)
echo "开始硬盘性能测试(随机写入)..."
fio_write_test=$(fio --name=write_test --ioengine=libaio --rw=randwrite --bs=4k --size=1G --num**s=8 --iodepth=32 --runtime=30s --time_based --output-format=json)
fio_write_iops=$(echo "$fio_write_test" | jq '.**s[] | .write.iops' | awk '{sum += $1} END {print int(sum)}')  # 转换为整数
disk_score=$(calculate_score $fio_write_iops $baseline_disk_write $weight_disk_write)
echo "硬盘随机写入测试完成,IOPS:$fio_write_iops,评分:$disk_score"

# 清理临时文件
rm -f write_test.*

# 计算总评分
total_score=$(awk "BEGIN {printf \"%.2f\", $cpu_score + $memory_score + $disk_score}")

# 输出测试结果
echo ""
echo "================= 测试结果 ================="
echo "CPU 每秒事件:$cpu_events,评分:$cpu_score"
echo "内存带宽:$memory_bandwidth MiB/sec,评分:$memory_score"
echo "硬盘随机写入 IOPS:$fio_write_iops,评分:$disk_score"
echo "总评分:$total_score"
echo "唯一标识符:$unique_id"
echo "==========================================="

# 提示用户是否上传评分
echo -n "是否上传评分到排行榜(输入 1 同意,0 不同意,输入后按回车键): "
read upload_choice

if [[ "$upload_choice" == "1" ]]; then
    # 输入提交人名字
    while true; do
        echo -n "请输入您的名字(不超过 10 个汉字)输入后按回车键: "
        read submitter_name
        if [[ $(echo -n "$submitter_name" | wc -m) -le 30 ]]; then
            break
        else
            echo "名字长度超过限制,请重新输入。"
        fi
    done

    # 获取一次性 Token
    token_response=$(curl -s "https://www.dadizhu.cn/api/get_token.php")
    token=$(echo "$token_response" | jq -r '.token')

    if [[ -z "$token" || "$token" == "null" ]]; then
        echo "获取 Token 失败,无法上传数据。"
        exit 1
    fi

    # 准备数据
    hardware_info=$(jq -n --arg cpu_model "$cpu_model" \
        --arg cpu_cores "$cpu_cores" \
        --arg cpu_threads "$cpu_threads" \
        --arg memory_info "$memory_info" \
        '{cpu_model: $cpu_model, cpu_cores: $cpu_cores, cpu_threads: $cpu_threads, memory_info: $memory_info}')

    payload=$(jq -n --arg submitter_name "$submitter_name" \
        --argjson hardware_info "$hardware_info" \
        --arg cpu_score "$cpu_events" \
        --arg memory_score "$memory_bandwidth" \
        --arg disk_write_score "$fio_write_iops" \
        --arg unique_id "$unique_id" \
        '{submitter_name: $submitter_name, hardware_info: $hardware_info, cpu_score: $cpu_score, memory_score: $memory_score, disk_write_score: $disk_write_score, unique_id: $unique_id}')

    # 上传数据
    response=$(curl -s -X POST -H "Content-Type: application/json" -H "X-TOKEN: $token" -d "$payload" "https://www.dadizhu.cn/api/benchmark.php")

    # 解析并检查响应
    response_status=$(echo "$response" | jq -r '.status')

    if [[ "$response_status" == "success" ]]; then
        echo "上传成功,请到 www.dadizhu.cn 查看排名。"
    else
        echo "上传失败,服务器响应: $response"
        echo "请重新测试后再尝试上传。"
    fi
else
    echo "用户选择不上传评分。"
fi

上面是跑分用的脚本,用于测试飞牛的cpu、内存、硬盘性能,并提交到跑分排行榜。脚本不含任何有害成分,也不会修改系统的任何设置,可以复制给ai,让ai检测下是否有危害性代码。

在我的文件,任意地方新建一个文件夹,或者在现有的文件夹里上传一个benchmark.sh的空白文件。空白文件可以在我的电脑任意地方右键新建txt文档,然后名字改成benchmark.sh上传到飞牛。双击打开文件,把上面的代码复制进去以后保存。右键点击文件,详细信息里复制原始路径,比如我的是/vol2/1000/python/benchmark.sh。

打开飞牛应用中心,安装gotty,安装过程中会让设置一个账号密码,用于打开gotty,不是让输入飞牛的账号密码,设置一个自己容易记住的账号密码即可。

在第一行输入你的飞牛管理员账号,然后按回车。password输入你的飞牛管理员密码,然后按回车,这里你输入的密码是不显示的,正常输入密码按回车即可。

然后输入 sudo -i,按回车。再次输入你的管理员密码。然后输入chmod +x /vol2/1000/python/benchmark.sh,把文件名修改为上一步你获取的原始路径,然后按回车键。

然后再输入/vol2/1000/python/benchmark.sh,按回车键,开始性能测试。

性能测试完成后,可以选择是否上传评分到排行榜,同意的话就按1回车,输入一个你的名字(和微信的昵称一样,不是让你输入真实姓名。),然后按回车键,这样就上传跑分到排行榜了。

然后打开https://www.dadizhu.cn/feiniupaofenpaihangbang/ 就能看到排行榜,如果你的排名靠后,页面里看不到,那就输入你刚填写的名字,进行搜索,查看自己的排名。页面简陋,随后优化。

收藏
送赞
分享

发表回复

评论列表(4)

我想问问楼主。您能看看飞牛支持睿频吗?
2024-12-26 07:30:07 回复
root@FNAS:~# chmod +x /vol1/1000/111/benchmark.sh
root@FNAS:~# /vol1/1000/111/benchmark.sh
-bash: /vol1/1000/111/benchmark.sh: cannot execute: required file not found


我这里报错了呢
2024-12-26 09:32:47 回复
文件路径不对 看下你复制路径的时候是不是选错了  详情 回复
2024-12-26 21:29
文件路径不对 看下你复制路径的时候是不是选错了
2024-12-26 21:29:21 回复
跑了硬盘0分啥情况
开始硬盘性能测试(随机写入)...
fio: unrecognized option '--num**s=8'
fio: unrecognized option '--num**s=8'
jq: error: syntax error, unexpected '*' (Unix shell quoting issues?) at <top-level>, line 1:
.**s[] | .write.iops  
jq: 1 compile error
硬盘随机写入测试完成,IOPS:0,评分:0
2024-12-28 13:10:44 回复