2013-06-20 6 views
5

Stiamo utilizzando Asp.Net WebApi su 3 server dietro HAProxy. HAProxy distribuisce semplicemente casualmente richieste tra queste 3 istanze.Come rilevare i problemi con CPU alta e tempi di risposta lunghi con Asp.NET Web Api

Queste istanze si collegano a mongodb, redis e alcuni servizi di Windows.

Normalmente, w3wp.exe utilizza circa% 30 cpu su ciascun server API.

Di tanto in tanto (alcune volte in un'ora) uno dei server API decide di utilizzare quantità elevate di CPU. In correlazione con questo comportamento, iniziamo a vedere un aumento dei tempi di risposta. I numeri continuano a crescere finché HAProxy non vede i tempi di risposta di 10000 ms e decide di instradare le richieste ad altri due server. Tutti questi si verificano in 10-20 secondi. Dopo un po ', questo server torna allo stato normale e ricomincia a rispondere alle richieste. Dopo pochi minuti, un altro server fa esattamente la stessa cosa. Questo continua ad andare avanti.

Si sta utilizzando New Relic ma poiché l'applicazione è un'applicazione WebApi, non vengono fornite informazioni utili. Monitoriamo tutti i nostri server (servizi redis, mongo e windows) per l'utilizzo della cpu, l'utilizzo della memoria, il traffico di rete e l'I/O, ma non vediamo alcun carico significativo durante le interruzioni sopracitate.

Come possiamo rilevare la causa di questo comportamento dell'applicazione?

+0

Hai risolto questo problema? Sto avendo un problema simile con web API. Per alcune chiamate, l'utente non riceve risposta e w3wp.exe ottiene un elevato utilizzo della memoria. Puoi condividere come hai esaminato il tuo problema? –

risposta

0

Una cosa condivisa tra .NET e Java EE è il garbage collector. Quindi, se l'applicazione utilizza grandi quantità di memoria, i periodi di elevata CPU potrebbero essere il garbage collector in arrivo. Ho avuto questo problema con .NET 3.5 IIS 7 che esegue un'applicazione che viene costantemente utilizzata su un gigabyte per processo. Il Garbage Collector interrompe praticamente tutto mentre recupera memoria per la tua applicazione. Puoi modificare il garbage collector e persino chiamarlo dal tuo codice quando ha senso. Ci sono molte piccole strategie che puoi usare. Un altro problema verrà fuori con il GC se si stanno facendo molte e molte cose con le stringhe. Ad esempio, si stanno analizzando stringhe di caratteri provenienti da un servizio Web riposante. Ciò causa molta frammentazione della memoria e può far sì che il GC impieghi molto più tempo e la CPU recuperi la memoria.

È facile vedere questo evento se questo è davvero ciò che sta accadendo. È possibile utilizzare il Task Manager per controllare l'utilizzo della memoria e la CPU del processo. Guarda la memoria utilizzata quando la CPU si alza e dopo che si abbassa di nuovo.

+0

L'applicazione utilizza pochissima memoria poiché non memorizza alcuna sessione e l'unica cosa che occupa spazio di memoria è costituita da istanze create localmente. –

+0

La memoria di modo funziona in. Net è che la memoria non viene ripristinata per un po 'finché l'algoritmo GC non determina che' ora 'sarebbe un buon momento. La frequenza di GC è determinata dalle impostazioni utilizzate e dalla frequenza utilizzata dall'applicazione e rilascia la memoria. Archiviare roba nelle variabili di sessione non ha molta importanza. Ad esempio, l'analisi di molte stringhe è importante perché stai creando piccoli blocchi di memoria che devono essere recuperati e ricombinati; l'analisi delle stringhe aumenterà il tempo di esecuzione del GCC causando un elevato utilizzo della CPU e un sistema che non risponde. –