服务器性能测试在Linux系统中是一项重要的任务,它可以帮助你了解服务器在不同负载下的表现,从而优化服务器配置和资源分配。以下是关于Linux服务器性能测试的基础概念、优势、类型、应用场景以及常见问题的解答。
服务器性能测试通常涉及对CPU、内存、磁盘I/O、网络带宽等资源的测试。这些测试可以帮助你确定服务器的最大承载能力,以及在特定负载下的响应时间和吞吐量。
bench.sh 是一个 Linux 系统性能基准测试工具。可以快速给出服务器的整体配置信息,IO 性能,网络性能。很多人使用它测试 vps 性能。再配合 unixbench.sh 脚本测试,即可全面测试 VPS 的性能。
本地测试服务器配置:2核2G,3M带宽,40G硬盘。
测试结果
使用以下命令运行测试
wget -qO- bench.sh | bash
代码解释:
`wget`:用于从指定URL下载文件
`-qO-`:参数用于不输出下载过程信息,将文件输出到标准输出
`| bash`:将下载内容通过管道传递给bash执行
结果如下图:

bench.sh主要功能
- 系统信息检测:显示操作系统版本、内核版本等基本信息。
- CPU信息:检测CPU型号、核心数、主频等参数。
- 内存信息:显示内存总量、使用情况和swap分区信息。
- 磁盘信息:检测磁盘容量、I/O性能等指标。
- 网络测试:测试与全球多个节点之间的网络连接速度和延迟。
- 系统负载:显示当前系统负载情况
bench.sh的优势
与其他系统检测工具相比,bench.sh具有以下优势:
- 一键执行:无需安装,直接运行即可获取结果
- 全面信息:覆盖系统、硬件和网络等多个方面
- 快速高效:检测过程迅速,几分钟内即可完成
- 可读性强:输出结果清晰易懂,便于分析
- 跨平台支持:适用于多种Linux发行版
bench.sh使用方法
国外VPS云服务器
使用bench.sh脚本非常简单,只需要在终端中执行以下命令:
wget -qO- bench.sh | bash
或者
curl -Lso- bench.sh | bash
执行后,脚本会自动运行并显示系统各项信息。‘’
国内VPS云服务器
wget -qO- https://github.com/teddysun/across/raw/master/bench.sh | bash
在国内,可以从 GitHub下载脚本(https://github.com/teddysun/across/blob/master/bench.sh)到本地,或者复制下面的脚本代码,保存到 bench.sh 文件中
#!/usr/bin/env bash
#
# Description: A Bench Script by Teddysun
#
# Copyright (C) 2015 - 2025 Teddysun
# Thanks: LookBack
# URL: https://teddysun.com/444.html
# https://github.com/teddysun/across/blob/master/bench.sh
#
trap _exit INT QUIT TERM
_red() {
printf \'\\033[0;31;31m%b\\033[0m\' \"$1\"
}
_green() {
printf \'\\033[0;31;32m%b\\033[0m\' \"$1\"
}
_yellow() {
printf \'\\033[0;31;33m%b\\033[0m\' \"$1\"
}
_blue() {
printf \'\\033[0;31;36m%b\\033[0m\' \"$1\"
}
_exists() {
local cmd=\"$1\"
if eval type type >/dev/null 2>&1; then
eval type \"$cmd\" >/dev/null 2>&1
elif command >/dev/null 2>&1; then
command -v \"$cmd\" >/dev/null 2>&1
else
which \"$cmd\" >/dev/null 2>&1
fi
local rt=$?
return ${rt}
}
_exit() {
_red \"\\nThe script has been terminated. Cleaning up files...\\n\"
# clean up
rm -fr speedtest.tgz speedtest-cli benchtest_*
exit 1
}
get_opsy() {
[ -f /etc/redhat-release ] && awk \'{print $0}\' /etc/redhat-release && return
[ -f /etc/os-release ] && awk -F\'[= \"]\' \'/PRETTY_NAME/{print $3,$4,$5}\' /etc/os-release && return
[ -f /etc/lsb-release ] && awk -F\'[=\"]+\' \'/DESCRIPTION/{print $2}\' /etc/lsb-release && return
}
next() {
printf \"%-70s\\n\" \"-\" | sed \'s/\\s/-/g\'
}
speed_test() {
local nodeName=\"$2\"
if [ -z \"$1\" ];then
./speedtest-cli/speedtest --progress=no --accept-license --accept-gdpr >./speedtest-cli/speedtest.log 2>&1
else
./speedtest-cli/speedtest --progress=no --server-id=\"$1\" --accept-license --accept-gdpr >./speedtest-cli/speedtest.log 2>&1
fi
if [ $? -eq 0 ]; then
local dl_speed up_speed latency
dl_speed=$(awk \'/Download/{print $3\" \"$4}\' ./speedtest-cli/speedtest.log)
up_speed=$(awk \'/Upload/{print $3\" \"$4}\' ./speedtest-cli/speedtest.log)
latency=$(awk \'/Latency/{print $3\" \"$4}\' ./speedtest-cli/speedtest.log)
if [[ -n \"${dl_speed}\" && -n \"${up_speed}\" && -n \"${latency}\" ]]; then
printf \"\\033[0;33m%-18s\\033[0;32m%-18s\\033[0;31m%-20s\\033[0;36m%-12s\\033[0m\\n\" \" ${nodeName}\" \"${up_speed}\" \"${dl_speed}\" \"${latency}\"
fi
fi
}
speed() {
speed_test \'\' \'Speedtest.net\'
speed_test \'21541\' \'Los Angeles, US\'
speed_test \'43860\' \'Dallas, US\'
speed_test \'40879\' \'Montreal, CA\'
speed_test \'61933\' \'Paris, FR\'
speed_test \'28922\' \'Amsterdam, NL\'
speed_test \'25858\' \'Beijing, CN\'
speed_test \'24447\' \'Shanghai, CN\'
speed_test \'60572\' \'Guangzhou, CN\'
speed_test \'32155\' \'Hong Kong, CN\'
speed_test \'13623\' \'Singapore, SG\'
speed_test \'48463\' \'Tokyo, JP\'
}
io_test() {
(LANG=C dd if=/dev/zero of=benchtest_$$ bs=512k count=\"$1\" conv=fdatasync && rm -f benchtest_$$) 2>&1 | awk -F \'[,,]\' \'{io=$NF} END { print io}\' | sed \'s/^[ \\t]*//;s/[ \\t]*$//\'
}
calc_size() {
local raw=$1
local total_size=0
local num=1
local unit=\"KB\"
if ! [[ ${raw} =~ ^[0-9]+$ ]]; then
echo \"\"
return
fi
if [ \"${raw}\" -ge 1073741824 ]; then
num=1073741824
unit=\"TB\"
elif [ \"${raw}\" -ge 1048576 ]; then
num=1048576
unit=\"GB\"
elif [ \"${raw}\" -ge 1024 ]; then
num=1024
unit=\"MB\"
elif [ \"${raw}\" -eq 0 ]; then
echo \"${total_size}\"
return
fi
total_size=$(awk \'BEGIN{printf \"%.1f\", \'\"$raw\"\' / \'$num\'}\')
echo \"${total_size} ${unit}\"
}
# since calc_size converts kilobyte to MB, GB and TB
# to_kibyte converts zfs size from bytes to kilobyte
to_kibyte() {
local raw=$1
awk \'BEGIN{printf \"%.0f\", \'\"$raw\"\' / 1024}\'
}
calc_sum() {
local arr=(\"$@\")
local s
s=0
for i in \"${arr[@]}\"; do
s=$((s + i))
done
echo ${s}
}
check_virt() {
_exists \"dmesg\" && virtualx=\"$(dmesg 2>/dev/null)\"
if _exists \"dmidecode\"; then
sys_manu=\"$(dmidecode -s system-manufacturer 2>/dev/null)\"
sys_product=\"$(dmidecode -s system-product-name 2>/dev/null)\"
sys_ver=\"$(dmidecode -s system-version 2>/dev/null)\"
else
sys_manu=\"\"
sys_product=\"\"
sys_ver=\"\"
fi
if grep -qa docker /proc/1/cgroup; then
virt=\"Docker\"
elif grep -qa lxc /proc/1/cgroup; then
virt=\"LXC\"
elif grep -qa container=lxc /proc/1/environ; then
virt=\"LXC\"
elif [[ -f /proc/user_beancounters ]]; then
virt=\"OpenVZ\"
elif [[ \"${virtualx}\" == *kvm-clock* ]]; then
virt=\"KVM\"
elif [[ \"${sys_product}\" == *KVM* ]]; then
virt=\"KVM\"
elif [[ \"${sys_manu}\" == *QEMU* ]]; then
virt=\"KVM\"
elif [[ \"${cname}\" == *KVM* ]]; then
virt=\"KVM\"
elif [[ \"${cname}\" == *QEMU* ]]; then
virt=\"KVM\"
elif [[ \"${virtualx}\" == *\"VMware Virtual Platform\"* ]]; then
virt=\"VMware\"
elif [[ \"${sys_product}\" == *\"VMware Virtual Platform\"* ]]; then
virt=\"VMware\"
elif [[ \"${virtualx}\" == *\"Parallels Software International\"* ]]; then
virt=\"Parallels\"
elif [[ \"${virtualx}\" == *VirtualBox* ]]; then
virt=\"VirtualBox\"
elif [[ -e /proc/xen ]]; then
if grep -q \"control_d\" \"/proc/xen/capabilities\" 2>/dev/null; then
virt=\"Xen-Dom0\"
else
virt=\"Xen-DomU\"
fi
elif [ -f \"/sys/hypervisor/type\" ] && grep -q \"xen\" \"/sys/hypervisor/type\"; then
virt=\"Xen\"
elif [[ \"${sys_manu}\" == *\"Microsoft Corporation\"* ]]; then
if [[ \"${sys_product}\" == *\"Virtual Machine\"* ]]; then
if [[ \"${sys_ver}\" == *\"7.0\"* || \"${sys_ver}\" == *\"Hyper-V\" ]]; then
virt=\"Hyper-V\"
else
virt=\"Microsoft Virtual Machine\"
fi
fi
else
virt=\"Dedicated\"
fi
}
ipv4_info() {
local org city country region
org=\"$(wget -q -T10 -O- http://ipinfo.io/org)\"
city=\"$(wget -q -T10 -O- http://ipinfo.io/city)\"
country=\"$(wget -q -T10 -O- http://ipinfo.io/country)\"
region=\"$(wget -q -T10 -O- http://ipinfo.io/region)\"
if [[ -n \"${org}\" ]]; then
echo \" Organization : $(_blue \"${org}\")\"
fi
if [[ -n \"${city}\" && -n \"${country}\" ]]; then
echo \" Location : $(_blue \"${city} / ${country}\")\"
fi
if [[ -n \"${region}\" ]]; then
echo \" Region : $(_yellow \"${region}\")\"
fi
if [[ -z \"${org}\" ]]; then
echo \" Region : $(_red \"No ISP detected\")\"
fi
}
install_speedtest() {
if [ ! -e \"./speedtest-cli/speedtest\" ]; then
sys_bit=\"\"
local sysarch
sysarch=\"$(uname -m)\"
if [ \"${sysarch}\" = \"unknown\" ] || [ \"${sysarch}\" = \"\" ]; then
sysarch=\"$(arch)\"
fi
if [ \"${sysarch}\" = \"x86_64\" ]; then
sys_bit=\"x86_64\"
fi
if [ \"${sysarch}\" = \"i386\" ] || [ \"${sysarch}\" = \"i686\" ]; then
sys_bit=\"i386\"
fi
if [ \"${sysarch}\" = \"armv8\" ] || [ \"${sysarch}\" = \"armv8l\" ] || [ \"${sysarch}\" = \"aarch64\" ] || [ \"${sysarch}\" = \"arm64\" ]; then
sys_bit=\"aarch64\"
fi
if [ \"${sysarch}\" = \"armv7\" ] || [ \"${sysarch}\" = \"armv7l\" ]; then
sys_bit=\"armhf\"
fi
if [ \"${sysarch}\" = \"armv6\" ]; then
sys_bit=\"armel\"
fi
[ -z \"${sys_bit}\" ] && _red \"Error: Unsupported system architecture (${sysarch}).\\n\" && exit 1
url1=\"https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-${sys_bit}.tgz\"
url2=\"https://dl.lamp.sh/files/ookla-speedtest-1.2.0-linux-${sys_bit}.tgz\"
if ! wget --no-check-certificate -q -T10 -O speedtest.tgz ${url1}; then
if ! wget --no-check-certificate -q -T10 -O speedtest.tgz ${url2}; then
_red \"Error: Failed to download speedtest-cli.\\n\" && exit 1
fi
fi
mkdir -p speedtest-cli && tar zxf speedtest.tgz -C ./speedtest-cli && chmod +x ./speedtest-cli/speedtest
rm -f speedtest.tgz
fi
printf \"%-18s%-18s%-20s%-12s\\n\" \" Node Name\" \"Upload Speed\" \"Download Speed\" \"Latency\"
}
print_intro() {
echo \"-------------------- A Bench.sh Script By Teddysun -------------------\"
echo \" Version : $(_green v2025-05-08)\"
echo \" Usage : $(_red \"wget -qO- bench.sh | bash\")\"
}
# Get System information
get_system_info() {
cname=$(awk -F: \'/model name/ {name=$2} END {print name}\' /proc/cpuinfo | sed \'s/^[ \\t]*//;s/[ \\t]*$//\')
cores=$(awk -F: \'/^processor/ {core++} END {print core}\' /proc/cpuinfo)
freq=$(awk -F\'[ :]\' \'/cpu MHz/ {print $4;exit}\' /proc/cpuinfo)
ccache=$(awk -F: \'/cache size/ {cache=$2} END {print cache}\' /proc/cpuinfo | sed \'s/^[ \\t]*//;s/[ \\t]*$//\')
cpu_aes=$(grep -i \'aes\' /proc/cpuinfo)
cpu_virt=$(grep -Ei \'vmx|svm\' /proc/cpuinfo)
tram=$(
LANG=C
free | awk \'/Mem/ {print $2}\'
)
tram=$(calc_size \"$tram\")
uram=$(
LANG=C
free | awk \'/Mem/ {print $3}\'
)
uram=$(calc_size \"$uram\")
swap=$(
LANG=C
free | awk \'/Swap/ {print $2}\'
)
swap=$(calc_size \"$swap\")
uswap=$(
LANG=C
free | awk \'/Swap/ {print $3}\'
)
uswap=$(calc_size \"$uswap\")
up=$(awk \'{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60} {printf(\"%d days, %d hour %d min\\n\",a,b,c)}\' /proc/uptime)
if _exists \"w\"; then
load=$(
LANG=C
w | head -1 | awk -F\'load average:\' \'{print $2}\' | sed \'s/^[ \\t]*//;s/[ \\t]*$//\'
)
elif _exists \"uptime\"; then
load=$(
LANG=C
uptime | head -1 | awk -F\'load average:\' \'{print $2}\' | sed \'s/^[ \\t]*//;s/[ \\t]*$//\'
)
fi
opsy=$(get_opsy)
arch=$(uname -m)
if _exists \"getconf\"; then
lbit=$(getconf LONG_BIT)
else
echo \"${arch}\" | grep -q \"64\" && lbit=\"64\" || lbit=\"32\"
fi
kern=$(uname -r)
in_kernel_no_swap_total_size=$(
LANG=C
df -t simfs -t ext2 -t ext3 -t ext4 -t btrfs -t xfs -t vfat -t ntfs --total 2>/dev/null | grep total | awk \'{ print $2 }\'
)
swap_total_size=$(free -k | grep Swap | awk \'{print $2}\')
zfs_total_size=$(to_kibyte \"$(calc_sum \"$(zpool list -o size -Hp 2> /dev/null)\")\")
disk_total_size=$(calc_size $((swap_total_size + in_kernel_no_swap_total_size + zfs_total_size)))
in_kernel_no_swap_used_size=$(
LANG=C
df -t simfs -t ext2 -t ext3 -t ext4 -t btrfs -t xfs -t vfat -t ntfs --total 2>/dev/null | grep total | awk \'{ print $3 }\'
)
swap_used_size=$(free -k | grep Swap | awk \'{print $3}\')
zfs_used_size=$(to_kibyte \"$(calc_sum \"$(zpool list -o allocated -Hp 2> /dev/null)\")\")
disk_used_size=$(calc_size $((swap_used_size + in_kernel_no_swap_used_size + zfs_used_size)))
tcpctrl=$(sysctl net.ipv4.tcp_congestion_control | awk -F \' \' \'{print $3}\')
}
# Print System information
print_system_info() {
if [ -n \"$cname\" ]; then
echo \" CPU Model : $(_blue \"$cname\")\"
else
echo \" CPU Model : $(_blue \"CPU model not detected\")\"
fi
if [ -n \"$freq\" ]; then
echo \" CPU Cores : $(_blue \"$cores @ $freq MHz\")\"
else
echo \" CPU Cores : $(_blue \"$cores\")\"
fi
if [ -n \"$ccache\" ]; then
echo \" CPU Cache : $(_blue \"$ccache\")\"
fi
if [ -n \"$cpu_aes\" ]; then
echo \" AES-NI : $(_green \"\\xe2\\x9c\\x93 Enabled\")\"
else
echo \" AES-NI : $(_red \"\\xe2\\x9c\\x97 Disabled\")\"
fi
if [ -n \"$cpu_virt\" ]; then
echo \" VM-x/AMD-V : $(_green \"\\xe2\\x9c\\x93 Enabled\")\"
else
echo \" VM-x/AMD-V : $(_red \"\\xe2\\x9c\\x97 Disabled\")\"
fi
echo \" Total Disk : $(_yellow \"$disk_total_size\") $(_blue \"($disk_used_size Used)\")\"
echo \" Total Mem : $(_yellow \"$tram\") $(_blue \"($uram Used)\")\"
if [ \"$swap\" != \"0\" ]; then
echo \" Total Swap : $(_blue \"$swap ($uswap Used)\")\"
fi
echo \" System uptime : $(_blue \"$up\")\"
echo \" Load average : $(_blue \"$load\")\"
echo \" OS : $(_blue \"$opsy\")\"
echo \" Arch : $(_blue \"$arch ($lbit Bit)\")\"
echo \" Kernel : $(_blue \"$kern\")\"
echo \" TCP CC : $(_yellow \"$tcpctrl\")\"
echo \" Virtualization : $(_blue \"$virt\")\"
echo \" IPv4/IPv6 : $online\"
}
print_io_test() {
freespace=$(df -m . | awk \'NR==2 {print $4}\')
if [ -z \"${freespace}\" ]; then
freespace=$(df -m . | awk \'NR==3 {print $3}\')
fi
if [ \"${freespace}\" -gt 1024 ]; then
writemb=2048
io1=$(io_test ${writemb})
echo \" I/O Speed(1st run) : $(_yellow \"$io1\")\"
io2=$(io_test ${writemb})
echo \" I/O Speed(2nd run) : $(_yellow \"$io2\")\"
io3=$(io_test ${writemb})
echo \" I/O Speed(3rd run) : $(_yellow \"$io3\")\"
ioraw1=$(echo \"$io1\" | awk \'NR==1 {print $1}\')
[[ \"$(echo \"$io1\" | awk \'NR==1 {print $2}\')\" == \"GB/s\" ]] && ioraw1=$(awk \'BEGIN{print \'\"$ioraw1\"\' * 1024}\')
ioraw2=$(echo \"$io2\" | awk \'NR==1 {print $1}\')
[[ \"$(echo \"$io2\" | awk \'NR==1 {print $2}\')\" == \"GB/s\" ]] && ioraw2=$(awk \'BEGIN{print \'\"$ioraw2\"\' * 1024}\')
ioraw3=$(echo \"$io3\" | awk \'NR==1 {print $1}\')
[[ \"$(echo \"$io3\" | awk \'NR==1 {print $2}\')\" == \"GB/s\" ]] && ioraw3=$(awk \'BEGIN{print \'\"$ioraw3\"\' * 1024}\')
ioall=$(awk \'BEGIN{print \'\"$ioraw1\"\' + \'\"$ioraw2\"\' + \'\"$ioraw3\"\'}\')
ioavg=$(awk \'BEGIN{printf \"%.1f\", \'\"$ioall\"\' / 3}\')
echo \" I/O Speed(average) : $(_yellow \"$ioavg MB/s\")\"
else
echo \" $(_red \"Not enough space for I/O Speed test!\")\"
fi
}
print_end_time() {
end_time=$(date +%s)
time=$((end_time - start_time))
if [ ${time} -gt 60 ]; then
min=$((time / 60))
sec=$((time % 60))
echo \" Finished in : ${min} min ${sec} sec\"
else
echo \" Finished in : ${time} sec\"
fi
date_time=$(date \'+%Y-%m-%d %H:%M:%S %Z\')
echo \" Timestamp : $date_time\"
}
! _exists \"wget\" && _red \"Error: wget command not found.\\n\" && exit 1
! _exists \"free\" && _red \"Error: free command not found.\\n\" && exit 1
# check for curl/wget
_exists \"curl\" && local_curl=true
# test if the host has IPv4/IPv6 connectivity
[[ -n ${local_curl} ]] && ip_check_cmd=\"curl -s -m 4\" || ip_check_cmd=\"wget -qO- -T 4\"
ipv4_check=$( (ping -4 -c 1 -W 4 ipv4.google.com >/dev/null 2>&1 && echo true) || ${ip_check_cmd} -4 icanhazip.com 2> /dev/null)
ipv6_check=$( (ping -6 -c 1 -W 4 ipv6.google.com >/dev/null 2>&1 && echo true) || ${ip_check_cmd} -6 icanhazip.com 2> /dev/null)
if [[ -z \"$ipv4_check\" && -z \"$ipv6_check\" ]]; then
_yellow \"Warning: Both IPv4 and IPv6 connectivity were not detected.\\n\"
fi
[[ -z \"$ipv4_check\" ]] && online=\"$(_red \"\\xe2\\x9c\\x97 Offline\")\" || online=\"$(_green \"\\xe2\\x9c\\x93 Online\")\"
[[ -z \"$ipv6_check\" ]] && online+=\" / $(_red \"\\xe2\\x9c\\x97 Offline\")\" || online+=\" / $(_green \"\\xe2\\x9c\\x93 Online\")\"
start_time=$(date +%s)
get_system_info
check_virt
clear
print_intro
next
print_system_info
ipv4_info
next
print_io_test
next
install_speedtest && speed && rm -fr speedtest-cli
next
print_end_time
next
bench.sh文件赋予执行权限(chmod +x bench.sh),然后执行脚本./bench.sh
chmod +x bench.sh ./bench.sh
注意事项
使用bench.sh脚本时,请注意以下几点:
- 确保有足够的权限执行脚本
- 网络测试可能会消耗一定流量,请在合适的环境下运行
- 定期运行脚本可以帮助监控系统性能变化
结语
bench.sh脚本是一个便捷而强大的Linux系统信息检测工具。通过使用这个一键测试脚本,系统管理员可以快速获取服务器的各项重要信息,为优化系统性能和解决潜在问题提供有力支持。无论是日常维护还是故障排查,bench.sh都是一个值得收藏的实用工具。







