几个月来一直在调查服务器挂起的问题。每隔2-2.5周,客户的服务器就会停止运转或出现蓝屏。它是2008年的R2 VM (ESXi 5.5U2),内存为25 TB,硬盘空间为TB。在问题发生期间,使用vSphere连接到控制台,可以移动一点(缓慢)。系统无法可靠地打开记事本、cmd甚至任务管理器。会导致内存不足或存储不足的错误。
事件查看器非常有用,指出了问题:事件ID 14:内核外内存事件ID: 2019:由于池为空,无法从系统非分页池分配服务器
太棒了-问题解决了,内存泄漏!但不..。切换到所有常用的工具/检查:可用RAM徘徊在20 the .可用池和NonPaged池很好.看上去很好和极限..。处理数我们在上面但是在正常范围内..。PoolMon除了使用高PROC标签外,没有显示出什么特别的东西。运行一个常量Perfmon来监视分页池和非分页池,并一直登录到磁盘,直到崩溃/挂起值远未达到极限.
发生什么事了?
然后去收集垃圾。小型转储每一次都会出现不同的模块故障,大部分是双变量、随机模块(视频存储器、DirectX等)。
最后,这是最后一次-我挂起了VM,将所有25 to的RAM都刷新到磁盘上。提取.vmss文件并运行vmss2core实用程序并生成一个完整的memory.dmp。把文件拖到WinDBG里,开始摸索.
说明故障模块是智能的-我知道这是一只红鲱鱼,因为这是最后一次用来挂起VM的驱动程序。而且,由于没有可用的池,不同的进程无论如何都会被阻塞和崩溃。
因此,我像运行一个好的WinDbg n00b一样运行了!vm,在让它磨掉3分钟之后,ctrl打破了它,得到了如下结果:
0: kd> !vm
*虚拟内存使用情况*物理内存: 6291342 ( 25165368 Kb)页文件:\??\C:\pagefile.sys当前: 25165368 Kb空闲空间: 25078668 Kb最小: 25165368 Kb最大: 75496104 Kb可用页: 4686357 ( 18745428 Kb) ResAvail页面:1(4KB)
********** Running out of physical memory **********
Locked IO Pages: 0 ( 0 Kb)
Free System PTEs: 33525293 ( 134101172 Kb)
******* 1 system PTE allocations have failed ******
******* 159 system cache map requests have failed ******
Modified Pages: 6364 ( 25456 Kb)
Modified PF Pages: 6364 ( 25456 Kb)
Modified No Write Pages: 0 ( 0 Kb)
NonPagedPool Usage: 105059 ( 420236 Kb)
NonPagedPool Max: 4702718 ( 18810872 Kb)
PagedPool 0 Usage: 32272 ( 129088 Kb)
PagedPool 1 Usage: 20547 ( 82188 Kb)
PagedPool 2 Usage: 18368 ( 73472 Kb)
PagedPool 3 Usage: 18267 ( 73068 Kb)
PagedPool 4 Usage: 18222 ( 72888 Kb)
PagedPool Usage: 107676 ( 430704 Kb)
PagedPool Maximum: 33554432 ( 134217728 Kb)
********** 489 pool allocations have failed **********
Session Commit: 4738 ( 18952 Kb)
Shared Commit: 9068 ( 36272 Kb)
Special Pool: 0 ( 0 Kb)
Shared Process: 1003664 ( 4014656 Kb)
Pages For MDLs: 77 ( 308 Kb)
Pages For AWE: 0 ( 0 Kb)
NonPagedPool Commit: 0 ( 0 Kb)
PagedPool Commit: 107736 ( 430944 Kb)
Driver Commit: 3385 ( 13540 Kb)
Boot Commit: 0 ( 0 Kb)
System PageTables: 0 ( 0 Kb)
VAD/PageTable Bitmaps: 3081 ( 12324 Kb)
ProcessLockedFilePages: 0 ( 0 Kb)
Pagefile Hash Pages: 0 ( 0 Kb)在这个世界上,我怎么能‘耗尽物理内存’与25 in的RAM!?事后看来(我知道我现在在谷歌上搜索了什么)--我应该在“ResAvail Pages =1”上找到答案.但稍后会有更多..。
作为我的WinDBG n00b,我运行了强制性的!process 0 0命令。输出滚动了5分钟!什么??这些进程是如何在RAM中活动的?我在里没看到他们?还是反映在高手柄计数上?在对结果输出进行Notepad++魔术之后..。我有超过174631例良性图像,如cmd.exe,net.exe,findstr.exe,sc.exe.我抓取了其中一堆的进程ID,并使用!process命令跟踪它们的ParentCid,以便快速地意识到这些都指向安装在服务器上的系统监视代理。
所以..。问题解决了?补丁/更新/删除系统监控软件,并称之为一天,对吗?
嗯,最后是真正的问题(我很感谢你阅读了这篇文章.):ResAvail页面是什么??为什么这个服务器只剩下那么少的内存、池和提交百分比的GBs和GBs显示在所有可用的资源管理器中?
我找到了一篇很棒的文章,我认为这可能正是发生了什么:http://blogs.msdn.com/b/ntdebugging/archive/2013/09/04/resavail-pages-and-working-sets.aspx
但这是唯一一篇我能找到的关于ResAvail页面的合理解释的文章。
这个问题真的只是所有这些未释放的进程的总和-最小的20K工作集挂在内存中,导致它达到一个众所周知的上限和内核只是拒绝分配更多的内存,尽管有很多可用的?
我应该在WinDbg中检查其他的东西吗?我是否可以看到“所有进程工作集的总和”,或者是什么类型的内存/对象/构造导致这个ResAvail池减少?这怎么这么神秘?在没有崩溃转储的情况下,人们怎么可能希望看到Windows中的这个值逐渐接近于零呢?
如果能了解更多关于这个奇怪异常的信息,任何专家如果能对这个ResAvail的神秘事件有更多的了解,我将非常感激。如果您想要在memory.dmp中运行WinDBG,请告诉我,我很乐意在这里发布经过消毒的输出。
谢谢!
发布于 2016-02-17 09:26:26
由于问题已经得到解决,并且您发布的链接为我假设的行为提供了一个非常好的解释,剩下的唯一查询就是如何从运行中的系统中获取数据,如果您可以运行livekd或将kd连接到服务器,则可以使用以下方法查询resvail页面
C:\Users\XX>livekd "-c \"? poi(nt!MmResidentAvailablePages)\";q" | grep -i eval
Evaluate expression: 459911 = 00070487
n。
kd> .printf "%d gb of memeory would be used if all the %d process had its minimum\n",
0n174631 * 0n200 / 0n1000000 , 0n174631
34 gb of memeory would be used if all the 174631 process had its minimummsdn链接显示各种内存限制,包括不同平台的分页和非分页池限制。
一个没有关闭句柄的简单创建过程将占用20k,并作为一个例子在周围徘徊。
如果您编译并运行这段代码,您可以在kd using either !process 0 0 cmd.exe or !vm中看到一个泄漏的20k cmd.exe。
taskmgr / tasklist / wmic process none will show the process sysinternals的rammap将显示进程选项卡中的20k可分页条目。
按住enter键,根据需要创建尽可能多的cmd.exe以进行实验。
#include <windows.h>
#include <stdio.h>
void main( void ) {
STARTUPINFO si; PROCESS_INFORMATION pi;
char binary[] = {"c:\\windows\\system32\\cmd.exe"};
char arg2bin[] = {"/c"};
redo:
memset(&si,0,sizeof(si)); memset(&pi,0,sizeof(pi));
si.cb = sizeof(si);
if((! CreateProcess(binary,arg2bin,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))) {
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}
WaitForSingleObject( pi.hProcess, INFINITE );
if(getchar() != 'N') { goto redo; };
}有982个内存拥抱cmd.exes,被taskmgr / tasklist、/wmic进程/ procexp、sysinternals等忽略。
使用!process或!vm的livekd或真正的kd连接只能显示20k的食用身体(查找雷蒙德的old_new_thing僵尸文章以获得关于身体的漂移)
sysinternals可以在process选项卡中显示20k页。
任务列表/ grep -ic cmd 2
进程名称为/format:list \ grep -c cmd 2
livekd "-c \"!process 0 0 cmd.exe\";q“\\ grep -ic cmd n 982
身体ResAvailpages随cmd.exes的积累而降低
livekd "-c \"? poi(nt!MmResidentAvailablePages)\";q" | grep -i eval
Evaluate expression: 455943 = 0006f507
y
Evaluate expression: 455166 = 0006f1fe
y
Evaluate expression: 455166 = 0006f1fe
y
Evaluate expression: 455037 = 0006f17d
y
Evaluate expression: 455102 = 0006f1be
y
Evaluate expression: 455102 = 0006f1be
y
Evaluate expression: 451086 = 0006e20e
y
Evaluate expression: 451638 = 0006e436
y
livekd "-c \"? poi(nt!MmResidentAvailablePages)\";q" | grep -i eval
livekd "-c \"? poi(nt!MmResidentAvailablePages)\";q" | grep -i eval
Evaluate expression: 449056 = 0006da20
y
Evaluate expression: 435712 = 0006a600https://stackoverflow.com/questions/35448877
复制相似问题