排查事件 ID 50 错误消息

本文可帮助排查事件 ID 50 错误消息。

现象

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

事件 ID:50
事件类型: 警告
事件源:Ftdisk
说明:{丢失的延迟写入数据} 系统尝试将文件数据从缓冲区传输到 \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 尝试将文件系统缓存管理器(而不是硬件级缓存)中的信息写入物理磁盘,则会记录事件 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
说明:{丢失的延迟写入数据} 系统尝试将文件数据从缓冲区传输到 \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 消息中的十六进制数据转换为状态代码时,请记住,这些值以小尾格式表示。

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

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 消息中的十六进制数据转换为状态代码时,请记住,这些值以小尾格式表示。 由于状态代码是你感兴趣的唯一信息片段,因此以 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。 此信息在事件说明中显示为“丢失延迟写入数据”。