一个计算机技术爱好者与学习者

0%

好好学OpenStack:虚拟机在线迁移过程中的故障注入

1. 前言

《虚拟机在线迁移的性能统计》一文中,已经找到了虚拟机迁移过程中性能统计的方法,可以统计出迁移时间、停机时间、迁移数据量等指标。

而实际生产环境是复杂的,所以我们想模拟一些环境,看看这些环境(故障)对于虚拟机迁移性能的影响。本文就来研究一下CPU故障、内存故障、磁盘故障、网络故障等的模拟方法。

2. 故障注入

故障注入有两个大的思路:一个是注入到被迁移的虚拟机,另一个是注入到宿主机。

本次故障注入主要有CPU故障、内存故障、磁盘故障、网络故障。

故障模拟方法如下(感谢卢澄志同学提供模拟方法):

  • 对于CPU故障、内存故障、磁盘故障的模拟,使用stress或者stress-ng
  • 对于网络故障的模拟,使用netem

参考文档:

3. 安装使用stress-ng

3.1. stress-ng简介

stress-ng是一个压力测试工具,用于对计算机系统实施较大的工作负荷,以验证其健壮性和稳定性,或者用于检测可能存在的软硬件问题。

stress-ng 特点:

  • 提供了超过 240 种压力测试。
  • 各种压力测试可以单独运行,也可以以随机的方式混合运行,以便在真实场景下对系统进行压力测试。
  • 还可以实施各种操作系统调用的压力测试。例如,可以选择进行 CPU 忙测试、硬盘测试、内存测试等。
  • 通过调整测试时间、测试并发量等参数,可以根据需求定制不同的压力测试环境。

3.2. 安装stress-ng

1
apt-get install stress-ng

3.3. stress-ng使用示例

3.3.1. 模拟CPU压力

产生3个CPU进程1分钟后关闭

1
stress-ng --cpu 3 --verbose --timeout 1m

3.3.2. 模拟内存压力

产生2个10MB的内存进程1分钟后关闭

1
stress-ng --vm 2 --vm-bytes 10M --vm-keep --timeout 1m

3.3.3. 模拟IO进程压力

产生3个IO进程1分钟后关闭

1
stress-ng --io 3 --timeout 1m

4. 安装使用tc netem

4.1. tc netem简介

TC(Network Control) 是 Linux 系统中的 “流量控制” 工具,TC netem(network emulator)则是 TC 的一个扩展,用于模拟网络的不同条件,以便在各种环境下测试网络应用。

TC netem 可以模拟的网络条件包括但不限于:

  • 延迟:模拟网络传输数据包之间的延迟,包括固定的延迟和随机的延迟。
  • 丢包:模拟网络数据包在传输过程中的丢失。
  • 乱序:模拟网络数据包接收顺序的混乱。
  • 带宽限制:模拟某种预设的网络带宽条件。
  • 包重复:模拟在网络中发送重复数据包的情况。

所有这些条件都可以单独或一起使用,以模拟几乎任何可能的网络环境。使用tc netem可以让开发者更有效地进行网络应用开发和测试,从而提高应用在实际网络环境下的性能和稳定性。

4.2. 安装tc netem

在Ubuntu16中,tc netem不需要安装,系统自带。

4.3. tc netem使用示例

4.3.1. 模拟延迟传输

报文延迟 100ms 发送

1
tc qdisc add dev eth0 root netem delay 100ms

报文延迟的时间在 100ms ± 20ms 之间,具体值随机选择

1
tc qdisc replace dev eth0 root netem delay 100ms 20ms

4.3.2. 模拟丢包率

丢包率是 0.3%,并且当前报文丢弃的可能性和前一个报文 25% 相关。

1
tc qdisc change dev eth0 root netem loss 0.3% 25%

4.3.3. 模拟包重复

随机产生 50% 重复的包

1
tc qdisc change dev eth0 root netem duplicate 50%

4.3.4. 模拟包损坏

随机产生 2% 损坏的报文(在报文的随机位置造成一个比特的错误)

1
tc qdisc add dev eth0 root netem corrupt 2%

4.3.5. 模拟包乱序

固定的每隔一定数量的报文就乱序一次:每5个报文会正常发送,其他的报文延迟 100ms

1
tc qdisc change dev eth0 root netem reorder 50% gap 3 delay 100ms

注意:要想看到 ping 报文的乱序,我们要保证发送报文的间隔小于报文的延迟时间 100ms,这里可以用 -i 0.05 把发送间隔设置为 50ms。

1
ping -i 0.05 192.168.56.101

使用概率来选择乱序的报文:50% 的报文会正常发送,其他报文(1-50%)延迟 300ms 发送。

1
tc qdisc change dev eth0 root netem reorder 50% 15% delay 300ms

4.3.6. 取消模拟

1
tc qdisc del dev eth0 root