执行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)
答案 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。