ps的PM(K)得到负值时意味着什么?

时间:2015-08-31 19:16:01

标签: windows powershell

执行ps命令时,我得到以下负PM(进程正在使用的可分页内存量,以千字节为单位)。价值观为负时意味着什么?

PS H:\> ps sqlservr

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
   5947    4145 -1218888    1537304   981 ...50.77   8344 sqlservr


PS H:\> ps sqlservr

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
   6060    4172 -1218876    1537316   981 ...52.08   8344 sqlservr


PS H:\> ps sqlservr

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
   6481    4258 -1218832    1537376   981 ...56.55   8344 sqlservr

负值可能是Int32的溢出?但是,以下语句显示分页内存为4TB?这是不可能的。

$m = [int32]::MaxValue
($m + ($m -1218832) + 2)/1024/1024
# returns 4094.83763122559 (GB)

1 个答案:

答案 0 :(得分:3)

这是一个简单的有符号/无符号溢出错误。它在负空间和(在很多现代情况下)溢出无符号32位范围时都会溢出。

我相信所有PM(K)正在展示PagedMemorySize / 1024。他们应该展示PagedMemorySize64 / 1024

这是我在本地服务器上获得的16GB RAM和14GB的SQL Server保留:

PS C:\> $x = ps sqlservr
PS U:\> $x

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
   1555    1280 -1683524     132568    81            2056 sqlservr
PS U:\> $x.PagedMemorySize / 1024
-1683524
PS C:\> $x.PagedMemorySize
-1723928576
PS C:\> $x.PagedMemorySize.GetType().FullName
System.Int32

Get-Process的人应该使用无符号整数,但没有。

你可以非常轻松地完成这两个恭维数学运算,但是很明显这个值仍然没有意义,因为你已经溢出了32位地址空间完全:

PS C:\> ($x.PagedMemorySize + [uint32]::MaxValue + 1) / 1GB
2.39446640014648

你可以证明这个数字很容易占用超过31位的地址空间:

PS C:\> [math]::log($x.PagedMemorySize + [uint32]::MaxValue + 1)/[math]::log(2)
31.2597041913968

[注意:我可能有错...我永远不会记得何时添加1。]

您应该使用PagedMemorySize64 / 1024

PS C:\> $x.PagedMemorySize64.GetType().FullName
System.Int64
PS C:\> $x.PagedMemorySize64 / 1KB
15093692
PS C:\> $x.PagedMemorySize64 / 1GB
14.3944664001465

您可以像我们上面那样轻松地证明您需要超过32位的地址空间:

PS C:\> [math]::log($x.PagedMemorySize64)/[math]::log(2)
33.847442404377

所以我的系统需要64位中的34位来处理它所使用的所有内存。

您甚至可以通过一点二进制数学查看上面2.39 GB数字的来源:

PS C:\> ($x.PagedMemorySize64 -band [uint32]::MaxValue) / 1GB
2.39446640014648

从技术上讲,他们 应该为PagedMemorySize64使用无符号的64位整数,但在可预见的未来,你不太可能需要那么多的地址空间({{ 1}} = 8,192 petabytes。