用于监控应用程序池内存使用情况的免费应用程序或脚本

用于监控应用程序池内存使用情况的免费应用程序或脚本

我想要一个显示以下内容的应用程序或脚本:工作进程、应用程序池名称、内存使用情况以及可选的 CPU 使用情况。我熟悉使用

%windir%\system32\inetsrv\appcmd.exe 列表 wp

但这只会让我获得工作进程 ID 和应用程序池名称。然后我将其与任务管理器交叉引用。这可行,但我希望信息显示得更快 - 几乎像仪表板一样。我想一定有某种解决方案可以显示信息,而不需要像进程资源管理器那样四处点击。有人有他们使用的特定东西吗?这在 powershell 中可行吗?

答案1

如果您没有 IIS 7 和提供程序,则可以使用 WMI。附加的脚本可以满足您的大多数要求,但 CPU 使用率除外。将以下脚本保存为 get-webserverapppoolstats.ps1(或您想要的任何名称)。

然后您可以使用以下命令运行脚本:

./Get-WebServerAppPoolStats.ps1'服务器1','服务器2','服务器3'-IntegratedAuthentication 或 Get-Content servers.txt | ./Get-WebServerAppPoolStats.ps1 -IntegratedAuthentication

param (
    $webserver = $null,
    $username,
    $password,
    [switch]$IntegratedAuthentication)

BEGIN
{
    $path = $MyInvocation.MyCommand.Path

    if ($webserver -ne $null)
    {
        if ($IntegratedAuthentication)
        {
            $webserver | &$path -IntegratedAuthentication
        }
        else
        {
            $webserver | &$path -username $username -password $password
        }
    }
    $OFS = ', '
    $Fields = 'CommandLine', 'Name', 'CreationDate', 'ProcessID', 'WorkingSetSize', 'ThreadCount', 'PageFileUsage', 'PageFaults' 

    $query = @"
    Select $fields
    From Win32_Process
    Where name = 'w3wp.exe'
"@

    $AppPool =  @{Name='Application Pool';Expression={($_.commandline).split(' ')[-1]}}
    $Process = @{Name='Process';Expression={$_.name}}
    $RunningSince = @{Name='Running since';Expression={[System.Management.ManagementDateTimeconverter]::ToDateTime($_.creationdate)}}
    $Memory = @{Name='Memory Used';Expression={'{0:#,#}' -f $_.WorkingSetSize}}
    $Threads = @{Name='Thread Count';Expression={$_.threadcount}}
    $PageFile = @{Name='Page File Size';Expression={'{0:#,#}' -f $_.pagefileusage}}
    $PageFaults = @{Name='Page Faults';Expression={'{0:#,#}' -f $_.pagefaults}} 
}

PROCESS
{
    $server = $_ 

    if ($server -ne $null)
    {
        if ($IntegratedAuthentication)
        {   
            $result = Get-WmiObject -Query $query -ComputerName $server
        }
        else
        {
            $securepassword = ConvertTo-SecureString $password -AsPlainText -Force
            $cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securepassword

            $result = Get-WmiObject -Query $query -ComputerName $server -Credential $cred 

        }
        $Server = @{Name='Server';Expression={$server}}
        $result | Select-Object $Server, $AppPool, $Process, $RunningSince, $Memory, $Threads, $PageFile, $pageFaults
    }
}

答案2

是的,powershell 可以使用新的IIS 的 powershell 提供程序很简单。以下是来自运行时数据演练假如:

应用程序池状态

PS IIS:\> cd AppPools
PS IIS:\AppPools> Get-WebItemState DemoAppPool
Started
PS IIS:\AppPools> Stop-WebItem DemoAppPool
PS IIS:\AppPools> Get-WebItemState DemoAppPool
Stopped

工作进程和请求 get-process cmdlet 无法帮助您确定特定工作进程正在服务哪个应用程序池。但是,这可以轻松完成:

PS IIS:\AppPools> dir DefaultAppPool\WorkerProcesses

               processId                  Handles                    state StartTime
               ---------                  -------                    
                   6612                      326                        1 3/28/2008 12:20:27 PM

请注意,一旦你有PID常规

   get-process -id pid

会告诉你内存使用情况

答案3

我不知道为什么这个脚本的服务器“名称”部分对我来说不起作用,但我想出了一个解决方法:

替换此行:

$Server = @{名称='服务器';表达式={$server}}

用这两行:

$machine = 新对象系统.string $server

$Server = @{Name='Server';Expression={$machine}}

一旦我这样做了,它就完美地起作用了。

相关内容