Il nostro servizio tende ad addormentarsi durante le notti sul server del nostro cliente, e quindi ha difficoltà a svegliarsi. Ciò che sembra accadere è che l'heap del processo, che a volte è di diverse centinaia di MB, viene spostato nel file di swap. Ciò accade di notte, quando il nostro servizio non viene utilizzato e altri sono programmati per essere eseguiti (backup di database, scansioni AV, ecc.). In questo caso, dopo alcune ore di inattività, la prima chiamata al servizio richiede alcuni minuti (le chiamate successive richiedono alcuni secondi).Prevenire un processo pesante dall'affondamento nel file di scambio
Sono quasi certo che si tratta di un problema di gestione della memoria virtuale e odio davvero l'idea di forzare il sistema operativo a mantenere il nostro servizio nella memoria fisica. So che farlo danneggerà altri processi sul server e ridurrà il throughput generale del server. Detto questo, i nostri clienti vogliono solo che la nostra app sia reattiva. A loro non importa se i lavori notturni richiedono più tempo.
Ricordo vagamente che c'è un modo per forzare Windows a mantenere le pagine nella memoria fisica, ma io odio davvero quell'idea. Mi sto appoggiando più verso un watchdog interno o esterno che avvierà funzionalità di livello superiore (c'è già un programmatore interno che fa pochissimo, e non fa differenza). Se ci fosse uno strumento di terze parti che ha fornito quel tipo di servizio sarebbe stato altrettanto buono.
Mi piacerebbe sentire commenti, raccomandazioni e soluzioni comuni a questo tipo di problema. Il servizio è scritto in VC2005 e funziona su server Windows.
Questo sarebbe vero se solo il mio servizio fosse in esecuzione sul server. Tuttavia, gestisce anche un server Web, un database, un antivirus e altri servizi. Per eliminare la necessità del file di pagina saranno necessari 4 GB per ogni processo, non è vero? Detto questo, aggiungere più RAM è una buona soluzione, ma dipende dal cliente, e sto cercando un lavoro di sviluppo che non costringa molti clienti a spendere di più. – eran
"Per eliminare la necessità del file di pagina saranno necessari 4 GB per ogni processo, no?" Non come capisco. Per Windows a 32 bit, 4 GB rappresentano il totale complessivo di tutto e sei fortunato se ottieni tutti e quattro i gigabyte. Questa macchina, ad esempio, ha 4 GB di memoria fisica ma solo 2,75 GB sono disponibili per i programmi, dal momento che altre cose mangiano lo spazio degli indirizzi. – kquinn
Ma ogni processo ottiene il suo/proprio/4GB di spazio di indirizzamento (senza contare quello che prende il kernel), quindi se hai 30 processi ognuno di loro potrebbe usare 1GB di RAM e avere solo la maggior parte di esso scambiati, nel qual caso tu sei ancora è necessario un file di paging ... –