使用scp估算网络I / O速度

时间:2011-07-29 10:51:17

标签: linux bandwidth scp

我想粗略估计两个Linux服务器之间的网络I / O速度。问题是我没有sudo访问服务器。所以我尝试使用scp在两台服务器之间传输1GB文件。我认为加密会有一些减速。我应该期待多少放缓? scp带宽使用量也可以由服务器管理员限制吗?我怎么知道它是否有上限?

3 个答案:

答案 0 :(得分:6)

加密通常不是scp传输的瓶颈,但你可以使用ftp代替。

我通常的方法是使用此单一命令在某个端口上的任何目录上打开Python Web服务器

python -m SimpleHTTPServer 8000

另一方面,只需使用wget下载

wget http://[ip address]:8000/[some big file]

任何网络活动都可能受到服务器管理员的限制,通常的指标是你的速度保持在一个不错的稳定水平(例如500KB / s)

答案 1 :(得分:1)

iperf用于网络性能测试,可在所有优秀的存储库中找到,还有大量有关使用技巧的文章。

http://iperf.sourceforge.net/

随机使用文章:

http://www.nanog.org/meetings/nanog43/presentations/Dugan_Iperf_N43.pdf

http://maddhat.com/testing-network-performance-using-iperf-3

使用scpftp等文件传输程序会将磁盘IO作为瓶颈来源。

答案 2 :(得分:0)

我应该期望多少速度下降?加密应该不会有太大的开销。另外,此速度测试的目的是测量服务器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=.

一样使用

致谢:这是我对最初发布的here脚本的修改。

#!/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