Files
PTS-Team/menu/functions/bench.sh
MrDoobPG 26a27e470b ini
2019-11-29 19:14:15 +01:00

551 lines
18 KiB
Bash

#!/bin/bash
# serverreview-benchmark by @sayem314
# Github: https://github.com/sayem314/serverreview-benchmark
# shellcheck disable=SC1117,SC2086,SC2003,SC1001,SC2116,SC2046,2128,2124
about () {
echo ""
echo " ========================================================= "
echo " \ Serverreview Benchmark Script / "
echo " \ Basic system info, I/O test and speedtest / "
echo " \ V 3.0.3 (13 Sep 2019) / "
echo " \ Created by Sayem Chowdhury / "
echo " ========================================================= "
echo ""
echo " This script is based on bench.sh by camarg from akamaras.com"
echo " Later it was modified by dmmcintyre3 on FreeVPS.us"
echo " Thanks to Hidden_Refuge for the update of this script"
echo ""
}
prms () {
echo " Arguments:"
echo " $(tput setaf 3)-info$(tput sgr0) - Check basic system information"
echo " $(tput setaf 3)-io$(tput sgr0) - Run I/O test with or w/ cache"
echo " $(tput setaf 3)-cdn$(tput sgr0) - Check download speed from CDN"
echo " $(tput setaf 3)-northamercia$(tput sgr0) - Download speed from North America"
echo " $(tput setaf 3)-europe$(tput sgr0) - Download speed from Europe"
echo " $(tput setaf 3)-asia$(tput sgr0) - Download speed from asia"
echo " $(tput setaf 3)-a$(tput sgr0) - Test and check all above things at once"
echo " $(tput setaf 3)-b$(tput sgr0) - System info, CDN speedtest and I/O test"
echo " $(tput setaf 3)-ispeed$(tput sgr0) - Install speedtest-cli (python 2.4-3.4 required)"
echo " $(tput setaf 3)-speed$(tput sgr0) - Check internet speed using speedtest-cli"
echo " $(tput setaf 3)-about$(tput sgr0) - Check about this script"
echo ""
echo " Parameters"
echo " $(tput setaf 3)share$(tput sgr0) - upload results (default to ubuntu paste)"
echo " Available option for share:"
echo " ubuntu # upload results to ubuntu paste (default)"
echo " haste # upload results to hastebin"
echo " clbin # upload results to clbin"
echo " ptpb # upload results to ptpb"
}
howto () {
echo ""
echo " Wrong parameters. Use $(tput setaf 3)bash $BASH_SOURCE -help$(tput sgr0) to see parameters"
echo " ex: $(tput setaf 3)bash $BASH_SOURCE -info$(tput sgr0) (without quotes) for system information"
echo ""
}
benchinit() {
if ! hash curl 2>$NULL; then
echo "missing dependency curl"
echo "please install curl first"
exit
fi
}
CMD="$1"
PRM1="$2"
PRM2="$3"
log="$HOME/bench.log"
ARG="$BASH_SOURCE $@"
benchram="/mnt/tmpbenchram"
NULL="/dev/null"
true > $log
cancel () {
echo ""
rm -f test
echo " Abort"
if [[ -d $benchram ]]; then
rm $benchram/zero
umount $benchram
rm -rf $benchram
fi
exit
}
trap cancel SIGINT
systeminfo () {
# Systeminfo
echo "" | tee -a $log
echo " $(tput setaf 6)## System Information$(tput sgr0)"
echo " ## System Information" >> $log
echo "" | tee -a $log
# OS Information (Name)
cpubits=$( uname -m )
if echo $cpubits | grep -q 64; then
bits=" (64 bit)"
elif echo $cpubits | grep -q 86; then
bits=" (32 bit)"
elif echo $cpubits | grep -q armv5; then
bits=" (armv5)"
elif echo $cpubits | grep -q armv6l; then
bits=" (armv6l)"
elif echo $cpubits | grep -q armv7l; then
bits=" (armv7l)"
else
bits="unknown"
fi
if hash lsb_release 2>$NULL; then
soalt=$(lsb_release -d)
echo -e " OS Name : "${soalt:13} $bits | tee -a $log
else
so=$(awk 'NF' /etc/issue)
pos=$(expr index "$so" 123456789)
so=${so/\/}
extra=""
if [[ "$so" == Debian*9* ]]; then
extra="(stretch)"
elif [[ "$so" == Debian*8* ]]; then
extra="(jessie)"
elif [[ "$so" == Debian*7* ]]; then
extra="(wheezy)"
elif [[ "$so" == Debian*6* ]]; then
extra="(squeeze)"
fi
if [[ "$so" == *Proxmox* ]]; then
so="Debian 7.6 (wheezy)";
fi
otro=$(expr index "$so" \S)
if [[ "$otro" == 2 ]]; then
so=$(cat /etc/*-release)
pos=$(expr index "$so" NAME)
pos=$((pos-2))
so=${so/\/}
fi
echo -e " OS Name : "${so:0:($pos+2)}$extra$bits | tr -d '\n' | tee -a $log
echo "" | tee -a $log
fi
sleep 0.1
#Detect virtualization
if hash ifconfig 2>$NULL; then
eth=$(ifconfig)
fi
virtualx=$(dmesg)
if [[ -f /proc/user_beancounters ]]; then
virtual="OpenVZ"
elif [[ "$virtualx" == *kvm-clock* ]]; then
virtual="KVM"
elif [[ "$virtualx" == *"VMware Virtual Platform"* ]]; then
virtual="VMware"
elif [[ "$virtualx" == *"Parallels Software International"* ]]; then
virtual="Parallels"
elif [[ "$virtualx" == *VirtualBox* ]]; then
virtual="VirtualBox"
elif [[ "$eth" == *eth0* ]];then
virtual="Dedicated"
elif [[ -e /proc/xen ]]; then
virtual="Xen"
fi
#Kernel
echo " Kernel : $virtual / $(uname -r)" | tee -a $log
sleep 0.1
# Hostname
echo " Hostname : $(hostname)" | tee -a $log
sleep 0.1
# CPU Model Name
cpumodel=$( awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo )
echo " CPU Model :$cpumodel" | tee -a $log
sleep 0.1
# CPU Cores
cores=$( awk -F: '/model name/ {core++} END {print core}' /proc/cpuinfo )
corescache=$( awk -F: '/cache size/ {cache=$2} END {print cache}' /proc/cpuinfo )
freq=$( awk -F: ' /cpu MHz/ {freq=$2} END {print freq}' /proc/cpuinfo )
if [[ $cores == "1" ]]; then
echo " CPU Cores : $cores core @ $freq MHz" | tee -a $log
else
echo " CPU Cores : $cores cores @ $freq MHz" | tee -a $log
fi
sleep 0.1
echo " CPU Cache :$corescache" | tee -a $log
sleep 0.1
# RAM Information
tram="$( free -m | grep Mem | awk 'NR=1 {print $2}' ) MiB"
fram="$( free -m | grep Mem | awk 'NR=1 {print $7}' ) MiB"
fswap=$( free -m | grep Swap | awk 'NR=1 {print $4}' )MiB
echo " Total RAM : $tram (Free $fram)" | tee -a $log
sleep 0.1
# Swap Information
tswap="$( free -m | grep Swap | awk 'NR=1 {print $2}' ) MiB"
tswap0=$( grep SwapTotal < /proc/meminfo | awk 'NR=1 {print $2$3}' )
if [[ "$tswap0" == "0kB" ]]; then
echo " Total SWAP : SWAP not enabled" | tee -a $log
else
echo " Total SWAP : $tswap (Free $fswap)" | tee -a $log
fi
sleep 0.1
# HDD information
hdd=$( df -h --total --local -x tmpfs | grep 'total' | awk '{print $2}' )B
hddfree=$( df -h --total | grep 'total' | awk '{print $5}' )
echo " Total Space : $hdd ($hddfree used)" | tee -a $log
sleep 0.1
# Uptime
secs=$( awk '{print $1}' /proc/uptime | cut -f1 -d"." )
if [[ $secs -lt 120 ]]; then
sysuptime="$secs seconds"
elif [[ $secs -lt 3600 ]]; then
sysuptime=$( printf '%d minutes %d seconds\n' $((secs%3600/60)) $((secs%60)) )
elif [[ $secs -lt 86400 ]]; then
sysuptime=$( printf '%dhrs %dmin %dsec\n' $((secs/3600)) $((secs%3600/60)) $((secs%60)) )
else
sysuptime=$( echo $((secs/86400))"days - "$(date -d "1970-01-01 + $secs seconds" "+%Hhrs %Mmin %Ssec") )
fi
echo " Running for : $sysuptime" | tee -a $log
echo "" | tee -a $log
}
echostyle(){
if hash tput 2>$NULL; then
echo " $(tput setaf 6)$1$(tput sgr0)"
echo " $1" >> $log
else
echo " $1" | tee -a $log
fi
}
FormatBytes() {
bytes=${1%.*}
local Mbps=$( printf "%s" "$bytes" | awk '{ printf "%.2f", $0 / 1024 / 1024 * 8 } END { if (NR == 0) { print "error" } }' )
if [[ $bytes -lt 1000 ]]; then
printf "%8i B/s | N/A " $bytes
elif [[ $bytes -lt 1000000 ]]; then
local KiBs=$( printf "%s" "$bytes" | awk '{ printf "%.2f", $0 / 1024 } END { if (NR == 0) { print "error" } }' )
printf "%7s KiB/s | %7s Mbps" "$KiBs" "$Mbps"
else
# awk way for accuracy
local MiBs=$( printf "%s" "$bytes" | awk '{ printf "%.2f", $0 / 1024 / 1024 } END { if (NR == 0) { print "error" } }' )
printf "%7s MiB/s | %7s Mbps" "$MiBs" "$Mbps"
# bash way
# printf "%4s MiB/s | %4s Mbps""$(( bytes / 1024 / 1024 ))" "$(( bytes / 1024 / 1024 * 8 ))"
fi
}
pingtest() {
# ping one time
local ping_link=$( echo ${1#*//} | cut -d"/" -f1 )
local ping_ms=$( ping -w1 -c1 $ping_link | grep 'rtt' | cut -d"/" -f5 )
# get download speed and print
if [[ $ping_ms == "" ]]; then
printf " | ping error!"
else
printf " | ping %3i.%sms" "${ping_ms%.*}" "${ping_ms#*.}"
fi
}
# main function for speed checking
# the report speed are average per file
speed() {
# print name
printf "%s" " $1" | tee -a $log
# get download speed and print
C_DL=$( curl -m 4 -w '%{speed_download}\n' -o $NULL -s "$2" )
printf "%s\n" "$(FormatBytes $C_DL) $(pingtest $2)" | tee -a $log
}
# 2 location (200MB)
cdnspeedtest () {
echo "" | tee -a $log
echostyle "## CDN Speedtest"
echo "" | tee -a $log
speed "CacheFly :" "http://cachefly.cachefly.net/100mb.test"
# google drive speed test
TMP_COOKIES="/tmp/cookies.txt"
TMP_FILE="/tmp/gdrive"
DRIVE="drive.google.com"
FILE_ID="0B1MVW1mFO2zmdGhyaUJESWROQkE"
printf " Gdrive :" | tee -a $log
curl -c $TMP_COOKIES -o $TMP_FILE -s "https://$DRIVE/uc?id=$FILE_ID&export=download"
D_ID=$( grep "confirm=" < $TMP_FILE | awk -F "confirm=" '{ print $NF }' | awk -F "&amp" '{ print $1 }' )
C_DL=$( curl -m 4 -Lb $TMP_COOKIES -w '%{speed_download}\n' -o $NULL \
-s "https://$DRIVE/uc?export=download&confirm=$D_ID&id=$FILE_ID" )
printf "%s\n" "$(FormatBytes $C_DL) $(pingtest $DRIVE)" | tee -a $log
echo "" | tee -a $log
}
# 10 location (1GB)
northamerciaspeedtest () {
echo "" | tee -a $log
echostyle "## North America Speedtest"
echo "" | tee -a $log
speed "Softlayer, Washington, USA :" "http://speedtest.wdc04.softlayer.com/downloads/test100.zip"
speed "SoftLayer, San Jose, USA :" "http://speedtest.sjc01.softlayer.com/downloads/test100.zip"
speed "SoftLayer, Dallas, USA :" "http://speedtest.dal01.softlayer.com/downloads/test100.zip"
speed "Vultr, New Jersey, USA :" "http://nj-us-ping.vultr.com/vultr.com.100MB.bin"
speed "Vultr, Seattle, USA :" "http://wa-us-ping.vultr.com/vultr.com.100MB.bin"
speed "Vultr, Dallas, USA :" "http://tx-us-ping.vultr.com/vultr.com.100MB.bin"
speed "Vultr, Los Angeles, USA :" "https://lax-ca-us-ping.vultr.com/vultr.com.100MB.bin"
speed "Ramnode, New York, USA :" "http://lg.nyc.ramnode.com/static/100MB.test"
speed "Ramnode, Atlanta, USA :" "http://lg.atl.ramnode.com/static/100MB.test"
speed "OVH, Beauharnois, Canada :" "http://bhs.proof.ovh.net/files/100Mio.dat"
echo ""
}
# 9 location (900MB)
europespeedtest () {
echo "" | tee -a $log
echostyle "## Europe Speedtest"
echo "" | tee -a $log
speed "Vultr, London, UK :" "http://lon-gb-ping.vultr.com/vultr.com.100MB.bin"
speed "LeaseWeb, Frankfurt, Germany :" "http://mirror.de.leaseweb.net/speedtest/100mb.bin"
speed "Hetzner, Germany :" "https://speed.hetzner.de/100MB.bin"
speed "Ramnode, Alblasserdam, NL :" "http://lg.nl.ramnode.com/static/100MB.test"
speed "Vultr, Amsterdam, NL :" "http://ams-nl-ping.vultr.com/vultr.com.100MB.bin"
speed "EDIS, Stockholm, Sweden :" "http://se.edis.at/100MB.test"
speed "OVH, Roubaix, France :" "http://rbx.proof.ovh.net/files/100Mio.dat"
speed "Online, France :" "http://ping.online.net/100Mo.dat"
speed "Prometeus, Milan, Italy :" "http://mirrors.prometeus.net/test/test100.bin"
echo "" | tee -a $log
}
# 4 location (200MB)
exoticpeedtest () {
echo "" | tee -a $log
echostyle "## Exotic Speedtest"
echo "" | tee -a $log
speed "Sydney, Australia :" "https://syd-au-ping.vultr.com/vultr.com.100MB.bin"
speed "Lagoon, New Caledonia :" "http://mirror.lagoon.nc/speedtestfiles/test50M.bin"
speed "Hosteasy, Moldova :" "http://mirror.as43289.net/speedtest/100mb.bin"
speed "Prima, Argentina :" "http://sftp.fibertel.com.ar/services/file-50MB.img"
echo "" | tee -a $log
}
# 4 location (400MB)
asiaspeedtest () {
echo "" | tee -a $log
echostyle "## Asia Speedtest"
echo "" | tee -a $log
speed "SoftLayer, Singapore :" "http://speedtest.sng01.softlayer.com/downloads/test100.zip"
speed "Linode, Tokyo, Japan :" "http://speedtest.tokyo2.linode.com/100MB-tokyo2.bin"
speed "Linode, Singapore :" "http://speedtest.singapore.linode.com/100MB-singapore.bin"
speed "Vultr, Tokyo, Japan :" "http://hnd-jp-ping.vultr.com/vultr.com.100MB.bin"
echo "" | tee -a $log
}
freedisk() {
# check free space
freespace=$( df -m . | awk 'NR==2 {print $4}' )
if [[ $freespace -ge 1024 ]]; then
printf "%s" $((1024*2))
elif [[ $freespace -ge 512 ]]; then
printf "%s" $((512*2))
elif [[ $freespace -ge 256 ]]; then
printf "%s" $((256*2))
elif [[ $freespace -ge 128 ]]; then
printf "%s" $((128*2))
else
printf 1
fi
}
averageio() {
ioraw1=$( echo $1 | awk 'NR==1 {print $1}' )
[ "$(echo $1 | awk 'NR==1 {print $2}')" == "GB/s" ] && ioraw1=$( awk 'BEGIN{print '$ioraw1' * 1024}' )
ioraw2=$( echo $2 | awk 'NR==1 {print $1}' )
[ "$(echo $2 | awk 'NR==1 {print $2}')" == "GB/s" ] && ioraw2=$( awk 'BEGIN{print '$ioraw2' * 1024}' )
ioraw3=$( echo $3 | awk 'NR==1 {print $1}' )
[ "$(echo $3 | 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}' )
printf "%s" "$ioavg"
}
cpubench() {
if hash $1 2>$NULL; then
io=$( ( dd if=/dev/zero bs=512K count=$2 | $1 ) 2>&1 | grep 'copied' | awk -F, '{io=$NF} END { print io}' )
if [[ $io != *"."* ]]; then
printf " %4i %s" "${io% *}" "${io##* }"
else
printf "%4i.%s" "${io%.*}" "${io#*.}"
fi
else
printf " %s not found on system." "$1"
fi
}
iotest () {
echo "" | tee -a $log
echostyle "## IO Test"
echo "" | tee -a $log
# start testing
writemb=$(freedisk)
if [[ $writemb -gt 512 ]]; then
writemb_size="$(( writemb / 2 / 2 ))MB"
writemb_cpu="$(( writemb / 2 ))"
else
writemb_size="$writemb"MB
writemb_cpu=$writemb
fi
# CPU Speed test
printf " CPU Speed:\n" | tee -a $log
printf " bzip2 %s -" "$writemb_size" | tee -a $log
printf "%s\n" "$( cpubench bzip2 $writemb_cpu )" | tee -a $log
printf " sha256 %s -" "$writemb_size" | tee -a $log
printf "%s\n" "$( cpubench sha256sum $writemb_cpu )" | tee -a $log
printf " md5sum %s -" "$writemb_size" | tee -a $log
printf "%s\n\n" "$( cpubench md5sum $writemb_cpu )" | tee -a $log
# Disk test
echo " Disk Speed ($writemb_size):" | tee -a $log
if [[ $writemb != "1" ]]; then
io=$( ( dd bs=512K count=$writemb if=/dev/zero of=test; rm -f test ) 2>&1 | awk -F, '{io=$NF} END { print io}' )
echo " I/O Speed -$io" | tee -a $log
io=$( ( dd bs=512K count=$writemb if=/dev/zero of=test oflag=dsync; rm -f test ) 2>&1 | awk -F, '{io=$NF} END { print io}' )
echo " I/O Direct -$io" | tee -a $log
else
echo " Not enough space to test." | tee -a $log
fi
echo "" | tee -a $log
# RAM Speed test
# set ram allocation for mount
tram_mb="$( free -m | grep Mem | awk 'NR=1 {print $2}' )"
if [[ tram_mb -gt 1900 ]]; then
sbram=1024M
sbcount=2048
else
sbram=$(( tram_mb / 2 ))M
sbcount=$tram_mb
fi
[[ -d $benchram ]] || mkdir $benchram
mount -t tmpfs -o size=$sbram tmpfs $benchram/
printf " RAM Speed (%sB):\n" "$sbram" | tee -a $log
iow1=$( ( dd if=/dev/zero of=$benchram/zero bs=512K count=$sbcount ) 2>&1 | awk -F, '{io=$NF} END { print io}' )
ior1=$( ( dd if=$benchram/zero of=$NULL bs=512K count=$sbcount; rm -f test ) 2>&1 | awk -F, '{io=$NF} END { print io}' )
iow2=$( ( dd if=/dev/zero of=$benchram/zero bs=512K count=$sbcount ) 2>&1 | awk -F, '{io=$NF} END { print io}' )
ior2=$( ( dd if=$benchram/zero of=$NULL bs=512K count=$sbcount; rm -f test ) 2>&1 | awk -F, '{io=$NF} END { print io}' )
iow3=$( ( dd if=/dev/zero of=$benchram/zero bs=512K count=$sbcount ) 2>&1 | awk -F, '{io=$NF} END { print io}' )
ior3=$( ( dd if=$benchram/zero of=$NULL bs=512K count=$sbcount; rm -f test ) 2>&1 | awk -F, '{io=$NF} END { print io}' )
echo " Avg. write - $(averageio "$iow1" "$iow2" "$iow3") MB/s" | tee -a $log
echo " Avg. read - $(averageio "$ior1" "$ior2" "$ior3") MB/s" | tee -a $log
rm $benchram/zero
umount $benchram
rm -rf $benchram
echo "" | tee -a $log
}
speedtestresults () {
#Testing Speedtest
if hash python 2>$NULL; then
curl -Lso speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
python speedtest-cli --share | tee -a $log
rm -f speedtest-cli
echo ""
else
echo " Python is not installed."
echo " First install python, then re-run the script."
echo ""
fi
}
startedon() {
echo "\$ $ARG" >> $log
echo "" | tee -a $log
benchstart=$(date +"%d-%b-%Y %H:%M:%S")
start_seconds=$(date +%s)
echo " Benchmark started on $benchstart" | tee -a $log
}
finishedon() {
end_seconds=$(date +%s)
echo " Benchmark finished in $((end_seconds-start_seconds)) seconds" | tee -a $log
echo " results saved on $log"
echo "" | tee -a $log
}
sharetest() {
case $1 in
'ubuntu')
share_link=$( curl -v --data-urlencode "content@$log" -d "poster=bench.log" -d "syntax=text" "https://paste.ubuntu.com" 2>&1 | \
grep "Location" | awk '{print $3}' );;
'haste' )
share_link=$( curl -X POST -s -d "$(cat $log)" https://hastebin.com/documents | awk -F '"' '{print "https://hastebin.com/"$4}' );;
'clbin' )
share_link=$( curl -sF 'clbin=<-' https://clbin.com < $log );;
'ptpb' )
share_link=$( curl -sF c=@- https://ptpb.pw/?u=1 < $log );;
esac
# print result info
echo " Share result:"
echo " $share_link"
echo ""
}
case $CMD in
'-info'|'-information'|'--info'|'--information' )
systeminfo;;
'-io'|'-drivespeed'|'--io'|'--drivespeed' )
iotest;;
'-northamercia'|'-na'|'--northamercia'|'--na' )
benchinit; northamerciaspeedtest;;
'-europe'|'-eu'|'--europe'|'--eu' )
benchinit; europespeedtest;;
'-exotic'|'--exotic' )
benchinit; exoticpeedtest;;
'-asia'|'--asia' )
benchinit; asiaspeedtest;;
'-cdn'|'--cdn' )
benchinit; cdnspeedtest;;
'-b'|'--b' )
benchinit; startedon; systeminfo; cdnspeedtest; iotest; finishedon;;
'-a'|'-all'|'-bench'|'--a'|'--all'|'--bench' )
benchinit; startedon; systeminfo; cdnspeedtest; northamerciaspeedtest;
europespeedtest; exoticpeedtest; asiaspeedtest; iotest; finishedon;;
'-speed'|'-speedtest'|'-speedcheck'|'--speed'|'--speedtest'|'--speedcheck' )
benchinit; speedtestresults;;
'-help'|'--help'|'help' )
prms;;
'-about'|'--about'|'about' )
about;;
*)
howto;;
esac
case $PRM1 in
'-share'|'--share'|'share' )
if [[ $PRM2 == "" ]]; then
sharetest ubuntu
else
sharetest $PRM2
fi
;;
esac
# ring a bell
printf '\007'