如何使用 Powershell 计算应用程序池的处理器关联掩码?
How to calculate Processor Affinity Mask for an Application Pool using Powershell?
我希望能够 select 我的 IIS 应用程序池正在使用哪些 CPU。可以在池设置中设置亲和掩码,但我希望能够根据可用内核以编程方式计算掩码。例如 运行 在除 1 和 2 之外的所有可用内核上。
我写了两个帮助程序,将掩码转换为 cpu 数字列表,并将 cpu 数字列表转换为掩码,但感觉我应该使用按位运算符。我很好奇你会怎么做,有没有更简单的方法,或者是否有我可以用来实现相同目的的内置函数或模块。
https://serverfault.com/questions/471105/formula-for-processor-affinity-mask-iis
我的例子:
function Get-Cpus($mask){
$binary = [Convert]::ToString($mask,2).ToCharArray()
$i = $binary.Length - 1
$cpus = @()
for(;$i -ge 0; $i--){
if($binary[$i] -eq "1"){
$cpus += $binary.Length - $i - 1
}
}
return $cpus | Sort-Object
}
function Get-Mask($cpus){
$cpus = $cpus | Sort-Object
$i = $cpus[$cpus.Length -1]
$binary = ""
for(; $i -ge 0; $i--){
if($cpus -contains $i){
$binary += "1"
}
else{
$binary += "0"
}
}
return [Convert]::ToInt64($binary, 2)
}
我通过来回转换并检查我是否得到相同的值来测试我的助手。
[string]::Join(",", (Get-Cpus ([Convert]::ToInt64("00000000111111111111000000000000", 2))))
[string]::Join(",", (Get-Cpus 4294967295))
[string]::Join(",", (Get-Cpus (Get-Mask 2,9,5,23,4,7,31)))
[string]::Join(",", (Get-Cpus (Get-Mask 2,4,5,7,9,23,31)))
[string]::Join(",", (Get-Cpus (Get-Mask 1,2,30,31)))
[string]::Join(",", (Get-Cpus (Get-Mask 30,2,1,31)))
[string]::Join(",", (Get-Cpus (Get-Mask @(0..31))))
好吧,你可以简化 Get-Mask 而无需按位操作:
function Get-Mask($cpus) {
$cpus | Foreach -Begin {$mask=0} -Process {$mask += [Math]::Pow(2,$_)} -End {$mask}
}
在 Get-Cpus 中,您可以使用右移来简化。通常我只会除以 2,但 PowerShell 很好 return 双倍的非整数结果。
function Get-Cpus($mask) {
for ($i=0; $mask -gt 0; $i++) {
if ($mask % 2 -eq 1) {
$i
}
$mask = $mask -shr 1
}
}
"classic" 方式是这样的:
function Get-CPUs {
param([int64]$mask)
$a=@()
$i=0
while ($mask -gt 0) {
if ($mask -band 1 -gt 0) { $a+=$i}
$i+=1
$mask=$mask -shr 1
}
return $a
}
function Get-Mask {
param ([int64[]] $cpus)
$mask=0
foreach ($cpu in $cpus) { $mask = $mask -bor (1 -shl $cpu)}
return $mask
}
除了使用 [Math]::pow(2,x)
之外,还可以直接左移 1,最多 64。从技术上讲,如果 $cpus
中有 64 或更多,则更好将抛出异常。
"Easier" 方式由相同的操作组成,只是在某处压缩为一个函数。
我希望能够 select 我的 IIS 应用程序池正在使用哪些 CPU。可以在池设置中设置亲和掩码,但我希望能够根据可用内核以编程方式计算掩码。例如 运行 在除 1 和 2 之外的所有可用内核上。
我写了两个帮助程序,将掩码转换为 cpu 数字列表,并将 cpu 数字列表转换为掩码,但感觉我应该使用按位运算符。我很好奇你会怎么做,有没有更简单的方法,或者是否有我可以用来实现相同目的的内置函数或模块。
https://serverfault.com/questions/471105/formula-for-processor-affinity-mask-iis
我的例子:
function Get-Cpus($mask){
$binary = [Convert]::ToString($mask,2).ToCharArray()
$i = $binary.Length - 1
$cpus = @()
for(;$i -ge 0; $i--){
if($binary[$i] -eq "1"){
$cpus += $binary.Length - $i - 1
}
}
return $cpus | Sort-Object
}
function Get-Mask($cpus){
$cpus = $cpus | Sort-Object
$i = $cpus[$cpus.Length -1]
$binary = ""
for(; $i -ge 0; $i--){
if($cpus -contains $i){
$binary += "1"
}
else{
$binary += "0"
}
}
return [Convert]::ToInt64($binary, 2)
}
我通过来回转换并检查我是否得到相同的值来测试我的助手。
[string]::Join(",", (Get-Cpus ([Convert]::ToInt64("00000000111111111111000000000000", 2))))
[string]::Join(",", (Get-Cpus 4294967295))
[string]::Join(",", (Get-Cpus (Get-Mask 2,9,5,23,4,7,31)))
[string]::Join(",", (Get-Cpus (Get-Mask 2,4,5,7,9,23,31)))
[string]::Join(",", (Get-Cpus (Get-Mask 1,2,30,31)))
[string]::Join(",", (Get-Cpus (Get-Mask 30,2,1,31)))
[string]::Join(",", (Get-Cpus (Get-Mask @(0..31))))
好吧,你可以简化 Get-Mask 而无需按位操作:
function Get-Mask($cpus) {
$cpus | Foreach -Begin {$mask=0} -Process {$mask += [Math]::Pow(2,$_)} -End {$mask}
}
在 Get-Cpus 中,您可以使用右移来简化。通常我只会除以 2,但 PowerShell 很好 return 双倍的非整数结果。
function Get-Cpus($mask) {
for ($i=0; $mask -gt 0; $i++) {
if ($mask % 2 -eq 1) {
$i
}
$mask = $mask -shr 1
}
}
"classic" 方式是这样的:
function Get-CPUs {
param([int64]$mask)
$a=@()
$i=0
while ($mask -gt 0) {
if ($mask -band 1 -gt 0) { $a+=$i}
$i+=1
$mask=$mask -shr 1
}
return $a
}
function Get-Mask {
param ([int64[]] $cpus)
$mask=0
foreach ($cpu in $cpus) { $mask = $mask -bor (1 -shl $cpu)}
return $mask
}
除了使用 [Math]::pow(2,x)
之外,还可以直接左移 1,最多 64。从技术上讲,如果 $cpus
中有 64 或更多,则更好将抛出异常。
"Easier" 方式由相同的操作组成,只是在某处压缩为一个函数。