首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >系统挂起,退出ResAvail页面在WinDbg中

系统挂起,退出ResAvail页面在WinDbg中
EN

Stack Overflow用户
提问于 2016-02-17 05:49:16
回答 1查看 856关注 0票数 2

几个月来一直在调查服务器挂起的问题。每隔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)

代码语言:javascript
复制
********** 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,请告诉我,我很乐意在这里发布经过消毒的输出。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2016-02-17 09:26:26

由于问题已经得到解决,并且您发布的链接为我假设的行为提供了一个非常好的解释,剩下的唯一查询就是如何从运行中的系统中获取数据,如果您可以运行livekd或将kd连接到服务器,则可以使用以下方法查询resvail页面

代码语言:javascript
复制
C:\Users\XX>livekd  "-c \"? poi(nt!MmResidentAvailablePages)\";q" | grep -i eval
Evaluate expression: 459911 = 00070487
n

代码语言:javascript
复制
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 minimum

msdn链接显示各种内存限制,包括不同平台的分页和非分页池限制。

一个没有关闭句柄的简单创建过程将占用20k,并作为一个例子在周围徘徊。

如果您编译并运行这段代码,您可以在kd using either !process 0 0 cmd.exe or !vm中看到一个泄漏的20k cmd.exe。

代码语言:javascript
复制
taskmgr / tasklist / wmic process none will show the process 

sysinternals的rammap将显示进程选项卡中的20k可分页条目。

按住enter键,根据需要创建尽可能多的cmd.exe以进行实验。

代码语言:javascript
复制
#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的积累而降低

代码语言:javascript
复制
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 = 0006a600
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35448877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档