本文分享自天翼云开发者社区《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住或超时的错误等,在开发测试中比较实用。

nvme磁盘故障注入方法的更多相关文章

  1. VMware虚拟机提示“锁定文件失败 打不开磁盘”解决方法

    VMware虚拟机提示“锁定文件失败 打不开磁盘”解决方法 摘自: http://www.xitongcheng.com/jiaocheng/xtazjc_article_40299.html 发布时 ...

  2. Ubuntu14.04和Windows双系统时无法挂载磁盘解决方法

    基本状况:我电脑Ubuntu14.04 和 Windows10 双系统,一个固态磁盘,一个机械磁盘.Ubuntu14.04装固态里面了,固态里没有Windows内容. 问题:Ubuntu14.04系统 ...

  3. 磁盘挂载方法 fdisk parted

    1创建磁盘分区 [root@web01 ~]# fdisk -cu /dev/sdc -c 关闭dos兼容模式-u 使用扇区进行分区 (默认位柱面)[root@web01 ~]# partprobe ...

  4. RAID磁盘恢复方法之一Winhex镜像硬盘与镜像中恢复数据图文

    winhex镜像硬盘和ghost备份是完全不同的,ghost只能克隆或者镜像分区内正常的数据,删除的数据他是不会克隆的,所以在数据恢复应用中,ghost对我们来讲作用就不大了,而使用winhex备份( ...

  5. openstack havana块存储Cinder磁盘加密方法研究

    http://blog.csdn.net/cloudresearch/article/details/19092219 在openstack havana的release note中有如下介绍“Att ...

  6. Vmware Linux虚拟机磁盘扩容方法

    我的LINUX版本是ubuntu12.04 32bit.今天在下载android源代码的时候发现自己最初给这个虚拟机分配的磁盘空间不足了(只有20G).所以就需要给磁盘扩容.网上大致搜索了一下,主要有 ...

  7. ESXi以及WorkStation缩减thin provision模式Linux虚拟机磁盘的方法

    1. 公司的服务器采用ESXi 进行管理. 有时候为了灵活性,需要将虚拟机从ESXi服务器上面导出来. 放置到不同的客户机器上面去. 2. 但是发现,比如我在linux里面安装了Oracle数据库, ...

  8. 最简单的Linux虚拟机磁盘扩容方法

    思路:1.虚拟机增加磁盘容量: 2.将增加的磁盘容量增加到系统分区中: 准备阶段: 下载Gparted软件:https://sourceforge.net/projects/gparted/files ...

  9. 阿里云SSD等磁盘挂载方法(详细步骤完整版)

    1,根据提示购买一块,在阿里云管理磁盘的列表"更多"点击,选中"挂载": 2,进入远程实例(远程系统),管理-->存储-->磁盘管理,在右侧看到新挂 ...

  10. android 填满手机磁盘空间方法

    http://blog.csdn.net/fulinwsuafcie/article/details/9700619 很多时候我们需要进行临界测试. 譬如当手机盘空间存满的条件下应用会有何表现等. 之 ...

随机推荐

  1. 六、FreeRTOS学习笔记-任务挂起和恢复

    任务的挂起与恢复的API函数介绍 API函数 描述 vTaskSuspend() 挂起任务 vTaskResume() 恢复被挂起的任务 xTaskResumeFromISR() 在中断中恢复被挂起的 ...

  2. k8s之镜像加速

    部分国外镜像仓库无法访问,但国内有对应镜像源,可以从以下镜像源拉取到本地然后重改tag即可: 阿里云镜像仓库   可以拉取k8s.gcr.io镜像 #示例 docker pull k8s.gcr.io ...

  3. Sublime之快捷操作

    列举常用的Sublime操作,涉及操作 1.每行默认需要统一添加逗号 1)全选 ctrl + a 2) 组合键 ctrl + shift + l 即可进行操作 (这里是L哦) 之后也可以使用HOME键 ...

  4. 2024 盘古石数据取证 服务器部分wp

    1. 分析内部IM服务器检材,在搭建的内部即时通讯平台中,客户端与服务器的通讯端口是:[答案格式:8888][★☆☆☆☆] 8065 2. 分析内部IM服务器检材,该内部IM平台使用的数据库版本是: ...

  5. StarBlog博客Vue前端开发笔记:(1)准备篇

    前言 之前在[基于.NetCore 开发博客项目 StarBlog - (32) 第一期完结]里说到 StarBlog 的 Vue 前端系列已经写好了 本来打算后面再发的,不过最近有点懒没去写新的文章 ...

  6. RocketMQ系列3:核心技术介绍

    1 介绍 RocketMQ是一款分布式消息中间件,其核心技术涉及多个核心概念,包括主题.队列.消息.生产者.消费者.消费者分组以及订阅关系.以下是对这些核心技术的详细说明: 2 核心技术实现 2.1 ...

  7. 【Rive】Android与Rive交互

    1 Android与Rive交互的常用接口 1.1 RiveAnimationView参数 <app.rive.runtime.kotlin.RiveAnimationView android: ...

  8. 【转载】wget命令详解

    导读: wget是Linux中的一个下载文件的工具,wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上. 它用在命令行下. ...

  9. 2024 Nuxt3 年度生态总结

    hello,大家好,我是程序员海军.很荣幸能与大家分享我今年的第三篇文章.在过去的一年里,我深入探索了Nuxt3,并在多个项目中实际应用了这一前沿框架,从而对其功能和应用有了全面而深刻的理解.今天,我 ...

  10. Qt编写物联网管理平台40-类型种类

    一.前言 为了增强本系统的拓展性,做成通用的物联网管理平台,特意将控制器主设备类型.探测器子设备类型.对应种类符号等信息,全部做成表格可自定义添加和修改,这样在控制器信息表和探测器信息表管理的时候,可 ...