我有多路径IO配置的服务器2012刀片,在MPIO路径故障期间显示如下警告:
The IO operation at logical block address 0 for Disk 7 was retried.
我知道导致警告发生的原因所以我不是在寻找原因,但这个消息实际意味着什么?
这是否意味着如果这个IO是写操作,那么服务器实际上丢失了它试图写入的数据?
感谢您对此警告信息含义的任何启示.
不,这并不意味着数据丢失.它只是意味着当IO系统等待它完成时IRP(IO请求包)超时,因此再次尝试.当线程开始任何IO操作时,IO管理器会创建一个IRP来表示操作通过系统时的操作.
IRP以其初始状态存储在缓冲区/后备列表中,以便在第一次失败时可以重试.这提供了人们期望从任何事务系统中获得的原子性,这样我们就可以更加确信您不会将大量已损坏或不完整的数据写入磁盘.
在MPIO发生故障时,此事件非常有意义.假设Windows从SAN存储中读取或写入内容.发出请求,同时我将其中一条电??缆切断到SAN.该请求永远不会完成,因此Windows将再次尝试请求,只有这次请求将遵循其他路径.
当磁盘负担过重或非常慢时,也会发生这些事件.您可能会注意到这些消息与计划备份等一致.磁盘可能只是缓慢而繁忙,并且一些随机IRP超时并且必须再次尝试. IRP可能会陷入中断服务程序,或延迟程序调用等等.
我可以看到你的堆栈中有很多IO过滤器驱动程序也加剧了这个问题.
并不是说这种行为在以前版本的Windows中没有像这样发生,只是微软显然决定在Win8 / Server 2012中展示这些事件.
编辑:您可以使用内核调试器找到线程的未完成IRP:kd> !irp 1a2b3c4d,您之前通过发出命令kd>找到该地址. !进程8f7d6c4a,它将列出与该进程相关的线程相关的所有IRP. KD> !process 0 0列出所有正在运行的进程.
一旦使用!irp命令列出有关IRP的信息,您就可以轻松找到上次处理IRP的驱动程序,因为它将具有>在列表中指向它.然后,要获得有关该驱动程序使用该IRP执行的操作的更多信息,请执行kd> !devobj 1a2b3c4d5e6f其中,这是设备对象的实际地址.
然后做一个kd> dt 0x1a2b3c3c2b1a _CLASS_PRIVATE_FDO_DATA使用您获得的PrivateFdoData结构的地址.
现在您已准备好转储从PrivateFdoData获得的ConsunsferPacketsList数据结构.
这个想法是,你正在追踪上次看到IRP的驱动程序在做什么.如果IRP的AWOL太长,它会超时并从头开始重试.这可能是由许多事情造成的……甚至是一个迷路的宇宙射线.但重要的是,事务将从一开始就重试,并且在IO经理说它之前不会被视为完成.
哦,还有与线程无关的IO,这是一种完全不同的蠕虫病毒.