排查事件 ID 50 错误消息

本文有助于排查事件 ID 50 错误消息的问题。

症状

当 Windows 将信息写入物理磁盘时,它可能会在系统日志中记录以下事件消息:

事件 ID:50
事件类型:警告
事件源:Ftdisk
说明: {丢失 Delayed-Write 数据} 系统尝试将文件数据从缓冲区传输到 \Device\HarddiskVolume4。 写入操作失败,可能只有部分数据已写入文件。
数据:
0000: 00 00 04 00 02 00 56 00
0008: 00 00 00 00 32 00 04 80
0010: 00 00 00 00 00 00 00 00
0018: 00 00 00 00 00 00 00 00
0020: 00 00 00 00 00 00 00 00
0028: 11 00 00 80

事件 ID:26
事件类型:信息
事件源:应用程序弹出窗口
说明:Windows - 延迟写入失败:Windows 无法保存文件 \Device\HarddiskVolume4\Program Files\Microsoft SQL Server\MSSQL$INSTANCETWO\LOG\ERRORLOG 的所有数据。 数据已丢失。 此错误可能是由计算机硬件或网络连接故障引起的。

请尝试将此文件保存到其他位置。

这些事件消息的含义完全相同,并且出于相同的原因而生成。 本文重点介绍事件 ID 50。

注意

说明中的设备和路径以及这些消息中的特定十六进制数据因导致事件的确切情况而异。

更多信息

事件 ID 50 消息有多种不同的源。 例如,如果存在涉及重定向器的网络连接问题,则会发生从 MRxSmb 源记录的事件 ID 50 消息。 本文介绍与磁盘写入问题有关的事件 ID 50 消息。 查看事件 ID 50 消息,验证它是否涉及磁盘写入问题以及本文是否适用。

在此上下文中,如果 Windows 尝试将文件系统缓存管理器的信息 (而不是硬件级缓存) 写入物理磁盘,则 Windows 将记录事件 ID 50 消息。 此写入行为称为写回或延迟写入缓存,是 Windows 内存管理功能的一部分。 写回缓存可提高系统性能。 但是,延迟写入操作失败可能会导致数据丢失或卷完整性损失。

通常,当应用程序向 Windows 发送写入请求时,缓存管理器会缓存写入请求,并向应用程序报告写入成功。 稍后,缓存管理器将数据写入物理磁盘,然后清除缓存。 如果在写入操作期间发生错误,当缓存管理器清除缓存时,数据将丢失。

写入非关键数据(例如日志记录进程)的应用程序或进程使用缓存管理器来提高整体性能。 写入关键数据(例如SQL Server)的应用程序不使用缓存管理器。 此类应用程序设置一个 FILE_FLAG_NO_BUFFERING 标志,以确保事务直接在磁盘上完成。 直接到磁盘写入永远不会生成事件 ID 50 消息。

事件 ID 50 消息类似于事件 ID 9 或事件 ID 11 消息。 尽管错误不如事件 ID 9 或事件 ID 11 消息所指示的错误严重,但可以对事件 ID 50 消息使用与事件 ID 9 和事件 ID 11 消息相同的故障排除技术。 但请记住,堆栈中的任何内容都可能导致丢失延迟写入,例如筛选器驱动程序和微型端口驱动程序。

解码示例事件

本文的 “症状 ”部分提供了事件 ID 50 消息的以下示例:

事件 ID:50
事件类型:警告
事件源:Ftdisk
说明: {丢失 Delayed-Write 数据} 系统尝试将文件数据从缓冲区传输到 \Device\HarddiskVolume4。 写入操作失败,可能只有部分数据已写入文件。
数据:
0000: 00 00 04 00 02 00 56 00
0008: 00 00 00 00 32 00 04 80
0010: 00 00 00 00 00 00 00 00
0018: 00 00 00 00 00 00 00 00
0020: 00 00 00 00 00 00 00 00
0028: 11 00 00 80

如何标识目标磁盘

可以使用事件 ID 消息的“说明”部分中为驱动器列出的符号链接(例如: \Device\HarddiskVolume4)来标识写入操作的目标磁盘。

如何解码数据部分

事件 ID 50 消息 (以及事件 ID 9、11、51 或类似的“DISK”消息) 包括可用于帮助识别问题的二进制数据。 该消息包括以下数据部分:

数据:
0000: 00 00 04 00 02 00 56 00
0008: 00 00 00 00 32 00 04 80
0010: 00 00 00 00 00 00 00 00
0018: 00 00 00 00 00 00 00 00
0020: 00 00 00 00 00 00 00 00
0028: 11 00 00 80

注意

将事件 ID 消息中的十六进制数据转换为状态代码时,请记住,值以 little-endian 格式表示。

下表描述了此消息的每个偏移量。

OffsetLengthValues 长度
0x00 2 未使用
0x02 2 转储数据大小 = 0x0004
0x04 2 字符串数 = 0x0002
0x06 2 字符串的偏移量
0x08 2 事件类别
0x0c 4 NTSTATUS 错误代码
0x10 8 未使用
0x18 8 未使用
0x20 8 未使用
0x28 4 NT 状态错误代码

NT 状态错误代码

最终状态代码是事件 ID 50 消息中最重要的信息片段。 这是发出写入请求时返回的错误代码,也是信息的关键来源。 在此示例中,最终状态代码列在数据集的第0x28行。 以“0028:”开头,并包含以下行中的四个八进制数:

0028: 11 00 00 80

将事件 ID 50 消息中的十六进制数据转换为状态代码时,请记住,值以 little-endian 格式表示。 由于状态代码是你感兴趣的唯一信息片段,因此以 WORDS 格式而不是 BYTES 格式查看数据可能更容易。 如果执行此操作,则字节将采用正确的格式,并且数据可能更易于快速解释。

若要更改数据视图,请在“事件属性”窗口中选择“字词”。 在 “数据字词 ”视图中,示例的数据部分如下所示:

() Bytes (.) 
Words 0000: 00040000 00560002 00000000 80040032 0010: 00000000 00000000 00000000 00000000 0020: 00000000 00000000 80000011

在这种情况下,最终状态代码为0x80000011。 此状态代码映射到 STATUS_DEVICE_BUSY 并表示设备当前正忙。 这就是写入操作失败的原因。

有关 NT 状态代码的详细信息,请参阅 使用 NTSTATUS 值。 代码列表也可在 NTSTATUS 的 Windows 软件开发人员工具包 (SDK) 中找到 。H 文件。

事件类别代码

在此示例中,第二行列出了与事件 ID 50) 关联的代码 (事件类别代码。 此行以“0008:”开头,包括以下行的最后 4 个字节:

0008: 00 00 00 00 32 00 04 80

在这种情况下,错误代码0x80040032,对应于 IO_LOST_DELAYED_WRITE。 此信息在事件说明中显示为“丢失 Delayed-Write 数据”。