我想粗略估计两台Linux服务器之间的网络I/O速度。问题是我没有 sudo 访问服务器的权限。所以我尝试使用 scp 在两台服务器之间传输 1GB 文件。我想通过加密,速度会有所下降。我应该预期减速多少?服务器管理员也可以限制 scp 带宽使用吗?我怎么知道是否有上限?
加密通常不是 scp 传输的瓶颈,但您可以使用 ftp 代替。
我通常的方法是使用这个命令在某个端口的任何目录上打开Python Web服务器
python -m SimpleHTTPServer 8000 # python 2
python -m http.server 8000 # python 3
另一边只需使用 wget 即可下载
wget http://[ip address]:8000/[some big file]
任何网络活动都可能受到服务器管理员的限制,通常的指标是您的速度保持在一个很好的稳定水平(例如 500KB/s)
iperf
用于网络性能测试,可在所有好的存储库中找到,并且有大量有关使用技巧的文章。
随机使用文章:
http://www.nanog.org/meetings/nanog43/presentations/Dugan_Iperf_N43.pdf
http://maddhat.com/testing-network-performance-using-iperf-3
使用
scp
或ftp
等文件传输程序会带来磁盘IO作为瓶颈源。
我应该期待多少速度减慢?加密不应该有太多开销。此外,此速度测试的目的是测量服务器到服务器的 I/O 性能,因此您是否不希望它反映典型的通信类型(即加密)?
服务器管理员也可以限制 scp 带宽使用吗?我如何知道它是否受到限制? 是的,这在网络的各个层都是可能的。例如,在路由器级别使用
tc
(例如 here)。如果您拥有 sudo
权限,您可以检查 tc
限制是否到位。否则,您可以尝试使用不同的机器,没有限制,看看速度是否不同。如果它是在路由器级别完成的,您就没有简单的方法可以知道。
这是一个 bash 脚本,它将 1) 检查服务器是否可访问,2) 创建给定大小的文件,3) 使用
scp
测量上传和可选下载速率,4) 本地和远程删除文件.
像
speed_test.sh --server=1.2.3.4 --test_size=128 --do_download=1 --server_dir=.
一样使用它
信用说明:这是我对最初发布的脚本的修改这里。
#!/bin/bash
test_file=".scp-test-file"
# usage function
function usage()
{
cat << HEREDOC
Usage: $progname --server=<ip address> [--test_size=<MB> --do_download=<0/1> --server_dir=<server side dir>]
optional arguments:
-h, --help show this help message and exit
HEREDOC
}
# initialize variables and defaults
progname=$(basename $0)
server=
server_dir=./
do_download=1
test_size=10
###
# all args
L=(server \
do_download \
test_size \
server_dir)
arg_parse_str="help"
for arg in "${L[@]}"; do
arg_parse_str=${arg_parse_str},${arg}:
done
#echo $arg_parse_str
OPTS=$(getopt -o "h" --long ${arg_parse_str} -n "$progname" -- "$@")
if [ $? != 0 ] ; then echo "Error in command line arguments." >&2 ; usage; exit 1 ; fi
eval set -- "$OPTS"
while true; do
# uncomment the next line to see how shift is working
# echo "\$1:\"$1\" \$2:\"$2\""
case "$1" in
-h | --help ) usage; exit; ;;
-- ) shift; break ;;
esac
found=
for arg in "${L[@]}"; do
if [ "$1" == "--$arg" ]; then
declare ${arg}="$2";
shift 2;
found=1
break
fi
done
if [ -z "$found" ]; then
break
fi
done
if [ -z "$server" ]
then
usage;
exit;
fi
#[[ -z $(nc -W 1 -w 10 $server 22 2>/dev/null) ]] && echo "$server unreachable" && exit 0
#if your nc complains about not having -i command line option then use the line above
[[ -z $(nc -i 1 -w 10 $server 22 2>/dev/null) ]] && echo "$server unreachable" && exit 0
# generate a file of all zeros
echo "Generating $test_size MB test file..."
dd if=/dev/zero of=$test_file bs=$(echo "$test_size*1024*1024" | bc) \
count=1 &> /dev/null
# upload test
echo "Testing upload to $server..."
up_speed=$(scp -v -o 'Compression no' -o 'StrictHostKeyChecking no' $test_file $server:$server_dir/$test_file 2>&1 | \
grep "Bytes per second" | \
sed "s/^[^0-9]*\([0-9.]*\)[^0-9]*\([0-9.]*\).*$/\1/g")
up_speed=$(echo "($up_speed/1000)" | bc)
echo "Upload speed: $up_speed KBps on $server"
if [ "$do_download" == "1" ]; then
# download test
echo "Testing download from $server..."
down_speed=$(scp -v -o 'Compression no' -o 'StrictHostKeyChecking no' $server:$server_dir/$test_file $test_file 2>&1 | \
grep "Bytes per second" | \
sed "s/^[^0-9]*\([0-9.]*\)[^0-9]*\([0-9.]*\).*$/\2/g")
down_speed=$(echo "($down_speed/1000)" | bc)
echo "Download speed: $down_speed KBps on $server"
fi
# clean up
echo "Removing test file, $server:$server_dir/$test_file..."
ssh $server "rm $server_dir/$test_file"
echo "Removing test file locally..."
rm $test_file