Come spiegare l'utilizzo della memoria su Windows Server al di fuori dell'elenco dei processi in esecuzione


9

Ho un server Windows 2003 in esecuzione un po 'lento in cui il costo di commit e l'utilizzo del file di paging aumentano fino al riavvio. Per risolvere questo problema, devo scoprire cosa sta consumando tutta la memoria, ed è qui che sta il grande mistero.

Statistiche correnti dal Task Manager:

Physical Memory (K): 2096400
Commit Charge (K):   5364848
Page file usage:     5.11 GB

Bene, quindi tiriamo su SysInternals Process Explorer e controlliamo le dimensioni del set di lavoro di tutto ciò che è in esecuzione. Il più grande colpevole è un'istanza Tomcat che utilizza 121.980 KB WS, 481.284 KB Dimensione VM. Non c'è nulla di simile alla spiegazione della commissione di commit da 5 GB.

Passaggio successivo SysInternals pslist : pslist -m, contempla l'uscita dalla colonna e colonna calcolare somme per i 61 processi che vengono segnalati.

SUM (Working Set)  : 681,484 K
SUM (Private Bytes): 593,424 K

Sto fondamentalmente fraintendendo ciò che gli strumenti stanno segnalando? Ho sempre avuto l'impressione che un sistema operativo avrebbe effettivamente impegnato molto meno memoria rispetto alla quantità totale di memoria virtuale mappata da un processo, supponendo che in realtà non userà mai così tanto e che guardare la VM qui è un'aringa rossa.


1
Aggiornamento: Sì, questo sistema esegue il paging e ricevo spesso l'avviso "Esaurimento della memoria virtuale". Ogni volta che ricevo l'avviso, controllo le statistiche della memoria e non esiste alcun processo che sembra comportarsi in modo particolarmente anomalo, ma la memoria, i dati di commit dei byte supera sempre i 5 GB.
jpdaigle,

Risposte:


1

JP, credo che il tuo commento sul fatto che si tratti di un server di test build / unità automatizzato che esegue meno di un codice stabile, dica tutto. La mia ipotesi è che questo server debba essere riavviato frequentemente a causa del codice instabile in esecuzione su di esso probabilmente ha perdite di memoria che ti stanno dando i sintomi che stai vedendo. Le perdite di memoria non verranno elencate in nessuno degli alberi di processo dei processi in esecuzione poiché sono memoria che viene catturata da processi che non esistono più e che sono ancora allocati, anche se il processo ad essi associato è scomparso da tempo.

Ottieni una finestra di manutenzione frequente che ti consenta di riavviare automagicamente questa macchina, magari di notte, un paio di volte a settimana o settimanalmente a seconda della velocità con cui questo comportamento inizia a presentare problemi di prestazioni.

Abbiamo server Oracle Application Server su Windoze qualche tempo fa che doveva essere riavviato due volte al giorno. Abbiamo cacciato gli utenti all'ora di pranzo e nel cuore della notte ogni giorno. Era qualche anno fa, con un codice di produzione apparentemente stabile di Oracle.


2

Mi dispiace solo incollare alcuni collegamenti, ma abbiamo usato alcune tecniche per trovare perdite di memoria, usando logparser e powershell, quindi condividerò.

http://blogs.msdn.com/debuggingtoolbox/archive/2008/08/22/powershell-script-chart-and-statistics-from-top-20-objects-leaking.aspx

(Il sito Never Doubt Thy Debugger è eccellente): http://blogs.msdn.com/carloc/archive/2007/09/14/something-you-need-to-know-before-start-debugging.aspx

Fornirò anche un collegamento all'eccellente visione di Mark Russinovich sull'uso della memoria su Windows:

http://blogs.technet.com/markrussinovich/search.aspx?q=memory&p=1

A parte l'apertura di casi reali di Microsoft, anche il sito del Performance Team ha molte buone informazioni: http://blogs.technet.com/askperf/Default.aspx?p=2


1

Lo strumento fondamentale per aiutare a diagnosticare questo è perfmon. I contatori che guarderei (per cominciare) sono:

Memoria, Byte impegnati questa è una misura della richiesta di memoria virtuale
Processo, Set di lavoro, _Totale memoria virtuale in uso "attivo"
File di paging,% file di paging in uso
Memoria, Pagine / Sec (questo non è necessariamente un indicatore di memoria insufficiente , sebbene tutti sembrino supporre che lo faccia)
Memoria, Output pagine / Sec quante pagine di memoria virtuale sono state scritte nel file di paging per liberare i frame di pagina RAM per altri scopi ogni secondo

Memoria, memoria byte cache, memoria byte non
paginati pool, memoria byte paginati
pool
,
memoria byte totali codice sistema, byte totali driver di sistema

quando questa somma si avvicina a 2 GB avrai problemi di prestazioni generalmente dovuti all'architettura a 32 bit

Memoria, MByte disponibili: misura la quantità di RAM disponibile per soddisfare le richieste di memoria virtuale (nuove allocazioni o per ripristinare una pagina dal file di paging).

Vedi anche http://members.shaw.ca/bsanders/WindowsGeneralWeb/RAMVirtualMemoryPageFileEtc.htm


Link interessante. Su questo server, vedo il set di lavoro di processo totale a 640 MB, ma "Memoria, byte impegnati" è 5,4 GB. Nessuno degli altri segnalini di cui parli è molto alto. Ricevo spesso l'avviso "Esaurimento della memoria virtuale", motivo per cui sto indagando. Aggiunta di commento all'OP.
jpdaigle,

1

Da quanto tempo è in esecuzione quel server dall'ultimo riavvio? È un fatto sfortunato della vita che Windows abbia perdite di memoria. vale a dire che la memoria allocata non viene sempre rilasciata al sistema. I sintomi sono esattamente ciò che stai vedendo. Se non lo fai già, suggerirei di riavviare almeno una volta alla settimana. Molti data center riavviano Windows ogni giorno, poiché ciò riduce notevolmente le chiamate di supporto. Ovviamente è molto più facile da fare quando si utilizzano i cluster perché non ci sono tempi di inattività.


0

Si dice che ci sia un amministratore di sistema da qualche parte che capisce davvero le statistiche della memoria di Windows, ma non le ho mai incontrate.

Tuttavia, di solito non è troppo difficile trovare un processo di comportamento scorretto. Prova a utilizzare Perfmon per esaminare i vari contatori di processo come maniglie o Errori di pagina / sec.

JR

Ulteriori pensieri: sei sicuro di essere davvero a corto di memoria. La cosa fondamentale è se stai ricevendo il paging. Se non è presente il paging, non hai poca memoria. Utilizzando PerfMon dai un'occhiata al contatore Memoria - Pagine / sec.


Non vedo nulla di ovvio nei processi in corso. Esiste un modo possibile per il recupero della memoria da parte del sistema operativo dopo la chiusura di un processo? Si tratta di un server di test di build / unità automatizzato, quindi ovviamente i processi si arrestano in continuazione, poiché esegue sempre build edge all'avanguardia sviluppate automaticamente da SVN.
jpdaigle,

Vedi la mia modifica per ulteriori riflessioni
John Rennie,

0

Ricorda che il working set è il bit di memoria effettivamente rappresentato dalla memoria fisica REALE. hai anche la tua carica di memoria virtuale e Windows esegue la condivisione della code page, alcuni blocchi di MFC verranno condivisi tra molti e molti processi senza duplicare l'utilizzo della memoria. Inoltre hai il desiderio incessante di Windows di mantenere la cache del filesystem la più grande possibile (l'ho già vista volare a 800 MB su un laptop da 2,5 GB prima).

La gestione della memoria di Windows è molto solida. Tuttavia, una volta che Windows avvia il paging, le cose diventano brutte e devi SEMPRE lasciare spazio alla cache del filesystem - sempre sempre. Devo normalmente spegnere e riavviare Firefox quando le mie schede 80+ guidano il consumo di memoria fino a 1,2 gb / 1,2 + gb.

Windows sfoca anche un po 'la linea, tra le pagine che si trovano nella cache e le pagine elencate come set di memoria / di lavoro.

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.