本文主要介绍如何使用 Chaosd 模拟磁盘故障场景。使用该功能,你可以在物理机器上模拟磁盘读写负载(通过 dd)或磁盘填充(通过 ddfallocate)。

使用命令行模式创建实验

本节介绍如何在命令行模式中创建磁盘故障实验。

在创建磁盘故障实验前,可运行以下命令行查看 Chaosd 支持的磁盘故障类型:

  1. chaosd attack disk -h

输出结果如下所示:

  1. disk attack related command
  2. Usage:
  3. chaosd attack disk [command]
  4. Available Commands:
  5. add-payload add disk payload
  6. fill fill disk
  7. Flags:
  8. -h, --help help for disk
  9. Global Flags:
  10. --log-level string the log level of chaosd, the value can be 'debug', 'info', 'warn' and 'error'
  11. Use "chaosd attack disk [command] --help" for more information about a command.

目前 Chaosd 支持创建磁盘读负载实验、磁盘写负载实验、磁盘填充实验。

模拟磁盘读负载

模拟磁盘读负载命令

  1. chaosd attack disk add-payload read -h

输出结果如下所示:

  1. read payload
  2. Usage:
  3. chaosd attack disk add-payload read [flags]
  4. Flags:
  5. -h, --help help for read
  6. -p, --path string 'path' specifies the location to read data.If path not provided, payload will read from disk mount on "/"
  7. -n, --process-num uint8 'process-num' specifies the number of process work on reading , default 1, only 1-255 is valid value (default 1)
  8. -s, --size string 'size' specifies how many units of data will read from the file path.'unit' specifies the unit of data, support c=1, w=2, b=512, kB=1000, K=1024, MB=1000*1000,M=1024*1024, , GB=1000*1000*1000, G=1024*1024*1024 BYTESexample : 1M | 512kB
  9. Global Flags:
  10. --log-level string the log level of chaosd, the value can be 'debug', 'info', 'warn' and 'error'

模拟磁盘读负载相关配置说明

配置项 配置缩写 说明
path p 指定所读数据的文件路径。如果没有设置此参数,或者设置参数值为空字符串,则从目录“/”所挂载的虚拟磁盘文件读取。根据读取文件的权限不同,会需要用户使用一定的权限运行本程序。 string 类型,默认为””
process-num n 指定使用多少个并发运行的 dd 进程执行程序。 uint8 类型,默认值为 1,范围为 1-255
size s 指定读取多少数据。size 为 多个 dd 读数据的总量。

模拟磁盘读负载示例

  1. chaosd attack disk add-payload read -s 1000G -n 7 -p /dev/zero

输出结果如下所示:

  1. andrew@LAPTOP-NUS30NQD:~/chaosd/bin$ ./chaosd attack disk add-payload read -s 1000G -n 7 -p /dev/zero
  2. [2021/05/20 13:54:31.323 +08:00] [INFO] [disk.go:128] ["5242880+0 records in\n5242880+0 records out\n5242880 bytes (5.2 MB, 5.0 MiB) copied, 4.13252 s, 1.3 MB/s\n"]
  3. [2021/05/20 13:54:46.977 +08:00] [INFO] [disk.go:147] ["146285+0 records in\n146285+0 records out\n153390940160 bytes (153 GB, 143 GiB) copied, 15.6513 s, 9.8 GB/s\n"]
  4. [2021/05/20 13:54:47.002 +08:00] [INFO] [disk.go:147] ["146285+0 records in\n146285+0 records out\n153390940160 bytes (153 GB, 143 GiB) copied, 15.6762 s, 9.8 GB/s\n"]
  5. [2021/05/20 13:54:47.004 +08:00] [INFO] [disk.go:147] ["146285+0 records in\n146285+0 records out\n153390940160 bytes (153 GB, 143 GiB) copied, 15.6777 s, 9.8 GB/s\n"]
  6. [2021/05/20 13:54:47.015 +08:00] [INFO] [disk.go:147] ["146285+0 records in\n146285+0 records out\n153390940160 bytes (153 GB, 143 GiB) copied, 15.6899 s, 9.8 GB/s\n"]
  7. [2021/05/20 13:54:47.018 +08:00] [INFO] [disk.go:147] ["146285+0 records in\n146285+0 records out\n153390940160 bytes (153 GB, 143 GiB) copied, 15.6914 s, 9.8 GB/s\n"]
  8. [2021/05/20 13:54:47.051 +08:00] [INFO] [disk.go:147] ["146285+0 records in\n146285+0 records out\n153390940160 bytes (153 GB, 143 GiB) copied, 15.7254 s, 9.8 GB/s\n"]
  9. [2021/05/20 13:54:47.074 +08:00] [INFO] [disk.go:147] ["146285+0 records in\n146285+0 records out\n153390940160 bytes (153 GB, 143 GiB) copied, 15.7487 s, 9.7 GB/s\n"]
  10. Read file /dev/zero successfully, uid: 4bc9b74a-5fe2-4038-b4f2-09ae95b57694

模拟磁盘写负载

模拟磁盘写负载命令

  1. chaosd attack disk add-payload write -h

输出结果如下所示:

  1. write payload
  2. Usage:
  3. chaosd attack disk add-payload write [flags]
  4. Flags:
  5. -h, --help help for write
  6. -p, --path string 'path' specifies the location to fill data in.If path not provided, payload will write into a temp file, temp file will be deleted after writing
  7. -n, --process-num uint8 'process-num' specifies the number of process work on writing , default 1, only 1-255 is valid value (default 1)
  8. -s, --size string 'size' specifies how many units of data will write into the file path.'unit' specifies the unit of data, support c=1, w=2, b=512, kB=1000, K=1024, MB=1000*1000,M=1024*1024, , GB=1000*1000*1000, G=1024*1024*1024 BYTESexample : 1M | 512kB
  9. Global Flags:
  10. --log-level string the log level of chaosd, the value can be 'debug', 'info', 'warn' and 'error'

模拟磁盘写负载相关配置说明

配置项 配置缩写 说明
path p 指定所写数据的文件路径。如果没有设置此参数,或者设置参数值为空字符串,则会在程序执行目录下创建一个临时文件。根据写入文件的权限不同,会需要用户使用一定的权限运行本程序。 string 类型,默认为 “”
process-num n 指定使用多少个并发运行的 dd 进程执行程序。 uint8 类型。默认值为 1,范围为 1-255
size s 指定写入多少数据,size 为 多个 dd 写数据的总量。 string 类型,默认为””,合法形式为一个整数加一个单位。例如:1M、512kB。支持的单位有 c=1、w=2、b=512、kB=1000、K=1024、MB=1000*1000,M=1024*1024、GB=1000*1000*1000、G=1024*1024*1024 BYTE 等。size 不能为 “” 。

模拟磁盘写负载示例

  1. chaosd attack disk add-payload write -s 2G -n 8

输出结果如下所示:

  1. [2021/05/20 14:28:14.452 +08:00] [INFO] [disk.go:128] ["0+0 records in\n0+0 records out\n0 bytes copied, 4.3e-05 s, 0.0 kB/s\n"]
  2. [2021/05/20 14:28:16.793 +08:00] [INFO] [disk.go:147] ["256+0 records in\n256+0 records out\n268435456 bytes (268 MB, 256 MiB) copied, 2.32841 s, 115 MB/s\n"]
  3. [2021/05/20 14:28:16.793 +08:00] [INFO] [disk.go:147] ["256+0 records in\n256+0 records out\n268435456 bytes (268 MB, 256 MiB) copied, 2.3344 s, 115 MB/s\n"]
  4. [2021/05/20 14:28:16.793 +08:00] [INFO] [disk.go:147] ["256+0 records in\n256+0 records out\n268435456 bytes (268 MB, 256 MiB) copied, 2.33312 s, 115 MB/s\n"]
  5. [2021/05/20 14:28:16.793 +08:00] [INFO] [disk.go:147] ["256+0 records in\n256+0 records out\n268435456 bytes (268 MB, 256 MiB) copied, 2.33466 s, 115 MB/s\n"]
  6. [2021/05/20 14:28:16.793 +08:00] [INFO] [disk.go:147] ["256+0 records in\n256+0 records out\n268435456 bytes (268 MB, 256 MiB) copied, 2.33189 s, 115 MB/s\n"]
  7. [2021/05/20 14:28:16.793 +08:00] [INFO] [disk.go:147] ["256+0 records in\n256+0 records out\n268435456 bytes (268 MB, 256 MiB) copied, 2.33752 s, 115 MB/s\n"]
  8. [2021/05/20 14:28:16.793 +08:00] [INFO] [disk.go:147] ["256+0 records in\n256+0 records out\n268435456 bytes (268 MB, 256 MiB) copied, 2.33295 s, 115 MB/s\n"]
  9. [2021/05/20 14:28:16.794 +08:00] [INFO] [disk.go:147] ["256+0 records in\n256+0 records out\n268435456 bytes (268 MB, 256 MiB) copied, 2.3359 s, 115 MB/s\n"]
  10. Write file /home/andrew/chaosd/bin/example255569279 successfully, uid: e66afd86-6f3e-43a0-b161-09447ed84856

模拟磁盘填充

模拟磁盘填充命令

  1. chaosd attack disk fill -h

输出结果如下所示:

  1. fill disk
  2. Usage:
  3. chaosd attack disk fill [flags]
  4. Flags:
  5. -d, --destroy destroy file after filled in or allocated
  6. -f, --fallocate fill disk by fallocate instead of dd (default true)
  7. -h, --help help for fill
  8. -p, --path string 'path' specifies the location to fill data in.If path not provided, a temp file will be generated and deleted immediately after data filled in or allocated
  9. -c, --percent string 'percent' how many percent data of disk will fill in the file path
  10. -s, --size string 'size' specifies how many units of data will fill in the file path.'unit' specifies the unit of data, support c=1, w=2, b=512, kB=1000, K=1024, MB=1000*1000,M=1024*1024, , GB=1000*1000*1000, G=1024*1024*1024 BYTESexample : 1M | 512kB
  11. Global Flags:
  12. --log-level string the log level of chaosd, the value can be 'debug', 'info', 'warn' and 'error'

模拟磁盘填充相关配置说明

配置项 配置缩写 说明
destroy d 如果此参数为 true ,则在填充文件后立即删除填充文件 bool 类型,默认为 false。
fallocate f 如果此参数为 true ,则使用 linux 调用 fallocate 来快速申请磁盘空间,此时 size 必须大于 0。如果此参数为 false,则使用 linux 调用 dd 以相对较慢速度填充磁盘。 bool 类型,默认为 true。
path p 指定所写数据的文件路径。如果没有设置此参数,或者设置参数值为空字符串,则会在程序执行目录下创建一个临时文件。根据写入文件的权限不同,会需要用户使用一定的权限运行本程序。 string 类型,默认为 “”
percent c 指定填充多少百分比磁盘。 string 类型,默认为 “”,可以填入 uint 类型的正整数, size 不能和 percent 都为 “”
size s 指定写入多少数据。 string 类型,默认为””,合法形式为一个整数加一个单位。例如:1M、512kB。支持的单位有 c=1、w=2、b=512、kB=1000、K=1024、MB=1000*1000,M=1024*1024、GB=1000*1000*1000、G=1024*1024*1024 BYTE 等。size 不能和 percent 都为 “” 。

模拟磁盘填充示例

  1. chaosd attack disk fill -c 50 -d

输出结果如下所示:

  1. [2021/05/20 14:30:02.943 +08:00] [INFO] [disk.go:215]
  2. Fill file /home/andrew/chaosd/bin/example623832242 successfully, uid: 097b4214-8d8e-46ad-8768-c3e0d8cbb326

使用服务模式创建实验

(正在持续更新中)