各位大佬好,我目前遇到一个问题,比较棘手,故发出来与大家讨论下,集思广益。 在此先谢谢各位。
背景:
Windows跑在Hypervisor下,是一个Guest OS,分配给他的内存为12GB。 磁盘驱动使用的VIRTIO-BLK。
在开机自启动程序中,运行了3个testLimit测试程序,分别申请3000MB, 3000MB和9000MB内存,即总计申请了14.64GB内存
另在自启动程序中有一个重启脚本,它在Windows登录60秒后,自动执行重启操作,重启次数设定为1万次。
即,Guest Windows启动后,通过testLimit程序申请14.64GB内存,等待60秒后,自动重启。再次启动后,再次执行上述流程。
问题:
当重启次数达到2-3百次时,会出现无法重启的问题,屏幕界面卡在Restarting界面,一直转圈。
需求:
找到问题的根本原因,并着手解决。
目前我的思路,以及做过的实验如下:
我不怀疑Windows系统的内存管理或其他机制有什么问题,较大概率问题出现在Hypervisor上。
当申请内存不超过12GB时,重启是一直没有问题的。申请内存超出(或邻近)12GB后,
Windows的虚拟内存(Linux下叫SWAP)功能就启动了。不怀疑Windows自身的内存页与磁盘页面置换策略,
此时我认为唯一多了的事情就是磁盘操作,即VirtioBLK。 我怀疑问题与这个驱动有关。
思路1: 从Windows端入手,先确定Windows具体卡在哪里了,卡的时候在做什么。
进而推导出卡的时候,Hypervisor与Windows的交互情况,进而定位Hypervisor端的问题。
实验:我搭建了基于网络的双物理机调试环境。通过PC A 来调试PC B上的Guest Windows。
当Windows 卡在Restarting 界面时,我通过Windbg连到Windows上, 观察到系统还处在运行状态。
有几个程序在运行: kiRetireDpcList, kiExecuteAllDpcs, kiIdleLoop, PoIdle.
很郁闷,我对Windows下的这些程序都不太了解。 即使能Debug,也不知道现在Windows是在什么状态,为什么进入的这个状态。
换句话说,我不知道Windows系统的重启流程,不知道现在进行到具体哪一步了,不知道发生了什么导致它不再继续了。
求高人指点,要如何是好。
思路2:
在Hypervisor端观察。
4个CPU都处于IDLE状态,但IN/OUT还是有增长,应该还是在缓慢工作的。
VirtioBLk的Avail/Used index都在非常缓慢的增长。 即磁盘读写也还在进行。
不知道还能收集哪些信息 ?
此时CPU应该是没有从VMX non-root 状态退出的,故VMM (Hypervisor)应该还不知道Window要重启了。
其他:
1. 不能够关闭Virtual memory (SWAP)功能,因为这样相当于规避了问题,并没有解决。
2. Windows虚拟内存现在的管理方式设定的是由系统自动管理。目前系统虚拟内存的使用量5700多MB。
感觉这个数量有点太大了。 但如果设置一个比较小的值,则要给出充足的理由。
3. 有一种情况就是,Windows系统还是好的,只是性能急剧下降,运行极为缓慢。
我目前不关机,看系统能否一点点运行完毕。 截至发帖,已经等了1晚了。
4. 哪位大神知道虚拟化的圈子,想讨论一些虚拟化开发相关的技术问题,一直找不到组织,有点纠结。
综上,我不求能直接找到问题的Root Cause, 但求一些讨论,活跃下思路。 谢谢。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)