问题描述

业务上有客户投诉,某服务工作不正常,具体表现为在客户的环境下,此服务请求及相应缓慢,但是处于某种原因并不能拿到该客户的网络情况。
前期研究中,对此服务进行压力测试,服务访问量远超业务峰值亦无法重现此问题,经客户配合后,得出客户的网络延迟较高,网络抖动较为严重。
为了优化用户体验,提升服务质量,需要在内网开发环境中设置一个弱网环境

解决思路

使用WANem在内网中搭建一个“网关”,使进行测试的流量“通过”这个网关,在此网关中进行延迟、丢包、损坏包等操作,进而构建弱网环境,复现问题。

步骤

配置虚拟机

是否需要双网卡

自己搭建WANem而不是使用同事搭建好的环境的原因在于,同事只给WANem配置了一张网卡,且WANem存在bug,不能指定对某个IP进行规则添加(理论上是可以的,但是在实践中碰壁),以至于丢包丢到web控制台无法控制,在自己搭建过程中,使用的版本是WANem,惊讶地发现竟然带着LXDE,一切都省力起来了。
假如开放给他人使用,需要额外添加网卡,仅做前期探索或测试可以不添加。

配置

我分配给这台虚拟机的配置是1核CPU 1GRAM 8G HDD,后面发现分多了,其实512M RAM + 4G HDD就够了,使用CD LIVE的话,甚至不需要磁盘。

启动

挂载完WANem镜像后直接启动,我是用的版本并不需要像其他版本一样在以下界面敲回车。
WANem-boot
进入LXDE之后,设置网络(可选)。
公司网络IP MAC绑定,不能使用DHCP
WANem-Network
在此处编辑连接,随后在以下位置连接网络(是的,不会主动连接)。
WANem-Connect
在已经打开的Midori中,选择Advanced Mode,进行简易的弱网环境配置,如下图。
WANem-Advanced-Mode
上图中的eth0是将要设置的网卡,点击start后,即可开始配置网络情况。
WANem-Advanced-Mode
简单介绍一下以上配置
针对单个IP的rule在我的实践中依旧没有成功
如果愿意帮忙可以留言,博主会发送具体情况,感激不尽

参数 含义
Packet Limit 用来设置包的队列大小,默认为1000,当队列超过1000时,超过的包将被丢弃
Symmetrical network 对称网络,选中为Yes的时候,应用网络的规则将在数据包来回的方向上都生效
Choose BW 从快速列表选择带宽
Specify BW 自定义带宽
Delay 延时,这里设置的是单向的延时
Jitter 抖动
Correlation 相关性,用来设置这个包的延迟时间与上一个包的时间的相关度
Loss 丢包率
Correlation 相关性,以一定的概率发生突发的大量的丢包,但平均丢包率不会超过Loss定义的值
Duplication 重包率,以一定概率生成某个包的多份拷贝,并按随机时间到达目标端
Correlation 相关性,类似Loss的
Packet reordering 包重排序率,按概率将包的顺序打乱,gap用来确定包重排序的个数,不设置更接近真实的环境
Corruption 错包率,按概率产生噪音,即格式错误的包
Idle timer Disconnect 空闲断开定时器,当网络空闲时,按设定的时间对Type定义的协议断开连接
Random Disconnect 按Type随机断开
MTTF 平均失效前时间,用Low和High定义两个极值
MTTR 平均恢复前时间
IP source address 匹配的源IP地址
IP source subnet 源IP地址的子网
IP dest address 匹配的目标IP地址
IP dest subnet 匹配的目标IP地址的子网

配置客户端

在测试客户端设置路由的下一跳

1
2
3
4
5
6
# 删除原来默认的下一跳
route add -net default netmask 0.0.0.0 gw <原网关地址>
# 设置默认的下一跳
route add -net default netmask 0.0.0.0 gw <WANemIP>
# 设置某个IP的下一跳
route add -net <某IP> netmask 255.255.255.255 gw <WANemIP>

至此,测试客户端默认将以WANem为网关,进行网络通信。

ICMP报文的奇怪现象

在完成以上操作后,ping命令发出的ICMP包并未丢包,延迟也极低,但是在此环境下的业务测试可以证实WANem的配置已生效。推测原因可能是客户端是ARM架构的嵌入式设备,系统经过精简,可能存在bug,等有多余资源分配虚拟机后,在对此现象在X86上用正常发行版进行测试
事后又看了一眼路由表,发现ping的地址的网关并不是WANem的网关,强行修改后,一切正常。