Aplicativo ou script gratuito para monitorar o uso da memória do pool de aplicativos

4

Eu quero um aplicativo ou script que exiba o seguinte: Processo de trabalho, nome do pool de aplicativos, uso da memória e, opcionalmente, uso da CPU. Estou familiarizado com o uso de

%windir%\system32\inetsrv\appcmd.exe list wp

mas isso só me pega o id do workerproces e o nome do pool de aplicativos. Eu, então, tomo isso e o gerenciador de tarefas de referência cruzada. Isso funciona, mas eu gostaria de um painel mais rápido - quase como exibição das informações. Eu imagino que deve haver algum tipo de solução que mostre as informações sem precisar clicar como explorador de processos. Alguém tem algo em particular que eles usam? Isso seria possível no powershell?

    
por notandy 18.06.2009 / 17:47

3 respostas

3

Se você não tiver o IIS 7 e o provedor, poderá usar o WMI. O script anexado funciona para a maioria dos seus requisitos, exceto o uso da CPU. Salve o script abaixo como get-webserverapppoolstats.ps1 (ou o que você quiser).

Você pode executar o script com:

./ Get-WebServerAppPoolStats.ps1 'Server1', 'Server2', 'Server3' -IntegratedAuthentication OU 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
    }
}
    
por 18.06.2009 / 20:46
3

Sim, o powershell pode fazer isso com o novo provedor powershell para o IIS é fácil. Aqui estão alguns exemplos dos dados do tempo de execução walkthru fornecido:

Estado do AppPool

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

Processos e solicitações de trabalho O cmdlet get-process não ajuda a descobrir qual Pool de Aplicativos um processo de trabalho específico está atendendo. Isso pode ser feito facilmente:

PS IIS:\AppPools> dir DefaultAppPool\WorkerProcesses

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

observe que depois de ter o PID regular

   get-process -id pid

informará o uso da memória

    
por 18.06.2009 / 18:36
1

Eu não sei porque a parte do 'nome do servidor' deste script não funcionou para mim, mas eu criei uma solução alternativa:

substitua esta linha:

$ Server = @ {Name = 'Servidor'; Expressão = {$ server}}

com estas duas linhas:

$ machine = New-Object system.string $ server

$ Server = @ {Name = 'Servidor'; Expressão = {$ máquina}}

uma vez que fiz isso, funcionou perfeitamente.

    
por 24.09.2010 / 05:43