Har skrivit ett datalager som en COM+-komponent i VB.NET och när jag kör koden i kundens miljö så ligger dllhost.exe och drar massa CPU-kraft (60%) både när komponenten används och även när jag har stängt av min klient. dllhost.exe är för alla trådar du har öppet mellan klienten och webbservern. Även de trådar som finns mellan webbserver och databaslager om jag inte minns fel. Hej, Hej, Hej, Hej, mycket konstigt, jag ser ju inga felaktigheter i din kod. Har tyvärr inte Visual Studio installerat på test-servern. Jag får titta på remote debugging och återkomma senare. titta under debug menyn, windows, threads. Hej, Komplettering av info:dllhost.exe och hög CPU-last
När jag stänger ner COM+-applikationen försvinner dllhost.exe från process-listan, men när jag startar den igen så kommer den upp igen och lägger sig på 30% CPU-last. Väldigt märkligt...
Någon som har en aning om vad detta kan vara?
/JeppeSv: dllhost.exe och hög CPU-last
Om din dll drar 60% av lasten kan det vara så att du skrivit dina connections felaktigt, inte sätter objekten till nothing efter de använts på aspsidan osv.
Ju fler som surfar till siten, desto fler dllhosts.exe dras också igång. Minskar besöken och timeout är gjort på många användare minskar även antalet hosts.
Testa att inte kalla några databasrutiner i din dll som ligger och se om storleken minskar avsevärt - då är det connectionsträngar och dataanslutningar som du bör titta på.Sv: dllhost.exe och hög CPU-last
Min applikation som använder COM+-komponenten (distribuerade transaktioner) är en Windows-applikation och jag framkallar detta fel med en enda instans av klienten. Jag använder tre olika klasser från COM+-komponenten i ett affärslager som klienten använder och alla objekt sätts till Nothing.
Jag får inte detta fenomen på min utvecklingsmaskin, men en skillnad är att jag kör XP med COM+ 1.5, medan kundmaskinen kör Windows 2000 med COM+ 1.0.
Funderar även på om det kan vara GC som strular.Sv: dllhost.exe och hög CPU-last
Applikationen som använder datalagret är ingen web-applikation utan en Windows-klient. Eller egentligen är det ett affärslager mellan klienten och datalagret också. I vilket fall som helst har jag kollat att alla objekt sätts till Nothing.
Jag kan ju tillägga att detta fenomen inte uppstår på min utvecklingsdator som är XP Pro (COM+ 1.5) utan på en Windows 2000 (COM+ 1.0) och kanske kan det vara någon sorts inkompatibilitet där emellan?
Funderade ett tag på om det kunde vara GarbageCollection som strulade, men processen håller sin höga CPU-last även när jag provar att köra GC.Collect.
Är även lite osäker på hur en korrekt uppstädning av COM+-objekt skall gå till. Räcker det med Nothing eller behöver man även köra Dispose. Någon som vet?
/Jeppe
Tillägg: Varför ser jag inte denna tråd bland "Trådar som du inte avslutat."?Sv: dllhost.exe och hög CPU-last
Sannolikheten för att något inte är kompatiblet är väldigt
liten, sannolikt är det du som har gjort fel på något sätt.
Börja med att undersöka vad din COM+ applikation håller
på med. Attacha en debugger till dllhost.exe och kika på
vilka trådar som exekverar, du kan prova att "frysa" dem
genom att högerklicka på tåden och välja freeze.
Gå så igenom de trådar som exekverar där och undersök
och du kan hitta vilken det är som äter upp din cpu tid.
Jobbar du med serviced komponents så BÖR du alltid anropa
Dispose.
Hoppas det hjälper, DanielSv: dllhost.exe och hög CPU-last
Jag kan framkalla detta felet utan att applikationen gör något arbete. Det räcker att jag kör nedanstående klient-kod för att CPU:n skall dra iväg.
Klient (knapp-kod):
<code>Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim x As New DALTestDAL.Transaction1()
x.MyMethod()
x.Dispose()
x = Nothing
End Sub</code>
COM+-klassen:
<code>' Transaction1
Imports System.EnterpriseServices
Imports System
' The Transaction attribute makes your class transaction aware. Your class can set the transactional type of your
' object to one of the following:
'
' Required
' Required New
' Supported
' Not Supported
' Disabled
<Transaction(TransactionOption.Supported)> _
Public Class Transaction1
Inherits ServicedComponent
' Implement the methods of your class here.
'
' Transactional components use the ContextUtil object to notify the caller as to whether or not
' they completed successfully. If the transaction could succeed, the method should set
' ContextUtil.SetComplete. If the transaction cannot succeed, the method should set
' ContextUtil.SetAbort.
'
Public Sub MySub()
Try
' Code to do transactional work here.
' No errors. Declare that the transaction can complete with SetComplete
ContextUtil.SetComplete()
Catch ex As Exception
' An exception was thrown while processing the transaction.
' The transaction cannot complete and calls SetAbort.
contextutil.SetAbort()
End Try
End Sub
' Instead of explicitly setting the ContextUtil state, methods in a transactional class can take the
' AutoComplete attribute. If the method returns successfully, SetComplete will be called.
' If the method throws an exception, SetAbort will be called.
'
<AutoComplete()> _
Public Sub MyMethod()
End Sub
End Class</code>Sv: dllhost.exe och hög CPU-last
Vad hittar du för trådar i dllhost.exe om du fäster en
debugger på den?Sv: dllhost.exe och hög CPU-last
Tillägg:
Nu har jag fått igång remote debugging och kan komma åt processen i Visual Studio på min dator, men jag ser inget sätt att se vilka trådar som körs. Något tips om hur man gör? Skall jag använda debuggern i Visual Studio?Sv: dllhost.exe och hög CPU-last
tryck på pause för att bryta processen och titta på vilka trådar
som finns i ditt fönster
gör det ett par gånger och prova även att frysa de olika
trådarna för att se vilken/vilka som suger upp din processorkraft.
du pausar genom freeze som finns som högerklick i tråd fönstretSv: dllhost.exe och hög CPU-last
Har grejat lite med debuggingen nu och jag vet inte om jag blir klokare.
När jag kör igång mitt test-program på servern får jag två dllhost.exe-processer. Den ena har username = SYSTEM och den andra har username = Administrator. Jag är inloggad som Administrator. På den process som system äger ligger CPU-lasten på runt 70-60% och på den andra ligger lasten på runt 40-30%.
Om jag startar mitt VB-projekt på min utvecklingsdator och gör attach på de två server-processerna och sedan pausar VB-programmet så kan jag välja bland processerna i knappraden Debug Location. Om jag väljer dllhost.exe med system som ägare så ser jag inga trådar. Den andra processen kan jag välja två gånger i combo-boxen, DLLHOST.EXE: T-SQL och DLLHOST.EXE: DefaultDomain. På de processer som heter DLLHOST.EXE: T-SQL ser jag inga trådar och på DefaultDomain ser jag fem trådar varav en har Location = System.EnterpriseServices.ServicedComponentProxy::QueueCleaner. Om jag provar att frysa alla trådar på samma gång händer ingenting med CPU-lasten.
Kan jag göra något mer för att hitta orsaken på detta sätt eller kan det hjälpa mig mer om jag installerar Visual Studio på servern för att se om jag får samma fenomen när jag kör koden från VS?Sv: dllhost.exe och hög CPU-last
Har nu testat samma kod på en nyinstallerad 2003-server och där uppträder inte detta CPU-fenomen alls.
Har även testat på en tredje W2K-server (både med SP3 och SP4) och CPU-lasten drar iväg...