2009-09-14 3 views
7

Sto usando System.Management namespace in un .Net per eseguire varie query WMI su un server remoto. Nei miei registri posso vedere che a volte le query richiedono 30 o 40 secondi per essere completate mentre altre volte le query vengono completate in meno di un secondo.Perché le query WMI sono così lente a volte?

Quando vedo queste query lente, provo a connettermi alla casella usando wbemtest, ma si connette sempre ed esegue rapidamente la query.

Eventuali idee, suggerimenti, suggerimenti?

Ho notato quando guardavo System.Management.ManagementScope nel riflettore che sembra trapelare un puntatore IWbemServices. Sembra che questa sia un'interfaccia COM che deve avere il rilascio chiamato su di esso (Marshal.ReleaseComObject()). Non sono sicuro se ciò sia correlato o meno. Mi collego a molti server diversi durante la vita del processo.

risposta

2

Ho lo stesso tipo di applicazione che esegue più query WMI su tutti i diversi tipi di dispositivi e ho lo stesso comportamento. L'utilizzo di wbemtest è talvolta più veloce ma non necessariamente. Trovo anche che alcune query sulla stessa macchina si comportino diversamente dalle altre query sulla stessa macchina semplicemente perché una classe diversa è una query.

Esiste una proprietà ReturnImmediatamente appartenente alla classe EnumerationOptions che potrebbe aiutare a ottenere risultati più velocemente se li si ottiene in un batch invece di enumerarli in rete.

EnumerationOptions options = new EnumerationOptions(); 
options.ReturnImmediately = false; 

Puoi provarlo e vedere se aiuta. So che questo non è ciò che vuoi sentire, ma la mia opinione personale è che non c'è molto che tu possa fare. È necessario scrivere il codice per risolvere il problema. La vera risposta è da qualche parte nascosta nelle ciotole di DCOM, il protocollo WMI e il repository WMI.

+0

Purtroppo, penso che tu abbia ragione. Ho solo bisogno di risolvere il problema. L'impostazione ReturnImmediately ha aiutato un po 'ma non abbastanza per risolvere il problema. –

0

Il problema è specifico per una scatola? Una volta ho avuto lo stesso problema con uno scenario remoto. L'ho risolto ricostruendo lo stack TCP/IP sulla casella che effettua la chiamata remota.

+0

No. Questo accade ad alcuni dei computer di destinazione (ma non tutti). Quando vedo le query lente nei registri e provo a interrogare manualmente, il problema è risolto. –

+0

E i computer di origine (quelli che effettuano le chiamate)? Il problema è specifico per qualcuno di loro? –

+0

Sì e No :). Ci sono più computer di origine che hanno questo problema, ma non tutti i server su cui ho provato questo problema. –

2

Si potrebbe provare e impostare il campo WITHIN per vedere se impone che la query si verifichi prima. Potresti pubblicare la query che stai utilizzando? Ciò potrebbe aiutare a risolvere eventuali altri problemi

0

Cerca nel WBEM_FLAG_RETURN_IMMEDIATE & flag WBEM_FLAG_FORWARD_ONLY per la tua lingua. Quando si utilizza Scriptomatic (ottima piccola GUI VBScript da MS per effettuare chiamate WMI) questa opzione viene automaticamente aggiunta come parte delle opzioni. Il 48 significa WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY. VBScript esempio:

objWMIService.ExecQuery ("Select * from Win32_NetworkConnection",,48) 

https://msdn.microsoft.com/en-us/library/aa390880(v=vs.85).aspx