RTT与tcp窗口对带宽的影响

前几天业务的同学吐槽我们机房到某云厂商的数据库实例传输速度太慢,但是我们机房到这个云厂商的云主机实例传输速度又很快。期间抓包多次,跟正常的包对比,最终发现,这个问题,是RTT跟TCP窗口共同影响决定的,受限与物理环境的约束,我们机房到这个数据库实例的RTT会达到30ms,这意味着在1s内,两边的数据交互只能到33次,如果按照每一个包确认过后才可以发下一个包的方式的话,1s只能发33个包,每个包1500B大小的话,这个带宽只能到50KB/s=400Kbits/s,这个带宽,相信都不能忍吧,咱毕竟不是00年有ADSL就吼开心的时代了。

如果提升这个速度呢?tcp的窗口就需要用到了,窗口的意思就是发送端一次可以发送多个包,但是具体能发送多少呢?这要接受端通知发送端窗口大小来协商,如果窗口等于一个包大小,那么情况就是1s只能发33个包,如果窗口是10000个包大小,那么1s就能发送330000个包,算下,这个带宽已经可以到83Mbits,是不是提升很大呢?

综上所述,高延时的场景下,发送端跟接受端的窗口大小,是对传输速度有致命影响的,在高延时的场景下,如果想获得高的带宽,一定要调整发送端跟接受端的窗口大小,这样才能充分的利用带宽。

如果有想测试高延时的场景的同学,可以用如下的命令设置主机的延时:

tc  qdisc  add  dev  eth0  root  netem  delay  30ms

效果很明显,ping下即可看到效果,测试带宽用iperf就足够了。

 

发表在 好玩的linux | 留下评论

etcd聊天工具

写了个好low的脚本,etcd又被我玩low了,这个脚本是用来做聊天室的,可以设置nickname,依赖etcdctl工具

#!/bin/bash

url="http://127.0.0.1:2379"
room="xxoo"
nickname=$(echo $RANDOM)

while getopts "u:r:n:" arg
do
  case $arg in
    u)
      url="http://$OPTARG:2379"
      ;;
    r)
      room=$OPTARG
      ;;
    n)
      nickname=$OPTARG
      ;;
    ?)
      echo "unkonw argument"
      exit 1
      ;;
  esac
done
export ETCDCTL_PEERS=$url

etcdctl watch talk/$room/room --forever &

while read line
do
  if echo $line |grep -q "^nickname "
  then
    nickname=$(echo $line|awk '{print $2}')
  else
    echo -n "$(tput cuu1)$(tput dl1)"
    etcdctl set talk/$room/room "$nickname: $line" >/dev/null
  fi
done

kill %1

基于watch实现的,可传参数有url,聊天室名字,nickname

服务端客户端均不保留聊天记录,命令行下使用

 

 

发表在 好玩的linux, 药不能停 | 留下评论

while read 循环只一行

惭愧了,之前居然不不知道这个细节,某次在while read接受管道输入,然后循环远程执行ssh命令的时候,只能执行到第一个,但是echo的话是没问题的,查找根源是,重定向的输出是整个循环体,不止是read,也有里面的其他命令,所以,所有会处理标准输入的命令都会被干扰。

形如:

seq 1 5|while read i;
do 
echo $i;
echo hehe;
done

中间有cat的情况:

seq 1 5|while read i;
do 
echo $i;
cat ;
echo hehe;
done

看出问题来了么?

发表在 好玩的linux | 留下评论

devicemapper linear模式

某天在G+有同学问把一个几T大硬盘dump到几个小硬盘上,怎么把小硬盘上的数据挂载起来读取。

开始以为软raid跟devicemapper都可以做到,

做了个软raid小实验后发现,做raid,即使是linear的模式,也是会修改块设备的记录以标志这个块设备已经是一个raid设备。

所以,看起来只有devicemapper的linear可以做到了

复制一次实验的过程:

制作一个有数据的块设备:

dd if=/dev/zero of=test.disk count=1000000
mkfs.ext4 test.disk
mount test.disk /mnt/tmp/
echo haha >/mnt/tmp/tt
umount /mnt/tmp

切割这个块设备:

split --bytes=300M test.disk

这个时候目录下多了两个文件,xaa跟xab

把文件帮到回环设备作为块设备使用:

losetup /dev/loop1 xaa
losetup /dev/loop2 xab

创建devicemapper linear设备并验证文件完整:

echo -e '0 614400 linear /dev/loop1 0'\\n'614400 385600 linear /dev/loop2 0'| dmsetup create test-linear
mount /dev/mapper/test-linear /mnt/tmp/
cat /mnt/tmp/tt

写入的文件仍然存在!完美!

发表在 好玩的linux, 未分类 | 留下评论

微信公众号

欢迎关注转发

qrcode_for_gh_7136530e3942_258

微信公众号怎么搞?看这里:http://lisux.me/ljn/?p=768

 

发表在 转载 | 留下评论