分享一個可以測試離線服務器性能的腳本

在日常運維工作中,經常會遇到系統性能莫名跟不上業務需求的情況:服務器響應變慢、應用加載卡頓、資源占用異常飆升等問題頻繁出現,卻難以快速問題根源究竟在CPU過載、內存泄漏、磁盤I/O阻塞還是網絡帶寬瓶頸。這種時候,特別需要一個全面的性能檢測腳本來系統排查——既能實時監控CPU使用率、核心負載、內存占用、swap交換分區等基礎資源指標,又能深入分析磁盤讀寫速度、分區使用率、網絡吞吐量及連接狀態,還能自動比對預設閾值標記異常項,最終生成直觀的檢測報告,幫助快速定位性能瓶頸,為優化系統配置、提升運維效率提供精準依據。

腳本內容:

vi linux_speed_ceshi.sh
添加以下內容
#!/usr/bin/env bash
#
# Description: Offline Server Performance Test with Network Benchmark
# Author: Teddysun (Enhanced for offline use)
# Copyright: (C) 2015 - 2023 Teddysun <i@teddysun.com>
# Modified: 2025-08-01 (No netcat dependency, fixed floating point errors)
#
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"command -v "$cmd" >/dev/null 2>&1
}# 退出清理
_exit() {_red "\nScript terminated. Cleaning up...\n"rm -rf benchtest_* network_test# 清理可能的后臺進程if [ -n "$transfer_pid" ]; thenkill $transfer_pid 2>/dev/nullfiexit 1
}# 分隔線
next() {printf "%-70s\n" "-" | sed 's/\s/-/g'
}# 獲取操作系統信息
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
}# 磁盤I/O測試
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=$1local total_size=0local num=1local unit="KB"# 使用awk處理浮點數比較if awk -v raw="$raw" 'BEGIN { exit !(raw >= 1073741824) }'; thennum=1073741824unit="TB"elif awk -v raw="$raw" 'BEGIN { exit !(raw >= 1048576) }'; thennum=1048576unit="GB"elif awk -v raw="$raw" 'BEGIN { exit !(raw >= 1024) }'; thennum=1024unit="MB"elif [ "$raw" -eq 0 ]; thenecho "0"returnfitotal_size=$(awk -v raw="$raw" -v num="$num" 'BEGIN{printf "%.1f", raw / num}')echo "${total_size} ${unit}"
}# 速度單位轉換 (Mbps)
calc_bandwidth() {local mbps=$1local total=0local num=1local unit="Mbps"# 使用awk處理浮點數比較if awk -v mbps="$mbps" 'BEGIN { exit !(mbps >= 1000) }'; thennum=1000unit="Gbps"elif [ "$mbps" -eq 0 ]; thenecho "0"returnfitotal=$(awk -v mbps="$mbps" -v num="$num" 'BEGIN{printf "%.2f", mbps / num}')echo "${total} ${unit}"
}# 虛擬化檢測
check_virt() {virt="Unknown"_exists "dmesg" && virtualx="$(dmesg 2>/dev/null)"# Docker/LXC 檢測grep -qa docker /proc/1/cgroup && virt="Docker"grep -qa lxc /proc/1/cgroup && virt="LXC"grep -qa container=lxc /proc/1/environ && virt="LXC"# 其他虛擬化技術[[ -f /proc/user_beancounters ]] && virt="OpenVZ"[[ "${virtualx}" == *kvm-clock* ]] && virt="KVM"[[ "${sys_product}" == *KVM* ]] && virt="KVM"[[ "${cname}" == *KVM* ]] && virt="KVM"[[ "${cname}" == *QEMU* ]] && virt="KVM"[[ "${virtualx}" == *"VMware Virtual Platform"* ]] && virt="VMware"[[ "${sys_product}" == *"VMware Virtual Platform"* ]] && virt="VMware"[[ "${virtualx}" == *"Parallels Software International"* ]] && virt="Parallels"[[ "${virtualx}" == *VirtualBox* ]] && virt="VirtualBox"[[ -e /proc/xen ]] && virt="Xen"[[ "${sys_manu}" == *"Microsoft Corporation"* && "${sys_product}" == *"Virtual Machine"* ]] && {[[ "${sys_ver}" == *"7.0"* || "${sys_ver}" == *"Hyper-V" ]] && virt="Hyper-V" || virt="Microsoft Virtual Machine"}[[ "$virt" == "Unknown" ]] && virt="Dedicated"
}# 獲取系統信息
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=$(free -b | awk '/Mem/ {print $2}')tram=$(calc_size $tram)uram=$(free -b | awk '/Mem/ {print $3}')uram=$(calc_size $uram)swap=$(free -b | awk '/Swap/ {print $2}')swap=$(calc_size $swap)uswap=$(free -b | 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 "uptime"; thenload=$(uptime | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//')elseload="N/A"fi# 系統信息opsy=$(get_opsy)arch=$(uname -m)lbit=$(getconf LONG_BIT 2>/dev/null || echo ${arch} | grep -q "64" && echo 64 || echo 32)kern=$(uname -r)# 磁盤信息disk_total_size=$(df -t simfs -t ext2 -t ext3 -t ext4 -t btrfs -t xfs -t vfat -t ntfs -t swap --total -B1 2>/dev/null | grep total | awk '{ print $2 }')disk_total_size=$(calc_size $disk_total_size)disk_used_size=$(df -t simfs -t ext2 -t ext3 -t ext4 -t btrfs -t xfs -t vfat -t ntfs -t swap --total -B1 2>/dev/null | grep total | awk '{ print $3 }')disk_used_size=$(calc_size $disk_used_size)# 網絡參數tcpctrl=$(sysctl net.ipv4.tcp_congestion_control 2>/dev/null | awk -F ' ' '{print $3}')# 網絡接口檢測network_interfaces=($(ip link show | awk -F': ' '/^[0-9]+: [^lo]/ {print $2}'))# 網絡接口詳細信息declare -A iface_infofor iface in "${network_interfaces[@]}"; doip_addr=$(ip addr show dev $iface | awk '/inet / {print $2}' | cut -d'/' -f1 | head -n1)mac_addr=$(ip link show dev $iface | awk '/link\/ether/ {print $2}')speed=$(ethtool $iface 2>/dev/null | awk '/Speed:/ {print $2}')iface_info["${iface}_ip"]=$ip_addriface_info["${iface}_mac"]=$mac_addriface_info["${iface}_speed"]=$speeddone
}# 增強的磁盤I/O測試
enhanced_io_test() {local freespace=$(df -m . | awk 'NR==2 {print $4; exit}')[[ -z "$freespace" ]] && freespace=$(df -m . | awk 'NR==3 {print $3; exit}')if awk -v fs="$freespace" 'BEGIN { exit !(fs > 1024) }'; thenlocal test_sizes=(256 512 1024 2048)local test_results=()local test_names=("Small Files (256MB)" "Medium Files (512MB)" "Large Files (1024MB)" "Very Large Files (2048MB)")echo " Performing Enhanced I/O Speed Tests..."for i in "${!test_sizes[@]}"; dosize=${test_sizes[$i]}if awk -v fs="$freespace" -v sz="$size" 'BEGIN { exit !(fs < sz * 2) }'; then_yellow " Skipping ${size}MB test - insufficient space"continuefiresult=$(io_test $((size / 512 * 2)))test_results+=("$result")echo " ${test_names[$i]} : $(_yellow "$result")"done# 計算平均值local total=0local count=0for res in "${test_results[@]}"; dospeed=$(echo $res | awk '{print $1}')total=$(awk -v t="$total" -v s="$speed" 'BEGIN{printf "%.1f", t + s}')((count++))doneif [ $count -gt 0 ]; thenlocal avg=$(awk -v t="$total" -v c="$count" 'BEGIN{printf "%.1f", t / c}')echo " Average I/O Speed  : $(_yellow "$avg MB/s")"fielseecho " $(_red "Insufficient disk space for I/O tests!")"fi
}# CPU性能測試
cpu_benchmark() {echo " Running CPU Benchmark (Single Thread)..."local start=$(date +%s)local result=$(dd if=/dev/zero bs=1M count=1000 2>/dev/null | sha256sum)local end=$(date +%s)local duration=$((end - start))if [ $duration -eq 0 ]; thenduration=1filocal speed=$(awk -v cnt="1000" -v dur="$duration" 'BEGIN{printf "%.2f", cnt / dur}')echo " SHA256 Hash Speed  : $(_yellow "${speed} MB/s")"echo " Running CPU Benchmark (Multi Thread)..."local cores=$(( $(nproc) ))start=$(date +%s)for ((i=0; i<cores; i++)); dodd if=/dev/zero bs=1M count=1000 2>/dev/null | sha256sum >/dev/null &donewaitend=$(date +%s)duration=$((end - start))if [ $duration -eq 0 ]; thenduration=1fispeed=$(awk -v cnt="1000" -v cores="$cores" -v dur="$duration" 'BEGIN{printf "%.2f", (cnt * cores) / dur}')echo " Multi-Thread Speed : $(_yellow "${speed} MB/s") ($cores cores)"
}# 內存性能測試
memory_benchmark() {echo " Running Memory Benchmark..."# 分配內存并測試寫入速度local mem_size=$(( $(free -m | awk '/Mem/{print $7}') / 2 ))if [ $mem_size -gt 2048 ]; thenmem_size=2048elif [ $mem_size -lt 100 ]; thenmem_size=100fiecho " Testing ${mem_size}MB memory block..."# 寫入速度測試local start=$(date +%s.%N)dd if=/dev/zero of=/dev/shm/memtest bs=1M count=$mem_size conv=fdatasync 2>/dev/nulllocal end=$(date +%s.%N)local duration=$(awk -v s="$start" -v e="$end" 'BEGIN{printf "%.6f", e - s}')local write_speed=$(awk -v sz="$mem_size" -v dur="$duration" 'BEGIN{printf "%.1f", sz / dur}')# 讀取速度測試start=$(date +%s.%N)dd if=/dev/shm/memtest of=/dev/null bs=1M count=$mem_size 2>/dev/nullend=$(date +%s.%N)duration=$(awk -v s="$start" -v e="$end" 'BEGIN{printf "%.6f", e - s}')local read_speed=$(awk -v sz="$mem_size" -v dur="$duration" 'BEGIN{printf "%.1f", sz / dur}')# 清理rm -f /dev/shm/memtestecho " Write Speed        : $(_yellow "${write_speed} MB/s")"echo " Read Speed         : $(_yellow "${read_speed} MB/s")"
}# 使用socat或bash內置功能創建網絡服務器
start_network_server() {local port=$1local output_file=$2if _exists "socat"; thensocat TCP4-LISTEN:$port,bind=0.0.0.0 OPEN:$output_file,creat,append &return $!elif _exists "bash" && [[ $(bash --version | awk 'NR==1 {print $4}' | cut -d'(' -f1) > "4.3" ]]; then# 使用bash 4.3+的內置TCP監聽功能cat >&"${net_fd}" > "$output_file" &return $!elsereturn 1fi
}# 增強的網絡吞吐量測試(不依賴nc)
network_throughput_test() {local iface=$1local duration=${2:-10}  # 默認測試10秒echo " Running Network Throughput Test on $iface for $duration seconds..."# 檢查是否支持ethtoolif _exists "ethtool"; thenlocal speed=$(ethtool $iface 2>/dev/null | awk '/Speed:/ {print $2}')if [ -n "$speed" ]; thenecho " Interface Rated Speed: $(_blue "$speed")"fifi# 準備網絡測試環境local port=$((RANDOM % 1000 + 5000))  # 隨機端口local temp_file=$(mktemp)local transfer_pid=""# 檢查網絡工具可用性if ! _exists "socat" && ! ( _exists "bash" && [[ $(bash --version | awk 'NR==1 {print $4}' | cut -d'(' -f1) > "4.3" ]] ); then_red " No suitable network tools found (socat or bash 4.3+ required). Skipping test."rm -f "$temp_file"return 1fi# 為bash內置TCP功能準備文件描述符if _exists "bash" && [[ $(bash --version | awk 'NR==1 {print $4}' | cut -d'(' -f1) > "4.3" ]]; thenexec {net_fd}<>/dev/tcp/0.0.0.0/$portfi# 啟動接收端start_network_server $port "$temp_file"local server_pid=$!sleep 2  # 等待接收端準備好if ! ps -p $server_pid > /dev/null; then_red " Failed to start network server. Skipping test."rm -f "$temp_file"return 1fi# 獲取接口IPlocal ip=$(ip addr show dev $iface | awk '/inet / {print $2}' | cut -d'/' -f1 | head -n1)if [ -z "$ip" ]; then_red " No IP address found for interface $iface"kill $server_pid 2>/dev/nullrm -f "$temp_file"return 1fi# 啟動發送端,持續指定時間(sleep $duration; pkill -P $$ dd) &local killer_pid=$!dd if=/dev/zero bs=1M 2>/dev/null | {if _exists "socat"; thensocat - TCP4:$ip:$portelsecat >/dev/tcp/$ip/$portfi} >/dev/null 2>&1 &transfer_pid=$!# 等待測試完成wait $killer_pid 2>/dev/nullsleep 1kill $server_pid 2>/dev/nullkill $transfer_pid 2>/dev/null 2>/dev/null# 關閉bash網絡文件描述符if _exists "bash" && [[ $(bash --version | awk 'NR==1 {print $4}' | cut -d'(' -f1) > "4.3" ]]; thenexec {net_fd}>&-fi# 計算傳輸數據量local transferred=$(du -b $temp_file | awk '{print $1}')rm -f $temp_file# 計算吞吐量 (MB/s 和 Mbps)local mb_transferred=$(awk -v t="$transferred" 'BEGIN{printf "%.2f", t / 1048576}')local mbps=$(awk -v t="$transferred" -v d="$duration" 'BEGIN{printf "%.2f", (t * 8) / (1000000 * d)}')local speed=$(calc_bandwidth $mbps)echo " Test Duration      : $(_blue "${duration} seconds")"echo " Data Transferred   : $(_blue "$(awk -v mbt="$mb_transferred" 'BEGIN{printf "%.2f", mbt / 1024}') GB ($mb_transferred MB)")"echo " Throughput         : $(_yellow "$speed") ($(awk -v mbt="$mb_transferred" -v d="$duration" 'BEGIN{printf "%.2f", mbt / d}') MB/s)"return 0
}# 網絡延遲測試
network_latency_test() {local target=$1local count=${2:-10}echo " Running Network Latency Test to $target ($count packets)..."if ! _exists "ping"; then_red " ping command not found, skipping latency test"return 1fi# 執行ping測試local ping_result=$(ping -c $count $target 2>/dev/null)if [ $? -ne 0 ]; then_red " Ping test failed to $target"return 1fi# 提取ping統計信息local min=$(echo "$ping_result" | awk '/rtt/ {print $4}' | cut -d'/' -f1)local avg=$(echo "$ping_result" | awk '/rtt/ {print $4}' | cut -d'/' -f2)local max=$(echo "$ping_result" | awk '/rtt/ {print $4}' | cut -d'/' -f3)local mdev=$(echo "$ping_result" | awk '/rtt/ {print $4}' | cut -d'/' -f4)local packet_loss=$(echo "$ping_result" | awk '/packet loss/ {print $6}')echo " Packet Loss        : $(_blue "$packet_loss")"echo " Latency (Min/Avg/Max) : $(_yellow "${min}ms/${avg}ms/${max}ms")"echo " Latency Std Dev    : $(_yellow "${mdev}ms")"return 0
}# 增強的離線網絡測試
enhanced_network_test() {echo " Preparing Enhanced Network Test..."# 創建測試文件local test_file_size=100  # MBecho " Generating ${test_file_size}MB test file..."dd if=/dev/zero of=network_test bs=1M count=$test_file_size 2>/dev/null# 檢測可用網絡接口if [ ${#network_interfaces[@]} -eq 0 ]; then_red " No active network interfaces found. Skipping network test."return 1fiecho " Available Network Interfaces:"for iface in "${network_interfaces[@]}"; doecho "  - $(_blue "$iface"): ${iface_info["${iface}_ip"]} (${iface_info["${iface}_speed"]:-Unknown speed})"done# 檢查網絡工具if ! _exists "socat" && ! ( _exists "bash" && [[ $(bash --version | awk 'NR==1 {print $4}' | cut -d'(' -f1) > "4.3" ]] ); then_yellow " Warning: Limited network testing available - install socat for full functionality"fi# 選擇主要接口(排除虛擬接口)local main_interface=""for iface in "${network_interfaces[@]}"; doif [[ "$iface" != docker* && "$iface" != br-* && "$iface" != veth* ]]; thenmain_interface="$iface"breakfidoneif [ -z "$main_interface" ]; thenmain_interface="${network_interfaces[0]}"fi# 測試方法選擇echo -e "\nSelect Network Test Method:"echo "  1) Local Loopback Bandwidth Test (Standard)"echo "  2) Interface Throughput Test (Single Interface)"echo "  3) Multi-Thread Loopback Test (Advanced)"echo "  4) Interface-to-Interface Test (Requires 2+ NICs)"echo "  5) Loopback Latency Test"echo "  6) External Server Test (If online, optional)"echo "  7) Skip Network Test"echo -n " Your choice [1-7]: "read choicecase $choice in1)loopback_network_test;;2)echo -n " Enter interface name to test (default: $main_interface): "read ifaceiface=${iface:-$main_interface}echo -n " Enter test duration in seconds (default: 10): "read durationnetwork_throughput_test "$iface" ${duration:-10};;3)multithread_loopback_test;;4)interface_to_interface_test;;5)network_latency_test "127.0.0.1" 30;;6)echo -n " Enter external server IP or hostname to test: "read serverif [ -z "$server" ]; then_red " No server specified, skipping test"elsenetwork_latency_test "$server"echo -n " Run bandwidth test to $server? (y/N): "read run_bwif [[ "$run_bw" =~ ^[Yy]$ ]]; thenexternal_bandwidth_test "$server"fifi;;*)echo " Skipping network test."return 0;;esac
}# 標準回環測試
loopback_network_test() {echo " Starting Loopback Network Test..."# 測試文件大小 (MB)local test_file_size=100# 測試次數local test_runs=3local total_speed=0for ((i=1; i<=test_runs; i++)); doecho " Test $i/$test_runs: Transferring ${test_file_size}MB via loopback..."# 寫入速度測試local start=$(date +%s.%N)dd if=network_test of=/dev/null bs=1M 2>/dev/nulllocal end=$(date +%s.%N)local duration=$(awk -v s="$start" -v e="$end" 'BEGIN{printf "%.6f", e - s}')local speed_mb=$(awk -v sz="$test_file_size" -v dur="$duration" 'BEGIN{printf "%.2f", sz / dur}')local speed_mbps=$(awk -v smb="$speed_mb" 'BEGIN{printf "%.2f", smb * 8.388608}')  # MB/s to Mbpslocal speed=$(calc_bandwidth $speed_mbps)echo " Transfer Speed      : $(_yellow "${speed} (${speed_mb} MB/s)")"total_speed=$(awk -v t="$total_speed" -v s="$speed_mbps" 'BEGIN{printf "%.2f", t + s}')donelocal avg_speed_mbps=$(awk -v t="$total_speed" -v r="$test_runs" 'BEGIN{printf "%.2f", t / r}')local avg_speed=$(calc_bandwidth $avg_speed_mbps)echo " Average Speed       : $(_green "${avg_speed}")"
}# 多線程回環測試
multithread_loopback_test() {echo " Starting Multi-Thread Loopback Test..."# 測試參數local thread_count=4local chunk_size=25  # MBlocal total_size=$((thread_count * chunk_size))echo " Transferring ${total_size}MB using $thread_count threads..."local start=$(date +%s.%N)for ((i=0; i<thread_count; i++)); do{dd if=network_test of=/dev/null bs=1M count=$chunk_size skip=$((i * chunk_size)) 2>/dev/null} &donewaitlocal end=$(date +%s.%N)local duration=$(awk -v s="$start" -v e="$end" 'BEGIN{printf "%.6f", e - s}')local speed_mb=$(awk -v sz="$total_size" -v dur="$duration" 'BEGIN{printf "%.2f", sz / dur}')local speed_mbps=$(awk -v smb="$speed_mb" 'BEGIN{printf "%.2f", smb * 8.388608}')  # MB/s to Mbpslocal speed=$(calc_bandwidth $speed_mbps)echo " Total Transferred   : $(_yellow "${total_size} MB")"echo " Transfer Duration   : $(_yellow "${duration%.*} seconds")"echo " Aggregate Speed     : $(_green "${speed} (${speed_mb} MB/s)")"
}# 接口到接口測試
interface_to_interface_test() {echo " Starting Interface-to-Interface Test..."if [ ${#network_interfaces[@]} -lt 2 ]; then_red " Only one network interface found. This test requires at least two interfaces."return 1fi# 檢查網絡工具if ! _exists "socat" && ! ( _exists "bash" && [[ $(bash --version | awk 'NR==1 {print $4}' | cut -d'(' -f1) > "4.3" ]] ); then_red " No suitable network tools found (socat or bash 4.3+ required). Skipping test."return 1fi# 顯示可用接口供選擇echo " Available interfaces:"for i in "${!network_interfaces[@]}"; doecho "  $((i+1))) ${network_interfaces[$i]} (${iface_info["${network_interfaces[$i]}_ip"]})"doneecho -n " Select first interface [1]: "read iface1_idxiface1_idx=${iface1_idx:-1}iface1_idx=$((iface1_idx-1))echo -n " Select second interface [2]: "read iface2_idxiface2_idx=${iface2_idx:-2}iface2_idx=$((iface2_idx-1))if [ $iface1_idx -eq $iface2_idx ]; then_red " Interfaces must be different!"return 1filocal iface1="${network_interfaces[$iface1_idx]}"local iface2="${network_interfaces[$iface2_idx]}"echo " Selected Interfaces:"echo "  Interface 1: $(_blue "$iface1")"echo "  Interface 2: $(_blue "$iface2")"# 獲取接口IPlocal ip1=${iface_info["${iface1}_ip"]}local ip2=${iface_info["${iface2}_ip"]}if [ -z "$ip1" ] || [ -z "$ip2" ]; then_red " Could not get IP addresses for both interfaces."return 1fiecho " Interface IPs:"echo "  $iface1: $(_yellow "$ip1")"echo "  $iface2: $(_yellow "$ip2")"# 測試參數local test_file_size=100  # MBlocal test_runs=3local total_speed=0local port=5000echo " This test will transfer ${test_file_size}MB between interfaces $iface1 and $iface2"_yellow " Note: This test requires IP routing to be properly configured between interfaces"# 為bash內置TCP功能準備文件描述符if _exists "bash" && [[ $(bash --version | awk 'NR==1 {print $4}' | cut -d'(' -f1) > "4.3" ]]; thenexec {net_fd}<>/dev/tcp/0.0.0.0/$portfifor ((i=1; i<=test_runs; i++)); doecho " Test $i/$test_runs: Transferring data from $iface1 to $iface2..."# 在后臺啟動接收端start_network_server $port "/dev/null"local server_pid=$!sleep 2if ! ps -p $server_pid > /dev/null; then_red " Failed to start network server. Skipping remaining tests."breakfi# 啟動發送端local start=$(date +%s.%N)cat network_test | {if _exists "socat"; thensocat - TCP4:$ip2:$portelsecat >/dev/tcp/$ip2/$portfi} >/dev/null 2>&1local end=$(date +%s.%N)# 等待傳輸完成并清理kill $server_pid 2>/dev/nullwait $server_pid 2>/dev/nulllocal duration=$(awk -v s="$start" -v e="$end" 'BEGIN{printf "%.6f", e - s}')local speed_mb=$(awk -v sz="$test_file_size" -v dur="$duration" 'BEGIN{printf "%.2f", sz / dur}')local speed_mbps=$(awk -v smb="$speed_mb" 'BEGIN{printf "%.2f", smb * 8.388608}')  # MB/s to Mbpslocal speed=$(calc_bandwidth $speed_mbps)echo " Transfer Speed      : $(_yellow "${speed} (${speed_mb} MB/s)")"total_speed=$(awk -v t="$total_speed" -v s="$speed_mbps" 'BEGIN{printf "%.2f", t + s}')done# 關閉bash網絡文件描述符if _exists "bash" && [[ $(bash --version | awk 'NR==1 {print $4}' | cut -d'(' -f1) > "4.3" ]]; thenexec {net_fd}>&-fiif awk -v t="$total_speed" 'BEGIN { exit !(t > 0) }'; thenlocal avg_speed_mbps=$(awk -v t="$total_speed" -v r="$test_runs" 'BEGIN{printf "%.2f", t / r}')local avg_speed=$(calc_bandwidth $avg_speed_mbps)echo " Average Speed       : $(_green "${avg_speed}")"fi
}# 外部服務器帶寬測試
external_bandwidth_test() {local server=$1local port=5001local duration=10# 檢查網絡工具if ! _exists "socat" && ! ( _exists "bash" && [[ $(bash --version | awk 'NR==1 {print $4}' | cut -d'(' -f1) > "4.3" ]] ); then_red " No suitable network tools found (socat or bash 4.3+ required). Skipping test."return 1fiecho " Starting External Bandwidth Test to $server..."echo " Test will run for $duration seconds"# 創建臨時測試文件local temp_file=$(mktemp)# 為bash內置TCP功能準備文件描述符if _exists "bash" && [[ $(bash --version | awk 'NR==1 {print $4}' | cut -d'(' -f1) > "4.3" ]]; thenexec {net_fd}<>/dev/tcp/0.0.0.0/$portfi# 啟動接收端start_network_server $port "$temp_file"local server_pid=$!sleep 2if ! ps -p $server_pid > /dev/null; then_red " Failed to start network server. Skipping test."rm -f "$temp_file"return 1fi# 獲取本地IP用于綁定local local_ip=$(ip route get 1 | awk '{print $7; exit}')# 啟動發送端,限制時間(sleep $duration; pkill -P $$ cat) &local killer_pid=$!dd if=/dev/zero bs=1M 2>/dev/null | {if _exists "socat"; thensocat - TCP4:$server:$portelsecat >/dev/tcp/$server/$portfi} >/dev/null 2>&1 &transfer_pid=$!# 等待測試完成wait $killer_pid 2>/dev/nullsleep 1kill $server_pid 2>/dev/nullkill $transfer_pid 2>/dev/null# 關閉bash網絡文件描述符if _exists "bash" && [[ $(bash --version | awk 'NR==1 {print $4}' | cut -d'(' -f1) > "4.3" ]]; thenexec {net_fd}>&-fi# 計算傳輸數據量local transferred=$(du -b $temp_file | awk '{print $1}')rm -f $temp_fileif [ $transferred -eq 0 ]; then_red " No data transferred. Check connectivity to $server:$port"return 1fi# 計算吞吐量local mb_transferred=$(awk -v t="$transferred" 'BEGIN{printf "%.2f", t / 1048576}')local mbps=$(awk -v t="$transferred" -v d="$duration" 'BEGIN{printf "%.2f", (t * 8) / (1000000 * d)}')local speed=$(calc_bandwidth $mbps)echo " Test Duration      : $(_blue "${duration} seconds")"echo " Data Transferred   : $(_blue "$mb_transferred MB")"echo " Throughput         : $(_yellow "$speed") ($(awk -v mbt="$mb_transferred" -v d="$duration" 'BEGIN{printf "%.2f", mbt / d}') MB/s)"return 0
}# 打印系統信息
print_system_info() {echo " CPU Model          : $(_blue "${cname:-Not detected}")"[[ -n "$freq" ]] && freq_info="@ $freq MHz" || freq_info=""echo " CPU Cores          : $(_blue "$cores cores $freq_info")"[[ -n "$ccache" ]] && echo " CPU Cache          : $(_blue "$ccache")"[[ -n "$cpu_aes" ]] && echo " AES-NI             : $(_green "? Enabled")" || echo " AES-NI             : $(_red "? Disabled")"[[ -n "$cpu_virt" ]] && echo " VM-x/AMD-V         : $(_green "? Enabled")" || echo " VM-x/AMD-V         : $(_red "? Disabled")"echo " Total Disk         : $(_yellow "$disk_total_size") $(_blue "($disk_used_size Used)")"echo " Total Mem          : $(_yellow "$tram") $(_blue "($uram Used)")"[[ "$swap" != "0" ]] && echo " Total Swap         : $(_blue "$swap ($uswap Used)")"echo " System Uptime      : $(_blue "$up")"[[ -n "$load" ]] && echo " Load Average       : $(_blue "$load")"echo " OS                 : $(_blue "$opsy")"echo " Arch               : $(_blue "$arch ($lbit Bit)")"echo " Kernel             : $(_blue "$kern")"[[ -n "$tcpctrl" ]] && echo " TCP CC             : $(_yellow "$tcpctrl")"echo " Virtualization     : $(_blue "${virt:-Not detected}")"# 網絡接口信息echo " Network Interfaces : $(_blue "${#network_interfaces[@]} available")"for iface in "${network_interfaces[@]}"; doecho "  - $iface: ${iface_info["${iface}_ip"]} (${iface_info["${iface}_mac"]})"done
}# 打印結束時間
print_end_time() {end_time=$(date +%s)time=$((end_time - start_time))if [ $time -gt 60 ]; thenmin=$((time / 60))sec=$((time % 60))echo " Finished in        : ${min} min ${sec} sec"elseecho " Finished in        : ${time} sec"fiecho " Timestamp          : $(date '+%Y-%m-%d %H:%M:%S %Z')"
}### 主執行流程 ###
start_time=$(date +%s)# 依賴檢查 (核心命令)
if ! _exists "free"; then_red "Error: 'free' command not found. Script cannot continue.\n"exit 1
fiif ! _exists "dd"; then_red "Error: 'dd' command not found. Script cannot continue.\n"exit 1
fi# 檢查是否有bc或awk用于浮點數運算
if ! _exists "bc" && ! _exists "awk"; then_red "Error: Either 'bc' or 'awk' is required for this script. Please install one of them.\n"exit 1
fi# 獲取系統信息
get_system_info
check_virt# 顯示標題
clear
echo "------------ Offline Server Performance Test with Network Benchmark ------------"
echo " Version            : $(_green "v2025-08-01 (No netcat dependency)")"
echo " Usage              : $(_red "./offline_network_bench.sh")"
next# 顯示系統信息
print_system_info
next# 執行CPU測試
cpu_benchmark
next# 執行內存測試
memory_benchmark
next# 執行增強磁盤測試
enhanced_io_test
next# 執行增強網絡測試
enhanced_network_test
next# 完成信息
print_end_time
next# 最終清理
rm -rf benchtest_* network_test 2>/dev/null

執行腳本

chmod +x linux_speed_ceshi.sh
./linux_speed_ceshi.sh

在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91682.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91682.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91682.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python Pandas.unique函數解析與實戰教程

Python Pandas.unique 函數解析與實戰教程 摘要 本文章旨在全面地解析 pandas 庫中的 unique 函數。pandas.unique 是一個用于從一維數組型(array-like)對象中提取唯一值的高效工具。我們將從其核心功能、函數簽名、參數詳解、返回值類型,到關鍵行為特性(如順序保留、缺失…

排序算法入門:直接插入排序詳解

這里寫目錄標題介紹原理代碼實現分析介紹 直接插入排序是一種簡單直觀的排序算法&#xff0c;適用于小規模數據或基本有序的數據集。其核心思想是構建有序序列&#xff0c;對于未排序數據&#xff0c;在已排序序列中從后向前掃描&#xff0c;找到相應位置并插入。 原理 我們…

ClickHouse MergeTree引擎:從核心架構到三級索引實戰

摘要 MergeTree是ClickHouse最核心的存儲引擎&#xff0c;采用列式存儲LSM-Tree架構設計&#xff0c;支持高效的數據寫入、合并和查詢。本文將全面解析MergeTree引擎的基礎概念、數據流、核心架構、索引系統以及常見問題。 基礎篇&#xff1a; 一、MergeTree引擎基礎概念 1. 定…

電腦手機熱點方式通信(上)

電腦連接手機熱點時的無線鏈路情況&#xff1a; 電腦上網時&#xff08;從服務器下載數據&#xff0c;或者上傳指令、數據&#xff09;&#xff0c;首先電腦與手機之間基于WiFi協議在2.4G頻段或者5G頻段通信&#xff0c;然后手機與基站之間再基于4G LTE或者5G NR協議在2412MHz…

MySQL CPU占用過高排查指南

MySQL CPU 占用過高時&#xff0c;排查具體占用資源的表需結合系統監控、數據庫分析工具和 SQL 診斷命令。&#x1f50d; ?一、快速定位問題根源??確認 MySQL 進程占用 CPU?使用 top 或 htop 命令查看系統進程&#xff0c;確認是否為 mysqld 進程導致 CPU 飆升。若 MySQL 進…

軟件交付終極閘口:驗收測試全解析

驗收測試&#xff1a;軟件交付的關鍵環節 目錄 驗收測試&#xff1a;軟件交付的關鍵環節 一、驗收測試&#xff1a;軟件交付的終極閘口 核心目標與作用 在 SDLC 中的位置 二、驗收測試類型詳解&#xff1a;精準匹配業務場景 三、驗收測試全流程解析&#xff1a;從計劃到…

深度學習核心:卷積神經網絡 - 原理、實現及在醫學影像領域的應用

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#,Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開發…

多線程(二) ~ 線程核心屬性與狀態

文章目錄一. 線程創建&#xff08;start&#xff09;&#xff08;一&#xff09;繼承Thread類&#xff0c;重寫run&#xff08;二&#xff09;繼承Runnable類&#xff0c;重寫run&#xff08;三&#xff09;Thread匿名內部類重寫&#xff08;四&#xff09;Runnable匿名內部類重…

Linux---編輯器vim

一、vim的基本概念1.三種模式①命令模式控制屏幕光標的移動&#xff0c;字符、字或行的刪除&#xff0c;移動復制某區段及進入插入模式或者進去底行模式②插入模式可進行文本輸入&#xff0c;按Esc回到命令行模式③底行模式文件保存或退出&#xff0c;也可以進行文件替換&#…

如何在 Ubuntu 24.04 或 22.04 LTS Linux 上安裝 Guake 終端應用程序

通過本教程的簡單步驟,在 Ubuntu 24.04 或 22.04 LTS Jammy JellyFish 上安裝 Guake 終端以運行命令。 Guake(基于 Quake)是一個基于 Python 的終端模擬器。Guake 的行為類似于 Quake 中的終端:通過某個按鍵(熱鍵)按下時,窗口會從屏幕頂部滾下來,再次按下相同的按鍵時…

谷歌Gemini 2.5重磅應用:多模態研究助手Multi-Modal Researcher,實現全網自動研究與AI播客生成

在人工智能賦能科研與內容創作的浪潮中,谷歌基于其最新大模型 Gemini 2.5 推出了突破性工具 Multi-Modal Researcher。這一系統通過整合多模態數據(文本、視頻、實時網絡信息),實現了從自動研究到內容生成的全流程自動化。用戶只需輸入研究主題或YouTube視頻鏈接,系統即可…

防御綜合實驗

一、實驗拓補圖二、實驗需求及配置需求一設備接口VLAN接口類型SW2GE0/0/2VLAN 10AccessGE0/0/3VLAN 20AccessGE0/0/1VLAN List : 10 20Trunk[SW2]vlan 10 [SW2]vlan 20 [SW2]interface GigabitEthernet 0/0/2 [SW2-GigabitEthernet0/0/2]port link-type access [SW2-GigabitEt…

堆----2.前 K 個高頻元素

347. 前 K 個高頻元素 - 力扣&#xff08;LeetCode&#xff09; /** 桶排序: 首先遍歷數組,使用HashMap統計每個元素出現的次數 創建一個大小為length 1的List數組,下標代表元素出現次數,出現次數一致的元素放在同一個數組中 倒數遍歷List數組即可得得到前K個高頻元素 細節注…

如何分析Linux內存性能問題

一、Linux中的buffer與cache的區別 Linux的內存管理與監控_linux服務器虛假內存和真實內存怎么區分-CSDN博客文章瀏覽閱讀66次。本文主要是關于【Linux系統的物理內存與虛擬內存講解】【重點對虛擬內存的作用與用法進行了講解說明】【最后還對如何新增擴展、優化、刪除內存交換…

二次型 線性代數

知識結構總覽首先是我們的二次型的定義&#xff0c;就是說什么樣的才算是一個二次型。然后就是如何把二次型化為標準型&#xff0c;最后就是正定二次型的定義和判斷的一些條件。二次型的定義二次型其實是一種函數表達的方式&#xff0c;如上&#xff0c;含義其實就是每個項都是…

云原生三劍客:Kubernetes + Docker + Spring Cloud 實戰指南與深度整合

在當今微服務架構主導的時代&#xff0c;容器化、編排與服務治理已成為構建彈性、可擴展應用的核心支柱。本文將深入探討如何將 Docker&#xff08;容器化基石&#xff09;、Kubernetes&#xff08;編排引擎&#xff09;與 Spring Cloud&#xff08;微服務框架&#xff09; 無縫…

vue讓elementUI和elementPlus標簽內屬性支持rem單位

vue讓elementUI和elementPlus標簽內屬性支持rem單位 如 Element Plus 的 el-table 默認不直接支持使用 rem 作為列寬單位 解決方法: 將 rem 轉換為像素值&#xff08;基于根元素字體大小&#xff09; // 計算rem對應的像素值 const calcRem (remValue) > {// 獲取根元素(ht…

基于OAuth2與JWT的微服務API安全實戰經驗分享

引言 在微服務架構中&#xff0c;API 安全成為了保護服務免受未授權訪問和攻擊的關鍵要素。本文結合真實生產環境案例&#xff0c;以實戰經驗為出發點&#xff0c;分享基于 OAuth2 JWT 的微服務 API 安全方案&#xff0c;從業務場景、技術選型、實現細節、踩坑及解決方案&…

scrapy庫進階一

scrapy 庫復習 scrapy的概念&#xff1a;Scrapy是一個為了爬取網站數據&#xff0c;提取結構性數據而編寫的應用框架 scrapy框架的運行流程以及數據傳遞過程&#xff1a; 爬蟲中起始的url構造成request對象–>爬蟲中間件–>引擎–>調度器調度器把request–>引擎…

Objective-C實現iOS平臺微信步數修改指南

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;本文介紹如何在iOS平臺上使用Objective-C語言&#xff0c;通過蘋果的HealthKit框架讀取和修改微信步數以及相關健康數據。首先介紹如何引入和使用HealthKit框架&#xff0c;包括請求權限、讀取步數數據、寫入步…