Come fai a sapere cosa fa w3wp.exe? (o come diagnosticare un problema di prestazioni)


42

Sto riscontrando un problema di prestazioni in un sito che abbiamo creato e non sono esattamente sicuro di come iniziare a diagnosticare.

La descrizione breve è: abbiamo un sito molto piccolo ( http://hearablog.com ) con pochissimo traffico, in un server dedicato scadente, la CPU è sempre molto alta, a volte rimane al 100% per minuti e w3wp.exe ci sta prendendo la maggior parte. Uno scenario tipico è w3wp.exe che richiede il 60% e SQL Server richiede circa il 30%. Anche il nostro DB è piuttosto piccolo.

Descrizione lunga e maggiori dettagli:

  • Il sito è ospitato in un server molto scadente da Cari.Net. Fin dall'inizio abbiamo avuto la sensazione che il server non si comportasse correttamente, come se alcune cose impiegassero troppo tempo, quindi questo potrebbe essere un problema di configurazione sin dall'inizio. Si può anche essere che stiamo ottenendo un server virtuale mentre stiamo suppone di avere uno dedicato, anche se non abbiamo alcuna prova che l'avrebbe indicano questo, tranne per il fatto che il server tende ad essere piuttosto lento.

  • Il server è Windows 2008 Standard a 64 bit, con SQL 2008 Express

  • L'hardware è un Celeron 2,80 GHz, 1 Gb di RAM

  • Il sito Web è sviluppato in ASP.Net MVC, utilizzando Entity Framework per l'accesso ai dati.

  • Ora, questo è un hardware piuttosto scadente, ma ho avuto altri server con questi ragazzi, con un HW equivalente (o peggio) e le prestazioni sono molto migliori di questo. Detto questo, gli altri server hanno W2003 e SQL2005 e sto usando ASP.Net "WebForms" 2.0, nessun MVC, nessun LINQ, nessun EF; quindi non sono sicuro se andare al 2008 / le altre cose significhino una grande penalità prestazionale.

  • Sto servendo regolarmente file MP3 (5-20 Mb), il che è un carico leggermente insolito, forse sta causando qualche tipo di problema?
    Ciò farebbe sì che w3wp usasse molta CPU?

  • L'utilizzo del disco sembra molto basso. La memoria è in genere intorno al 90%, ma l'utilizzo del disco sembra indicare che non sta effettuando molto il paging.

  • Ricevo tonnellate di e-mail ogni giorno sui timeout di SQL, per query che richiedono più di 30 secondi, anche se tutte le nostre query sono piuttosto semplici (o dovrebbero esserlo, ma EF potrebbe rovinare tutto).

Ecco come si presenta il monitoraggio delle risorse in uno di questi "sprint" con CPU al 100%, nel caso ci fosse qualcosa di utile lì.

testo alternativo

E un'istantanea di alcuni contatori delle prestazioni: testo alternativo

Ora, ciò che mi confonde molto è che l'utilizzo della CPU di w3wp è così alto. Non dovrebbe fare molto davvero ... Quindi le mie domande sono ...

  • C'è un modo per scoprire "cosa" sta facendo? Forse anche profilarlo?
  • Qualche contatore delle prestazioni che dovrei guardare?
  • Questo è prevedibile data questa configurazione hardware / software?
  • Questo potrebbe essere causato da un errore di configurazione, da dove inizieresti a cercare?

Grazie mille.
Daniel Magliola

Risposte:


42

È inoltre possibile utilizzare l'interfaccia utente dei processi di lavoro all'interno di Gestione IIS e ispezionare le richieste attualmente in esecuzione e vedere se sono bloccate. Apri Gestione IIS-> Fai clic sul server nella struttura ad albero-> Fai doppio clic sull'icona Processi di lavoro-> Fai doppio clic sul processo di lavoro che consuma CPU per vedere le richieste attualmente in esecuzione in tempo reale in modo da poter vedere quale modulo impiega tempo.

Prendi anche in considerazione l'utilizzo di Traccia richieste non riuscite per tenere traccia del tempo per richiesta e vedere dove stanno impiegando molto tempo.


2
Questo è promettente, in realtà sembra ESATTAMENTE quello che voglio vedere, ma in realtà quegli schermi mostrano vuoti. Apparentemente mostra solo le richieste che impiegano più di un secondo, secondo il grande segno in alto, e nessuna delle nostre richieste è evidente, perché l'elenco è vuoto. Qualche idea su come farlo mostrare più richieste? Come abbassare il filtro 1s? Grazie!
Daniel Magliola,

1
Puoi digitare 0 nel filtro e fare clic su Vai, che lo imposterà su 0 secondi. Inoltre, è possibile eseguire da un prompt dei comandi con privilegi elevati "% windir% \ system32 \ inetsrv \ appcmd.exe richieste di elenco"
Carlos Aguilar Mares,

1
Grazie mille Carlos! Questo è quello che ho finito per trovare l'unica richiesta (un cron che abbiamo) che stava uccidendo il mio server ogni 5 minuti (ci sono voluti 3,5 minuti per l'esecuzione, quindi era quasi costantemente al 100% della CPU). Grazie!!!
Daniel Magliola,

1
Questa UI mi ha detto a quale URL era stato effettuato l'accesso; sfortunatamente è un POST per un servizio web asmx e quei dati non sono disponibili. (headbang)
Ross Presser,

5

Ok, per iniziare: il server è DAVVERO scadente. Ma DOVREBBE bastare.

  • Per la virtualizzazione, controlla i tuoi driver. Non conosco alcuna piattaforma di virutalizzazione che nasconda la CPU (e dubito che qualcuno metta un hyper-v o esx su un celeron) ma i driver per il disco ecc. Sono un'indicazione.

  • La CPU non dovrebbe essere così alta. Sfortunatamente, con questa RAM, sei praticamente un brindisi - se inizi ad aggiungere un profiler praticamente soffierai la memoria che hai.

Vorrei:

  • Controlla i registri per l'esecuzione delle cose in questo momento.
  • Aggiorna il sistema operativo a 2008 R2 - MOLTE ulteriori informazioni sono disponibili qui.

Per i test:

  • Nel tuo ambiente di sviluppo, crea una copia del sito ed esegui alcuni test delle prestazioni.
  • Fare la profilazione lì.
  • Utilizza il monitoraggio richieste non riuscite per scoprire quali richieste non riescono.

http://learn.iis.net/page.aspx/266/troubleshooting-failed-requests-using-tracing-in-iis-7/

ha qualche inizio qui. Questo può darti un suggerimento nel caso in cui i problemi siano più - hm - "classificabili".

Conserverei anche i registri delle prestazioni a più lungo termine. Fai attenzione al tuo IO (secondi / lettura, secondi / scrittura sono praticamente gli unici rilevanti). Tutto il resto è IO troppo saggio, ma una volta che l'IO inizia a impiegare più tempo del dovuto, i dischi rimangono indietro.

A questo punto escluderei un problema di configurazione, almeno come indicatore primario. Qualcosa consuma le risorse del tuo W3p, ora devi scoprire di cosa si tratta.

In generale, questo non è un server che mi piacerebbe avere fisico - è così piccolo, non ha senso IMHO per avere una macchina lì. Virtual sarebbe meglio;)


grazie mille per la tua risposta. alcune domande: quali registri verificheresti per l'esecuzione di roba in questo momento? (scusate se questa è una domanda da principiante) - Aggiornamento del SO: Potremmo provarlo, ma temo che possa rompere le cose, forse, quanto è sicuro? - Ambiente di sviluppo: il problema è che nel mio ambiente di sviluppo funziona bene. La CPU è trascurabile, le richieste non falliscono, ecc.
Daniel Magliola,

Per quanto riguarda i log di I / O: ho appena aggiunto i contatori che menzioni e sono tutti a 0 mentre la CPU è alta. Ho appena aggiunto uno screenshot di alcuni contatori delle prestazioni che sto guardando. So che un'istantanea non racconta l'intera storia, ma quei valori tendono ad essere piuttosto stabili. Pensi che il numero di connessioni correnti (per le quali non ho spiegazioni) potrebbe essere un problema? Qualche idea su come capire cosa richiedono / fanno queste connessioni? Altri contatori che ritieni possano essere utili per diagnosticare qualcosa del genere?
Daniel Magliola,

Bene, R2 è abbastanza sicuro. Ho aggiornato tutto e non ho mai avuto problemi. Comunque .... questo è un problema di CPU e inchiodarlo può essere terribile, soprattutto perché non hai abbastanza RAM per installare un profiler. Vorrei effettivamente tentare una reinstallazione completa. Sì, fa schifo, ma significa che potresti installare R2 fresco e vedere se il problema persiste. La cosa brutta è che non hai un sistema di riserva, quindi non puoi identificare se il problema è "locale" o più generale. In alternativa: ferma IIS, cancella tutte le cartelle temporanee in uso, anche
TomTom

per la compilazione e vedere cosa succede al riavvio. Con R2 è possibile vedere se / quali file sono tenuti aperti da IIS. È locale per un'applicazione Web o esiste anche se tutti i siti Web vengono arrestati? La prossima cosa da provare: disattivare tutti i siti e scoprire quale si rompe le cose.
TomTom,

Infine, il problema con i server virtuali è che, per quanto ne ho scoperto, finiamo per pagare di più o lo stesso per lo stesso hardware, inoltre, la fattura della larghezza di banda è killer (tieni presente che serviamo file audio). Passeremo a un server più grande se dobbiamo, ma onestamente, con il traffico che abbiamo, ci deve essere qualche problema, non dovremmo mai usare la CPU al 100% ..
Daniel Magliola,

4

È possibile provare a utilizzare un programma chiamato Process Explorer per monitorare i singoli thread in esecuzione con il processo w3wp. Dovrebbe consentire di vedere quale thread sta causando tutto il danno.


3

Ho avuto davvero molta fortuna utilizzando lo strumento di diagnostica di debug di Microsoft per scaricare il mio processo di w3wp e quindi controllare i thread e le tracce dello stack per le cose che stavano bloccando. Ti dirà anche la pagina richiesta che ha generato il thread che è SUPER bello .

http://www.microsoft.com/en-us/download/details.aspx?id=26798


1

Sono d'accordo con TomTom, soprattutto su come ottenere un chilometraggio migliore da un Virtual a questo punto. Il debugging / profiling a livello locale per restringere il problema è la cosa giusta da fare.

Indosserò il mio cappello e mantello Karnak The Magnificent e chiederò la prima busta. Ram Rebellion. Cosa ottieni quando metti il ​​sistema operativo, ASP.NET e un avido SQL Server Express in 1 GB.

Credo che il tuo problema sia che SQL Server Express sta estraendo tutta la RAM disponibile per un pool di buffer ed è lento nel rilasciarlo. Vedere http://support.microsoft.com/kb/321363 per ulteriori informazioni. Inoltre, IIS ha una cache predefinita di 256 MB che potrebbe essere necessario modificare ( https://stackoverflow.com/questions/2853135/controlling-asp-net-output-cache-memory-usage ). Debug Diagnostics è un ottimo strumento per risolvere questo problema (ok, probabilmente una mazza).

http://technet.microsoft.com/en-us/library/bb742546.aspx è un articolo abbastanza decente da guardare. http://social.technet.microsoft.com/forums/en-US/sharepointadmin/thread/706c653a-16b0-4696-85ee-9ae3552a582e indica che il riciclaggio del pool di app è impazzito come un altro possibile problema.


1

Utilizzare il contatore "Processo" di Perfmon per visualizzare i singoli attributi del processo w3wp.exe. Quanto tempo della CPU per il processo di lavoro è il tempo del kernel? I tempi di kernel elevati potrebbero essere indicativi di paging, ma dici di non essere convinto. Altre possibilità sono i driver Duff. Il processo di lavoro ha 23 thread attivi, il che è buono, ma cosa stanno facendo? Prova ProcessExplorer di SysInternals per scavare un po 'di più; puoi anche vedere quali connessioni TCP / IP sono in gioco. Non ho usato SQL Express, ma ha parametri di ottimizzazione della memoria, come il suo fratello maggiore. SQL IIS affama la memoria, causando un paging eccessivo?


Vediamo se lo sto facendo bene ... Ho aggiunto% time processor e% user time counter, entrambi per il processo w3wp, ed entrambi si abbinano perfettamente alla perfezione per tutto il tempo. Ciò significa che non c'è tempo del kernel o sto guardando questo nel modo sbagliato? (scusate, sono un principiante in questo)
Daniel Magliola,

0

Potrebbe non essere totalmente correlato, ma verifica se stai utilizzando NOLOCK nelle tue query. Potrebbe essere d'aiuto nel caso dei timeout SQL.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.