nvme磁盘故障注入方法

天翼云开发者社区
• 阅读 308

本文分享自天翼云开发者社区《nvme磁盘故障注入方法》,作者:曹****飞

在存储系统中,磁盘的故障是很可能出现的问题。存储软件的设计需要对故障进行处理,提高系统的健壮性。然而磁盘的故障是不可控的,当我们想测试软件故障处理的分支时,不是很方便。用软件模拟的方法能覆盖的场景比较少,而且和实际故障的差距会比较大。因此,如果能让故障下沉到磁盘,尽可能的靠近磁盘,才能构造出尽可能真实的故障场景。本文针对nvme磁盘,在磁盘驱动这一层调研了几种可以注入磁盘故障的方法。

1. write uncorrectable 通过向nvme控制器发送write uncor命令,标记指定的LBA范围为invalid,当读到这个LBA范围时,ctrl会返回Unrecovered Read Error错误。可以用于模拟读的media error。如果要清除invalid状态,需要向这个LBA范围写入数据,覆盖调invalid标记。 不过,write uncor命令不是所有厂家的盘都支持。如果不支持,会返回invalid op code错误。查看是否支持的方法,可以看controller数据结构中的oncs->write_unc是否为1。 还有一个缺点是只能注入读故障。

2. write protect 通过设置namespace的属性,可以让namespace写保护,当这个namespace收到写请求时,会返回write error。 缺点是有的厂商的盘不支持这个属性,而且只能注入写故障。

3. 驱动层模拟故障 这是最通用的一种方法,可以构造出各种故障。spdk的代码中就实现了这一功能。下面详细介绍下它的接口。 /**

  • \brief Inject an error for the next request with a given opcode.
  • \param ctrlr NVMe controller.
  • \param qpair I/O queue pair to add the error command,
  • NULL for Admin queue pair.
  • \param opc Opcode for Admin or I/O commands.
  • \param do_not_submit True if matching requests should not be submitted
  • to the controller, but instead completed manually
  • after timeout_in_us has expired. False if matching
  • requests should be submitted to the controller and
  • have their completion status modified after the
  • controller completes the request.
  • \param timeout_in_us Wait specified microseconds when do_not_submit is true.
  • \param err_count Number of matching requests to inject errors.
  • \param sct Status code type.
  • \param sc Status code.
  • \return 0 if successfully enabled, ENOMEM if an error command
  • structure cannot be allocated.
  • The function can be called multiple times to inject errors for different
  • commands. If the opcode matches an existing entry, the existing entry
  • will be updated with the values specified.
  • / int spdk_nvme_qpair_add_cmd_error_injection(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair, uint8_t opc, bool do_not_submit, uint64_t timeout_in_us, uint32_t err_count, uint8_t sct, uint8_t sc); ctrlr: nvme盘的控制器数据结构,每个盘有一个; qpair: 注入故障的qpair,可以是io qpair,也可以是admin qpair。使用哪一种取决于希望在IO路径上还是在管理路径上产生故障; opc: 操作类型,比如read,write等; do_not_submit:如果是true,则这个opc的cmd不会提交到ctrl,而是在 timeout_in_us 到期后手动返回指定的sct,sc。如果是false,则这个opc的cmd会提交到ctrl,等ctrl返回cpl后,将sct和sc改成指定的sct,sc,回调的时候用改过的cpl。命令实际上是执行成功的; timeout_in_us:do_not_submit=true时有效,等待timeout_in_us后再返回sct,sc。范围是(0-18446744073709551615) err_count: 表示注入故障后,此后的多少个该opc的cmd会按照注入的故障来处理,每返回一个注入的故障,err_count减1。减为0的时候不再注入故障,但cmd也不会从 qpair->err_cmd_head 中摘除; sct: 返回的状态码类型; sc: 返回的状态码;

实现的原理是向指定qpair的err_cmd_head链表中添加一个错误的cmd,当下个该类型的cmd提交到该qpair的时候在 _nvme_qpair_submit_request 中遍历这个链表,处理这个cmd,强制修改cpl中的返回值,然后再调用回调,从而模拟故障。

使用此接口可以模拟出读写错误,IO hang住或超时的错误等,在开发测试中比较实用。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
vsan的容量设备故障和缓存设备故障分析
容量设备故障解析:磁盘故障可能是任何存储环境中最常见的故障了,vsan也不例外。磁盘组是vSAN的管理结构,其中包括一个缓存设备和一个或多个容量设备,其容量设备的磁盘多为SATA盘。一台主机可以为VSAN提供最多5个磁盘组:每个磁盘组需要1个SDD以及最少1个、最多6个HDD。每个主机的最多HDD数为5x630。每个
Stella981 Stella981
3年前
DevOps故障排
该书不在解决问的具体步骤,主要是解决问思路与方法。第一章:故障排除的最佳实践沟通,测试,尝试解决问题方案,记录问题和解决安案,了解改动,了解系统如何工作,谨慎使用internet,我到是觉得使用internet,抵制重启。第二章:服务器为什么这么慢?耗尽了CPU、RAM和磁盘I/O资源机器运行缓慢通常是由于消耗了太多的系统
Wesley13 Wesley13
3年前
JAVA 线上故障排查
线上故障主要会包括CPU、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top三连,然后依次jstack、jmap伺候,具体问题具体分析即可。CPU一般来讲我们首先会排查
Stella981 Stella981
3年前
Redis—持久化
一、持久化简介Redis的数据全部存储在内存中,如果突然宕机,数据就会全部丢失,因此必须有一套机制来保证Redis的数据不会因为故障而丢失,这种机制就是Redis的持久化机制,它会将内存中的数据库状态保存到磁盘中。持久化发生了什么|从内存到磁盘
Stella981 Stella981
3年前
Redo日志
当向存储系统写一个数据元素时,通常是先写入主存或者缓冲,然后再写入磁盘,如果系统在写入磁盘的时候,系统发生故障,当系统恢复后,需要再次从磁盘中读取此数据元素的时候,并不知道此时磁盘上所保存的数据元素是正确的还是错误的,Redo日志是一种应对此种故障的比较常用的故障恢复策略。为了确保一个数据元素的完整性,还需要借助事务这一概念,对于更新数据一个元素的redo日
Wesley13 Wesley13
3年前
JAVA 线上故障排查套路,从 CPU、磁盘、内存、网络到GC 一条龙!
点击上方蓝色“方志朋”,选择“设为星标”回复“666”获取独家整理的学习资料!!(https://oscimg.oschina.net/oscnet/1a8cb8085c9749b180e070e2a30b86d3.jpg)线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候
融云IM干货丨IM服务消息推送,客户端版本更新后,如何确保消息不丢失?
确保客户端版本更新后消息不丢失,可以采取以下几种策略:消息持久化:确保消息被存储在可靠的存储介质中,如数据库或磁盘,这样即使客户端或服务端发生故障,消息也不会丢失。对于RabbitMQ等消息队列,需要开启持久化机制,将消息持久化到硬盘上,即使服务重启也能从
流浪剑客 流浪剑客
1年前
NTFS 磁盘管理器:NTFS Disk by Omi NTFS for Mac「支持M1」
是一款NTFS磁盘管理器,支持在Mac电脑上读写NTFS格式的磁盘。它允许用户访问存储在NTFS磁盘上的文件,而无需重新格式化磁盘或使用USB驱动器或云存储等文件传输方法。OmiNTFSMac版旨在与macOS无缝协作,提供对NTFS磁盘的完全读写访问,没
流浪剑客 流浪剑客
1年前
NTFS 磁盘管理器:NTFS Disk by Omi NTFS for Mac 中文版
是一款NTFS磁盘管理器,支持在Mac电脑上读写NTFS格式的磁盘。它允许用户访问存储在NTFS磁盘上的文件,而无需重新格式化磁盘或使用USB驱动器或云存储等文件传输方法。OmiNTFSMac版旨在与macOS无缝协作,提供对NTFS磁盘的完全读写访问,没
一体机场景ceph高可用介绍
一体机场景使用ceph开源架构作为存储系统的主体架构,原生方案支持存储数据高可用性,包括副本数可以灵活控制/支持故障域分隔,数据强一致性/多种故障场景自动进行修复自愈/没有单点故障,自动管理。
天翼云开发者社区
天翼云开发者社区
Lv1
天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。
文章
703
粉丝
15
获赞
40