利用tc进行丢包
通过网络丢包来模拟网络故障,是测试中一个重要的测试项目。这对服务来说可以测试其在网络故障时的异常处理的能力,对于服务的可靠性是一个相当严苛的测试。
网卡名为$netcard,丢包率为$Packet_loss,异常时间为$interval
1.注入网络异常,使用robot framework关键字实现通过ssh命令执行tc qdisc add dev $netcard root netem loss $Packet_loss;
2.关闭网络异常,使用robot framework关键字实现通过ssh命令执行tc qdisc add dev $netcard root;
3.这样就能将丢包异常进行一个相当好的模拟,通过注入和关闭网络异常两个关键字,实现非常简单
4.需要设置等待时间,tc qdisc add dev $netcard root netem loss $Packet_loss;sleep 10;tc qdisc add dev $netcard root;
测试tc命令是否成功
这里直接使用ping命令即能达到要求
例如在一个机器上进行了tc qdisc add dev eth0 root netem loss100%
那么就会使ping 这台机器的所有包丢失。
模拟cpu高压
在cpu高压下服务能否照常工作,这是一个非常重要的测试项目力,对于服务的可靠性也是是一个相当严苛的测试。首先写一个浮点计算stress的程序跑满cpu
1.通过ssh命令上传该程序
2.通过ssh会话调用程序,然后等待
3.断开ssh会话cpu高压结束
4.这个可以通过起进程的方式进行结束开启操作
利用robot framework的process包
需要在资源或者测试套件中加入对应的Process,利用进程来模拟网络故障,如下所示:需要robot framework来启动进程
http://robotframework.org/robotframework/latest/libraries/Process.html
下面给出使用Process 的例子:
在robot framework资源或者测试套件中中导入Process 库
使用多进程执行:
Start Process 代表后台执行,不用等待进程执行完成
Run Process 执行线程,需要等待进程执行完成
分析:
Start Process 执行的命令是,执行python 代码,等待100s
但是我们执行Process 的时候,并没有等待这个进程执行完
然后就执行了 Run Process 的进程,这个进程会打开计算器程序。
需要我们手动关闭计算机程序,Run Process 这个进程才会结束。
docker上的适用性
docker在原理上可以隔离物理机的cpu使用率,也可以隔绝tc命令对于物理机的影响,为此在理论上没有问题。对于tc命令,开启容器是需要docker run --cap-add=NET_ADMIN ,加入--cap-add=NET_ADMIN选项
举个例子:
下面是一个示例 Dockerfile,通过生成一个随机文件并将它的上传到 /dev/null-as-a-service 以大约 25/s的近似上传速度来演示这个示例:
FROM ubuntu
# install dependencies
RUN apt-get update
RUN apt-get install -y iproute curl
# create a large random file to upload
RUN head -c 2M </dev/urandom>/upload.data
# rate-limit the network interface and
# upload the data when docker image is run
RUN echo"#!/bin/bash">> /upload.sh
RUN echo"tc qdisc add dev eth0 root tbf rate 25kbps latency 50ms burst 2500">> /upload.sh
RUN echo"curl -d @/upload.data http://devnull-as-a-service.com/dev/null">> /upload.sh
RUN chmod a+x/upload.sh
ENTRYPOINT exec/upload.sh
假设你有名为 ratelimit的目录的Dockerfile inside,你可以以在当前工作目录中运行它:
docker build ratelimit -t ratelimit && docker run --cap-add=NET_ADMIN ratelimit
选项 --cap-add=NET_ADMIN 为容器权限提供修改它的网络接口的权限。你可以在这里找到文档 。
Dockerfile首先安装所需的依赖项。iproute 提供了 tc 工具,curl 允许我们发出我们在速率限制下的请求。在安装依赖项之后,我们生成一个 2MB 个随机文件来上传。下一部分构建一个脚本文件,它将配置速率限制并开始上传。最后,我们将脚本指定为在容器运行时要执行的操作。
这里容器向网络接口添加令牌桶过滤器,以减缓到 25 kb/s的连接。可以以在这里找到给令牌机器人筛选器的选项的文档,这里可以以找到 。
通过删除cURL调用并在它的位置( 在安装了上传所需的工具之后,当然) 执行上传,可以修改这里Dockerfile以执行任何其他网络任务。