背景
跑训练的过程中电脑自动重启了,为了满足长期训练的需要,研究一下死机原因
查看系统日志
右键我的电脑——管理——系统工具——事件查看器——系统
检索级别为错误的内容,在死机时间附近查找相关日志,发现如下日志
计算机已经从检测错误后重新启动。检测错误: 0x00000133 (0x0000000000000001, 0x0000000000001e00, 0xfffff8031831c340, 0x0000000000000000)。已将转储的数据保存在: C:\Windows\Minidump\061324-7875-01.dmp。报告 ID: 511a8288-aae8-4d5b-b92f-88ad1f90439b。
搜索以上内容没有得到一个具体的答案。
dmp文件无法直接打开,查询相关软件,可使用以下两个方案进行解析:
WinDbg:这是一个强大的调试工具,适用于深入分析转储文件。它是 Windows 调试工具的一部分,可以从 Microsoft 的网站下载。
WhoCrashed:这是一款用户友好的工具,可以自动分析转储文件,并生成易于理解的报告,帮助用户识别导致崩溃的原因。
Windbg源自于windows官方,可以直接在Microsoft Store中下载安装,(3.6的超高评分),故选用WinDbg进行自检。
WinDbg配置
Windbg的使用可以参考以下链接
https://blog.csdn.net/VinWqx/article/details/111675839
https://www.cnblogs.com/ae6623/p/5029628.html
跟随教程 设置符号链接地址
将符号表地址:SRVC:\Symbolshttp://msdl.microsoft.com/download/symbols 粘贴在输入框中。
备注:当你想打开第二个dmp文件时,可能因为上一个分析记录未清除,导致无法直接分析下一个dmp文件,此时你可以使用快捷键【Shift+F5】来关闭上一个dmp分析记录。
自检
在命令行处输入!analyze -v
SYMBOL_NAME: nt!KeAccumulateTicks+231
MODULE_NAME: nt
IMAGE_NAME: ntkrnlmp.exe
IMAGE_VERSION: 10.0.22621.2134
STACK_COMMAND: .cxr; .ecxr ; kb
BUCKET_ID_FUNC_OFFSET: 231
FAILURE_BUCKET_ID: 0x133_ISR_nt!KeAccumulateTicks
OSPLATFORM_TYPE: x64
OSNAME: Windows 10
FAILURE_ID_HASH: {65350307-c3b9-f4b5-8829-4d27e9ff9b06}
Followup: MachineOwner
SYMBOL_NAME: nt!KeAccumulateTicks+231
这指定了发生崩溃的确切函数及其在函数中的偏移量。nt!KeAccumulateTicks是Windows内核中的函数,+231表示函数起始位置的偏移量。
MODULE_NAME: nt
发生故障的模块(或组件)。这里的nt代表Windows NT内核。
IMAGE_NAME: ntkrnlmp.exe
模块的镜像(可执行文件)名称。ntkrnlmp.exe是Windows NT内核的多处理器版本可执行文件。
根据以上信息,nt内核挂了,ntkrnlmp.exe引起的蓝屏重启,这个进程与硬件交互的必备进程,大概率是硬件挂了。硬件挂掉的原因大概率是因为散热问题,显卡长期使用散热不够导致了挂机。
另一个博主提到svchost.exe,命令行中输入!process
PROCESS ffffdf8c6a9b5080
进程对象地址:ffffdf8c6a9b5080。这是在内核中指向该进程对象的指针。
SessionId: none
会话ID:表示此进程不属于任何特定的用户会话。
Cid: 1060
进程ID(PID):1060。
Peb: 48c1c5000
进程环境块(PEB)地址:48c1c5000。
ParentCid: 0414
父进程ID:414。
DirBase: 217efe000
目录基地址:217efe000。
ObjectTable: ffffb6801079fac0
对象表地址:fffb6801079fac0。
HandleCount:
句柄计数:数据不可访问。
Image: svchost.exe
进程名称:svchost.exe。
VadRoot ffffdf8c83e453f0 Vads 813 Clone 0 Private 22074. Modified 407573. Locked 0.
虚拟地址描述符(VAD)根地址:ffffdf8c83e453f0,VAD数量:813,克隆数量:0,私有页面数量:22074,已修改页面数量:407573,被锁定页面数量:0。
DeviceMap ffffb68009461e80
设备映射地址:fffb68009461e80。
Token ffffb6801108d970
安全令牌地址:fffb6801108d970。
ReadMemory error: Cannot get nt!KeMaximumIncrement value.
读取内存错误:无法获取nt!KeMaximumIncrement值。
fffff78000000000: Unable to get shared data
无法获取共享数据:fffff78000000000。
ElapsedTime 00:00:00.000
已用时间:00:00:00.000。
UserTime 00:00:00.000
用户时间:00:00:00.000。
KernelTime 00:00:00.000
内核时间:00:00:00.000。
QuotaPoolUsage[PagedPool] 336672
配额池使用量(分页池):336672。
QuotaPoolUsage[NonPagedPool] 1164064
配额池使用量(非分页池):1164064。
Working Set Sizes (now,min,max) (8651, 50, 345) (34604KB, 200KB, 1380KB)
工作集大小(当前,最小,最大):(8651,50,345)页,(34604KB,200KB,1380KB)。
PeakWorkingSetSize 281914
峰值工作集大小:281914页。
VirtualSize 2103165 Mb
虚拟内存大小:2103165 MB。
PeakVirtualSize 2103178 Mb
峰值虚拟内存大小:2103178 MB。
PageFaultCount 2212576
页面错误计数:2212576。
MemoryPriority BACKGROUND
内存优先级:后台。
BasePriority 8
基本优先级:8。
CommitCharge 23648
提交的内存使用量:23648页。
根据以上内容,内存管理的时候出现了问题,大概率是爆内存了。
使用!vm
查看内存调度情况
无法读取多个系统地址:
无法获取 nt!PspSessionIdBitmap、nt!MiVisibleState->SessionIdBitmap 等多个地址的数据,这可能表明系统内存结构存在严重损坏或读取内存的操作失败。
没有分页文件:
输出中显示“NO PAGING FILE”,这意味着系统没有启用分页文件。分页文件对于系统内存管理非常重要,尤其在物理内存不足时。
物理内存和系统PTE(页表条目)耗尽:
系统显示物理内存和可用页完全耗尽,且没有剩余的系统PTE。这会导致严重的内存管理问题,导致系统无法正常运行。
已提交的页面数接近极限:
输出中显示“Number of committed pages is near limit”,这表明系统的内存使用已经接近了可用内存的极限。
很好,确定问题了,是因为爆内存了,svchost.exe读内存爆了,ntkrnlmp.exe具体执行内存读取任务,来背了这个锅。
防范建议是:确保系统启用了分页文件,并且分页文件的大小足够大。可以在“系统属性” -> “高级系统设置” -> “性能” -> “设置” -> “高级” -> “虚拟内存”中检查和配置分页文件。
使用!poolused、!memusage等命令同样得到内存溢出的问题,自检完毕,内存溢出,需要使用更小的batch size进行训练。
整个事件最可疑的地方莫过于windows10偷偷地进行了自动更新,使用之前的禁用方法不生效,如果有新的禁用方法务必滴滴我。