我有一台 16 GB 的 Windows Server 2008 x64 计算机,主要运行 SQL Server 2008。任务管理器中显示的可用内存非常低(目前为 128 MB),即使用了大约 15.7 GB。到目前为止一切顺利。
现在,当我尝试缩小使用最多内存的进程的范围时,我感到很困惑:任务管理器的“进程”选项卡中显示,没有一个进程的工作集大小超过 200MB。好吧,也许工作集大小不是相关的计数器?
为了弄清楚,我使用 PowerShell 命令 [1] 以某种蛮力方式对进程对象的每个单独属性进行求和 - 肯定有一个属性加起来等于 15.7 GB,对吧?结果发现没有一个属性加起来等于,最接近的是 VirtualMemorySize(大约 12.7 GB)和 PeakVirtualMemorySize(大约 14.7 GB)。这是什么鬼?
换句话说:众多与内存相关的进程信息中哪一个是“正确的”,即计入任务管理器的“性能”选项卡中显示的服务器物理内存?
谢谢你们!
[1] $erroractionpreference="silentlycontinue";获取进程|gm|其中对象{$.membertype -eq "属性"} | foreach-object {$.name; (获取进程 | 测量对象 -sum $_.name ).sum / 1MB}
答案1
将所有进程的内存使用量相加通常不会产生有意义的结果。这将导致两个主要内存用户(系统缓存和待机列表)无法计算在内。您无法通过简单地将数字列表相加来计算内存使用量。内存管理系统太复杂了,无法做到这一点。
答案2
添加工作集还会多次计算跨进程共享的页面,例如来自系统 DLL 和多次启动的可执行文件的代码。
答案3
SQL-Server 使用 64 位 AWE 来锁定内存页面,并且该数量不计入任务管理器的“工作集”。