Impedire che .NET Runtime Optimization Service funzioni a batteria?


10

Quando ho aperto il mio laptop questa mattina, si è riavviato (dopo aver installato gli aggiornamenti). Ora .NET Runtime Optimization Service (ngen?) Utilizza un bel po 'di CPU mentre il computer è a batteria. Mi chiedo, c'è un modo per chiedere a Windows di rinviare queste attività fino a quando il laptop è collegato? Il laptop è stato collegato durante la notte, ma il 30% della mia batteria è scarica dopo meno di un'ora di utilizzo, il che non è la solita situazione.

Il mio computer non era inattivo mentre lo faceva, quindi presumo che stia compilando gli assembly ad alta priorità dopo un aggiornamento di .Net Framework da questo articolo .

Ho controllato la cronologia degli aggiornamenti di Windows e durante la notte ha installato un aggiornamento cumulativo. ( Https://support.microsoft.com/en-ie/help/4038788/windows-10-update-kb4038788 ). Vorrei che Windows eseguisse l'ottimizzazione .net come parte di quel processo invece di aspettare che iniziassi a usare il portatile a batteria.

Task Manager


Ho appena visto lo stesso servizio improvvisamente mangiare molta CPU e la ventola è diventata rumorosa. Ma nel mio caso è stato dopo aver messo il computer in standby dopo 2 ore di utilizzo. Non ho potuto interrompere il servizio (nella finestra che hai pubblicato sopra nella vista di dettaglio). Dopo 5-10 minuti era finita, quindi credo sia solo una questione di aspettare qualche minuto
hansaplast

Risposte:


4

La risposta breve è no, non puoi rinviare in modo affidabile ngen (e non dovresti provare), l'unica opzione coerente / utile che ho trovato era costringerlo a correre fino al completamento e non lasciarlo in agguato in background.

Se stai tentando di salvare alcuni cicli della CPU sulla batteria (o nel mio caso fermare un server che esegue ngen dopo averlo reso in servizio a seguito degli aggiornamenti di Windows), l'opzione migliore è forzare l'esecuzione di ngen. Per un PC desktop, vengono in mente 2 opzioni:

  1. Crea un file .bat o .ps1 sul desktop con il comando ngen appropriato di seguito: fai doppio clic e attendi che ngen si chiuda prima di scollegare. Se invece crei lo script nella cartella Windows e scorri il collegamento sul desktop, puoi anche utilizzare il comando o il prompt di Powershell o la finestra di dialogo Esegui per eseguirlo come richiesto (prima di scollegare / dopo un aggiornamento).

  2. Un'altra opzione che dovrebbe funzionare è utilizzare un'attività pianificata per eseguire lo script sopra. Eseguilo all'avvio, senza un utente connesso, come amministratore. Se il tuo laptop è autorizzato a installare gli aggiornamenti durante la notte e può riavviare, dovrebbe funzionare correttamente.

Per eseguire ngen è necessario solo uno dei seguenti comandi, utilizzare la prima / opzione più appropriata per il proprio sistema:

  • .Net 4 o superiore a 64 bit C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe executeQueuedItems

  • .Net 4 o superiore a 32 bit C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe executeQueuedItems

  • .Net 3 o meno su 64 bit C:\Windows\Microsoft.NET\Framework64\v2.0.50727\ngen.exe executeQueuedItems

  • .Net 3 o meno a 32 bit C:\Windows\Microsoft.NET\Framework\v2.0.50727\ngen.exe executeQueuedItems

Di seguito è riportato l'output minimo che ottieni da ngen quando non ci sono elementi in coda:

PS C:\Users\Administrator> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe executeQueuedItems
Microsoft (R) CLR Native Image Generator - Version 4.6.1586.0
Copyright (c) Microsoft Corporation.  All rights reserved.
All compilation targets are up to date.

Quando viene eseguito ngen.exe executeQueuedItems, verrà forzato a eseguire tutte le attività in sospeso il più rapidamente possibile. Normalmente ngen gira su un thread in background a bassa priorità (e apparentemente inizia solo in modo casuale), l'idea è che non dovrebbe morire di fame altri processi della CPU, anche se non sempre funziona. Eseguire ngen in modo interattivo è più veloce che lasciarlo in esecuzione in background, ma influirà maggiormente sulle prestazioni. Il tempo necessario dipende dal tuo hardware e da quante / quali immagini native devono essere ricompilate.


Se lascio la mia macchina inattiva (bene, in realtà una Virtualbox VM) per alcuni minuti, ngen.exe inizia a consumare tutta la CPU. Tuttavia, se eseguo uno o tutti i comandi sopra in una finestra cmd dell'amministratore, torno rapidamente "Tutte le destinazioni di compilazione sono aggiornate." :-( [Oh - Forse avrei dovuto menzionare che si tratta di una macchina di sviluppo. Mi chiedo se un processo di Visual Studio stia causando problemi ...]
mwardm
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.