今天在飞牛群看到有人提问飞牛能不能跑个分看看,这需求有点意思。现在电脑有跑分排行榜,手机有跑分,服务器也有跑分,有的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/ 就能看到排行榜,如果你的排名靠后,页面里看不到,那就输入你刚填写的名字,进行搜索,查看自己的排名。页面简陋,随后优化。 |