怀德维宁

大邦维屏,大宗维翰。怀德维宁,宗子维城。

0%

因磁盘空间变化引发的windows虚拟内存机制分析验证

在工单处理过程中,遇到了一起异常事件,客户在虚拟机重启后发现业务文件丢失(对应文件夹内仅保留了一个dll文件,其他文件被删除),而且重启后系统的磁盘空间增加,因此客户怀疑windows系统或者存储存在问题。后经过分析,发现客户的虚拟机在重启前存在很高的内存压力,在系统日志中可以发现虚拟内存不足的警告事件,因此认为:

(1)业务文件丢失应为被删除的原因,怀疑是使用者操作时误删,dll因为被使用所以无法删除被保留,其他的文件被删除,而由于所需的其他文件已经被加载到内存,系统业务仍然正常运行;

(2)windows重启后磁盘可用空间增加是windows虚拟机内存机制,在内存负载较高时主动占用多余的磁盘空间供内存使用,重启后对应磁盘空间被释放,因此造成重启后磁盘可用空间增加;

现在针对第二点进行windows虚拟内存机制的验证。

验证流程

初始状态

初始状态下,D盘保存有分页文件(大小为17G),虚拟机的总计可提交内存为33G(符合预期,物理内存16G+分页文件17G)。

此时已提交内存大小为8.2g,可提交内存大小为33g,d盘的可用空间为187.1g,分页文件大小为17G

申请大量内存

进行内存压测,申请40G的内存

此时已提交内存大小为47g,可提交内存大小为53g,d盘的可用空间为166.27g,分页文件大小为36G

备注:进程进行内存申请时,一般使用malloc相关函数,申请后虽然可以看到已提交内存增大,但是实际上系统并未在此时实际分配,只有在业务使用memset等函数对内存进行写入时,内存才会被真正分配,在测试时需要注意这一点。

释放申请内存

将申请的40g内存释放

此时已提交内存大小为6.7g,可提交内存大小为38.2g,d盘的可用空间为181.87g,分页文件大小为22.2G

备注:everything的文件大小显示异常,分页文件实际大小可通过文件属性页获得。

验证结论

时间 已提交内存 可提交内存 分页文件大小 分页文件磁盘分区可用容量
初始 8.2(0) 33(0) 17(0) 187.1(0)
申请40g内存 47(+38.8) 53(+20) 36(+19) 166.27(-20.83)
释放40g内存 6.7(-1.5) 38.2(+5.2) 22.2(+5.2) 181.87(-5.23)

根据上述测试可知:

(1)在用户使用内存超过windows的可提交内存后,如果情况允许(分页文件所处的磁盘中存在可用空间),那么windows系统会对分页文件进行扩容进而增大windows的可提交内存(示例中的可提交内存总量从33g增加到了53g),而与此同时d盘的可用空间减小了20g左右,其数值与windows可用内存的增加值正好符合。因此可以认为windows在适当的情况下(内存负载过高可提交内存不足、分页文件设置允许进行扩容、分页文件所处磁盘分区存在剩余空间可供扩容使用),会自动使用磁盘空间作为虚拟机内存以供程序使用,直观表现为可提交内存与分页文件增加,磁盘分区可用空间减小,增加与减小的容量大致相同;

(2)在内存使用高峰过去后,windows会对之前的分页文件进行缩容操作,释放之前分配的过多磁盘空间,但是不一定会完全恢复到初始状态;

(3)windows基于分页文件的虚拟内存机制看起来比其他系统的固定大小的交互分区更为灵活,因此非专业人士不建议手动修改分页文件的相关设置,使用windows的默认配置策略即可;

(4)因为windows基于分页文件的虚拟内存机制,因此如果想在不增加物理内存的情况下改善系统内存使用情况,建议可以将分页文件设置在存储性能较高的磁盘上(例如选择ssd而非hhd磁盘分区存储分页文件),并在对应的磁盘分区上保留足够的磁盘空间,使得系统可以在内存负载较高时使用磁盘空间满足业务需求;