我在窗口 2012 r2 上通过 java 运行 Hyperic SIGAR。使用交换 sigar API(http://cpansearch.perl.org/src/DOUGM/hyperic-sigar-1.6.3-src/docs/javadoc/org/hyperic/sigar/Swap.html),我能够得到如下:swap total = 5032562688,swap used = 1541095424,swap free = 3491467264。这表明当前的swap使用率约为30%。但是,使用计数器 Paging File -> % Usage in Performance Monitor 检查 Window 上的交换使用情况,如此处所述https://serverfault.com/questions/399855/how-much-swap-is-being-used-on-windows显示交换使用率为 0%。(% 使用峰值也是 0%)。0% 的交换使用似乎更正确,因为窗口服务器根本没有承受太多负载。任何人都知道为什么 SIGAR 报告不同/不正确的值?
1 回答
Sigar 报告交换使用:
ullTotalPageFile -> 交换总计
ullAvailPageFile -> 免费交换
ullTotalPageFile - ullAvailPageFile -> 已使用交换
http://msdn.microsoft.com/en-us/library/aa366770(VS.85).aspx
WMI 报告交换使用:
swapTotal -> SizeStoredInPagingFiles(操作系统分页文件中可以存储的总千字节数——0(零)表示没有分页文件。注意这个数字并不代表分页文件在磁盘上的实际物理大小.)
swapFree -> FreeSpaceInPagingFiles(数字,以千字节为单位,可以映射到操作系统分页文件中而不会导致任何其他页面被换出。) https://msdn.microsoft.com/en-us/library/aa394239(v =vs.85).aspx
问题在于:在我看来,Windows 通过 ullTotalPageFile 返回给 Sigar 的是所有虚拟内存和物理内存的组合,而不仅仅是“总页面文件”指标中隐含的虚拟内存。(https://communities.vmware.com/thread/354362)
更详细地说:由于 Windows API 函数报告内存指标的方式,不可能准确检索交换(虚拟内存)大小,因为 Windows 报告的总提交内存是物理内存加上交换文件大小。唯一可以应用的解决方案是在知道页面和物理内存大小的情况下通过计算扣除交换大小。