Ik heb al een tijdje een WCF service draaien, met bijbehorende Windows clients die daar naar verbinden. Dit is allemaal redelijk gehaast geprogrammeerd en ik heb me destijds niet veel verdiept in de verschillende mogelijkheden van WCF. De service heeft lang prima gedraaid dus had ik er geen omkijk naar.
Nu echter lijkt het wat populairder te worden, er draaien meer clients en nu lijk ik in IIS tegen een virtual memory limit aan te lopen. Ik weet het nog niet helemaal zeker, maar ik denk dat het probleem is dat ik veel te veel instances van de service continue in memory hou, ook al is daar niet echt een reden toe.
Ik weet nu dat ik kan kiezen tussen drie manieren waarop de instancing gedaan wordt:
1. PerCall: nieuwe instance voor elke call
2. PerSession (default, deze gebruik ik dus momenteel): een instance per sessie die expliciet afgesloten met worden.
3. Single: een enkele instance voor alle clients.
Ik heb mezelf ervan overtuigd dat PerSession niet goed is voor mijn service. Het typische gebruik van de client applicatie is om tijdens Windows startup een keer te verbinden, en daarna vrijwel niks meer te doen. Af en toe zal er een call gemaakt worden naar de service, misschien een paar keer per dag. Met de PerSession instancing als ik het goed begrijp worden er dus wel voor alle clients een nieuwe instance gemaakt en die blijft dus open staan, ook al wordt er bijna geen gebruik van gemaakt.
De vraag is nu echter: welke keuze is dan wel juist? Ik kan me voorstellen dat PerCall ook niet ideaal is vooral als er veel mensen tegelijk willen verbinden (dit komt af en toe voor). Wat gebeurt er als er ineens teveel mensen gaan verbinden? In dat geval raak ik waarschijnlijk ook de IIS virtual memory limiet en zal de service ook gestopt worden.
Een single instance lijkt me echter ook niet ideaal omdat ik dan zelf goed moet omgaan met concurrency. Dat wil zeggen dat ik de service helemaal zou moeten aanpassen. Als dat nodig is, so be it, maar liever niet natuurlijk.
Een antwoord wat ik al verwacht is natuurlijk: probeer het en meet wat het beste is. Maar dan kom ik bij de follow-up vraag... Hoe doe ik dat? Ik heb geen directe toegang tot mijn server, het is een shared host en ik kan hoogstens via Plesk een paar logs zien of IIS stoppen/starten.
Ik zou graag bijvoorbeeld willen loggen hoeveel virtual memory ik op dit moment gebruik (hoe dicht zit ik bij de limiet, hoe snel groeit het nadat ik de service start, etc), en hoeveel instances van de service zijn er momenteel live? Ik zie dat er performance counters zijn voor WCF, maar de resultaten zijn alleen in te zien op de server zelf, daar heb ik dus geen toegang toe voor zover ik kan vinden. Kan ik op een of andere manier in de code van mijn service zelf deze info ophalen en ergens in een database wegschrijven?
Bedankt!
Nu echter lijkt het wat populairder te worden, er draaien meer clients en nu lijk ik in IIS tegen een virtual memory limit aan te lopen. Ik weet het nog niet helemaal zeker, maar ik denk dat het probleem is dat ik veel te veel instances van de service continue in memory hou, ook al is daar niet echt een reden toe.
Ik weet nu dat ik kan kiezen tussen drie manieren waarop de instancing gedaan wordt:
1. PerCall: nieuwe instance voor elke call
2. PerSession (default, deze gebruik ik dus momenteel): een instance per sessie die expliciet afgesloten met worden.
3. Single: een enkele instance voor alle clients.
Ik heb mezelf ervan overtuigd dat PerSession niet goed is voor mijn service. Het typische gebruik van de client applicatie is om tijdens Windows startup een keer te verbinden, en daarna vrijwel niks meer te doen. Af en toe zal er een call gemaakt worden naar de service, misschien een paar keer per dag. Met de PerSession instancing als ik het goed begrijp worden er dus wel voor alle clients een nieuwe instance gemaakt en die blijft dus open staan, ook al wordt er bijna geen gebruik van gemaakt.
De vraag is nu echter: welke keuze is dan wel juist? Ik kan me voorstellen dat PerCall ook niet ideaal is vooral als er veel mensen tegelijk willen verbinden (dit komt af en toe voor). Wat gebeurt er als er ineens teveel mensen gaan verbinden? In dat geval raak ik waarschijnlijk ook de IIS virtual memory limiet en zal de service ook gestopt worden.
Een single instance lijkt me echter ook niet ideaal omdat ik dan zelf goed moet omgaan met concurrency. Dat wil zeggen dat ik de service helemaal zou moeten aanpassen. Als dat nodig is, so be it, maar liever niet natuurlijk.
Een antwoord wat ik al verwacht is natuurlijk: probeer het en meet wat het beste is. Maar dan kom ik bij de follow-up vraag... Hoe doe ik dat? Ik heb geen directe toegang tot mijn server, het is een shared host en ik kan hoogstens via Plesk een paar logs zien of IIS stoppen/starten.
Ik zou graag bijvoorbeeld willen loggen hoeveel virtual memory ik op dit moment gebruik (hoe dicht zit ik bij de limiet, hoe snel groeit het nadat ik de service start, etc), en hoeveel instances van de service zijn er momenteel live? Ik zie dat er performance counters zijn voor WCF, maar de resultaten zijn alleen in te zien op de server zelf, daar heb ik dus geen toegang toe voor zover ik kan vinden. Kan ik op een of andere manier in de code van mijn service zelf deze info ophalen en ergens in een database wegschrijven?
Bedankt!