Dela via


Prestanda för Windows Workflow Foundation 4

.NET Framework 4 innehåller en större revision av Windows Workflow Foundation (WF) med stora investeringar i prestanda. Den här nya revisionen introducerar betydande designändringar från tidigare versioner av WF som levererades som en del av .NET Framework 3.0 och .NET Framework 3.5. Den har byggts om från kärnan i programmeringsmodellen, körningen och verktygen för att avsevärt förbättra prestanda och användbarhet. Det här avsnittet visar de viktiga prestandaegenskaperna för dessa revisioner och jämför dem med dem i den tidigare versionen.

Prestanda för enskilda arbetsflödeskomponenter har ökat med storleksordningar mellan WF3 och WF4. Detta lämnar klyftan mellan handkodade WCF-tjänster (Windows Communication Foundation) och WCF-arbetsflödestjänster ganska små. Arbetsflödets svarstid har minskat avsevärt i WF4. Beständighetsprestanda har ökat med en faktor på 2,5–3,0. Hälsoövervakning med hjälp av arbetsflödesspårning har betydligt mindre omkostnader. Det här är övertygande skäl att migrera till eller använda WF4 i dina program.

Terminologi

Den version av WF som introducerades i .NET Framework 4 kallas WF4 för resten av det här avsnittet. WF introducerades i .NET Framework 3.0 och hade några mindre revisioner via .NET Framework 3.5 SP1. .NET Framework 3.5-versionen av Workflow Foundation kallas WF3 för resten av det här avsnittet. WF3 levereras i .NET Framework 4 sida vid sida med WF4. Mer information om hur du migrerar WF3-artefakter till WF4 finns i migreringsguiden för Windows Workflow Foundation 4.

Windows Communication Foundation (WCF) är Microsofts enhetliga programmeringsmodell för att skapa tjänstorienterade program. Den introducerades först som en del av .NET Framework 3.0 tillsammans med WF3 och är nu en av huvudkomponenterna i .NET Framework.

Windows Server AppFabric är en uppsättning integrerade tekniker som gör det enklare att skapa, skala och hantera webbprogram och sammansatta program som körs på IIS. Den innehåller verktyg för övervakning och hantering av tjänster och arbetsflöden. Mer information finns i Windows Server AppFabric 1.0.

Mål

Målet med det här avsnittet är att visa prestandaegenskaperna för WF4 med data som mäts för olika scenarier. Den innehåller också detaljerade jämförelser mellan WF4 och WF3 och visar därmed de stora förbättringar som har gjorts i den här nya revisionen. Scenarierna och data som presenteras i den här artikeln kvantifierar den underliggande kostnaden för olika aspekter av WF4 och WF3. Dessa data är användbara för att förstå prestandaegenskaperna för WF4 och kan vara till hjälp vid planering av migreringar från WF3 till WF4 eller med WF4 i programutveckling. Man bör dock vara försiktig med de slutsatser som dras av de uppgifter som presenteras i den här artikeln. Prestandan för ett sammansatt arbetsflödesprogram är mycket beroende av hur arbetsflödet implementeras och hur olika komponenter är integrerade. Man måste mäta varje program för att fastställa programmets prestandaegenskaper.

Översikt över prestandaförbättringar i WF4

WF4 utformades noggrant och implementerades med höga prestanda och skalbarhet som beskrivs i följande avsnitt.

WF-körning

Kärnan i WF-körningen är en asynkron schemaläggare som driver körningen av aktiviteterna i ett arbetsflöde. Det ger en högpresterande, förutsägbar körningsmiljö för aktiviteter. Miljön har ett väldefinierat kontrakt för körning, fortsättning, slutförande, annullering, undantag och en förutsägbar trådmodell.

Jämfört med WF3 har WF4-körningen en effektivare schemaläggare. Den utnyttjar samma I/O-trådpool som används för WCF, vilket är mycket effektivt vid körning av batchbaserade arbetsobjekt. Den interna schemaläggningskön för arbetsobjekt är optimerad för de vanligaste användningsmönstren. WF4-körningen hanterar även körningstillstånden på ett mycket enkelt sätt med minimal synkronisering och händelsehanteringslogik, medan WF3 är beroende av tung händelseregistrering och anrop för att utföra komplex synkronisering för tillståndsövergångar.

Datalagring och flöde

I WF3 modelleras data som är associerade med en aktivitet genom beroendeegenskaper som implementeras av typen DependencyProperty. Beroendeegenskapsmönstret introducerades i Windows Presentation Foundation (WPF). I allmänhet är det här mönstret mycket flexibelt för att stödja enkel databindning och andra gränssnittsfunktioner. Mönstret kräver dock att egenskaperna definieras som statiska fält i arbetsflödesdefinitionen. När WF-körningen ställer in eller hämtar egenskapsvärdena innebär det tungt viktad uppslagslogik.

WF4 använder klar dataomfångslogik för att avsevärt förbättra hur data hanteras i ett arbetsflöde. Den separerar data som lagras i en aktivitet från data som flödar över aktivitetsgränserna med hjälp av två olika begrepp: variabler och argument. Genom att använda ett tydligt hierarkiskt omfång för variabler och "In/Out/InOut"-argument minskas dataanvändningskomplexiteten för aktiviteter dramatiskt och datalivslängden begränsas också automatiskt. Aktiviteter har en väldefinierad signatur som beskrivs av dess argument. Genom att bara inspektera en aktivitet kan du avgöra vilka data den förväntar sig att ta emot och vilka data som ska skapas av den som ett resultat av dess körning.

I WF3 initierades aktiviteter när ett arbetsflöde skapades. I WF 4 initieras aktiviteter endast när motsvarande aktiviteter körs. Detta möjliggör en enklare aktivitetslivscykel utan att utföra initiera/uninitialisera åtgärder när en ny arbetsflödesinstans skapas och har därmed uppnått större effektivitet

Kontrollflöde

Precis som i alla programmeringsspråk ger WF stöd för kontrollflöden för arbetsflödesdefinitioner genom att introducera en uppsättning kontrollflödesaktiviteter för sekvensering, loopning, förgrening och andra mönster. När samma aktivitet måste köras igen i WF3 skapas en ny ActivityExecutionContext och aktiviteten klonas via en tung serialiserings- och deserialiseringslogik baserat på BinaryFormatter. Vanligtvis är prestandan för iterativa kontrollflöden mycket långsammare än att köra en sekvens med aktiviteter.

WF4 hanterar detta på ett helt annat sätt. Den tar aktivitetsmallen, skapar ett nytt ActivityInstance-objekt och lägger till det i scheduler-kön. Hela den här processen omfattar endast explicit skapande av objekt och är mycket enkel.

Asynkron programmering

Program har vanligtvis bättre prestanda och skalbarhet med asynkron programmering för tidskrävande blockeringsåtgärder som I/O eller distribuerade databehandlingsåtgärder. WF4 ger asynkront stöd via basaktivitetstyper AsyncCodeActivity, AsyncCodeActivity<TResult>. Körningen förstår asynkrona aktiviteter internt och kan därför automatiskt placera instansen i en icke-bestående zon medan det asynkrona arbetet är enastående. Anpassade aktiviteter kan härledas från dessa typer för att utföra asynkront arbete utan att hålla i tråden för arbetsflödesschemaläggaren och blockera aktiviteter som kan köras parallellt.

Meddelandetjänster

Ursprungligen hade WF3 mycket begränsat meddelandestöd via externa händelser eller anrop av webbtjänster. I .NET Framework 3.5 kan arbetsflöden implementeras som WCF-klienter eller exponeras som WCF-tjänster via SendActivity och ReceiveActivity. I WF4 har begreppet arbetsflödesbaserad meddelandeprogrammering förstärkts ytterligare genom en nära integrering av WCF-meddelandelogik i WF.

Den enhetliga pipelinen för meddelandebearbetning som tillhandahålls i WCF i .NET 4 hjälper WF4-tjänster att få betydligt bättre prestanda och skalbarhet än WF3. WF4 ger också ett mer omfattande stöd för meddelandeprogrammering som kan modellera komplexa Message Exchange Patterns (MEP). Utvecklare kan använda antingen maskinskrivna tjänstkontrakt för att uppnå enkel programmering eller oskrivna tjänstkontrakt för att uppnå bättre prestanda utan att betala serialiseringskostnader. Stöd för cachelagring på klientsidan via SendMessageChannelCache klassen i WF4 hjälper utvecklare att skapa snabba program med minimal ansträngning. Mer information finns i Ändra cachedelningsnivåer för skicka aktiviteter.

Deklarativ programmering

WF4 tillhandahåller ett rent och enkelt deklarativt programmeringsramverk för att modellera affärsprocesser och tjänster. Programmeringsmodellen stöder helt deklarativ sammansättning av aktiviteter, utan kod bredvid, vilket avsevärt förenklar arbetsflödesredigeringen. I .NET Framework 4 har det XAML-baserade deklarativa programmeringsramverket enhetligt i den enda sammansättningen System.Xaml.dll för att stödja både WPF och WF.

I WF4 ger XAML en verkligt deklarativ upplevelse och gör att hela definitionen av arbetsflödet kan definieras i XML-markering, referera till aktiviteter och typer som skapats med hjälp av .NET. Detta var svårt att göra i WF3 med XOML-format utan att behöva anpassad kod bakom logik. Den nya XAML-stacken i .NET 4 har mycket bättre prestanda vid serialisering/deserialisering av arbetsflödesartefakter och gör deklarativ programmering mer attraktiv och solid.

Arbetsflödesdesigner

Fullständigt deklarativt programmeringsstöd för WF4 ställer uttryckligen högre krav för designtidsprestanda för stora arbetsflöden. Arbetsflödesdesignern i WF4 har mycket bättre skalbarhet för stora arbetsflöden än för WF3. Med stöd för användargränssnittsvirtualisering kan designern enkelt läsa in ett stort arbetsflöde med 1 000 aktiviteter på några sekunder, medan det är nästan omöjligt att läsa in ett arbetsflöde med några hundra aktiviteter med WF3-designern.

Prestandajämförelser på komponentnivå

Det här avsnittet innehåller data om direkta jämförelser mellan enskilda aktiviteter i WF3- och WF4-arbetsflöden. Viktiga områden som beständighet har en mer djupgående inverkan på prestanda än de enskilda aktivitetskomponenterna. Prestandaförbättringarna i enskilda komponenter i WF4 är dock viktiga eftersom komponenterna nu är tillräckligt snabba för att jämföras med handkodad orkestreringslogik. Ett exempel som beskrivs i nästa avsnitt: "Scenario för tjänstsammansättning".

Miljökonfiguration

Environment setup for workflow performance measurement

Bilden ovan visar den datorkonfiguration som används för prestandamätning på komponentnivå. En enskild server och fem klienter som är anslutna via ett Ethernet-nätverksgränssnitt på 1 Gbit/s. För enkla mätningar är servern konfigurerad att använda en enda kärna av en dubbel-proc/quad-core server som kör Windows Server 2008 x86. Systemets CPU-användning underhålls på nästan 100 %.

Testinformation

WF3 CodeActivity är förmodligen den enklaste aktiviteten som kan användas i ett WF3-arbetsflöde. Aktiviteten anropar en metod i koden bakom som arbetsflödesprogrammet kan placera anpassad kod i. I WF4 finns det ingen direkt analog till WF3 CodeActivity som tillhandahåller samma funktioner. Observera att det finns en CodeActivity basklass i WF4 som inte är relaterad till WF3 CodeActivity. Arbetsflödesförfattare uppmuntras att skapa anpassade aktiviteter och skapa XAML-endast arbetsflöden. I testerna nedan används en aktivitet med namnet Comment i stället för ett tomt CodeActivity i WF4-arbetsflöden. Koden i Comment aktiviteten är följande:

[ContentProperty("Body")]
    public sealed class Comment : CodeActivity
    {
        public Comment()
            : base()
        {
        }

        [DefaultValue(null)]
        public Activity Body
        {
            get;
            set;
        }

        protected override void Execute(CodeActivityContext context)
        {
        }
    }

Tomt arbetsflöde

Det här testet använder ett sekvensarbetsflöde utan underordnade aktiviteter.

Enskild aktivitet

Arbetsflödet är ett sekvensarbetsflöde som innehåller en underordnad aktivitet. Aktiviteten är en CodeActivity utan kod i WF3-fallet och en Comment aktivitet i WF4-fallet.

Med 1 000 iterationer

Sekvensarbetsflödet innehåller en While aktivitet med en underordnad aktivitet i loopen som inte utför något arbete.

Replikator jämfört med ParallelForEach

ReplicatorActivity i WF3 har sekventiella och parallella körningslägen. I sekventiellt läge liknar WhileActivityaktivitetens prestanda . Är ReplicatorActivity mest användbart för parallell körning. WF4-analogen ParallelForEach<T> för detta är aktiviteten.

Följande diagram visar de arbetsflöden som används för det här testet. WF3-arbetsflödet finns till vänster och WF4-arbetsflödet finns till höger.

WF3 ReplicatorActivity and WF4 ParallelForEach

Sekventiellt arbetsflöde med fem aktiviteter

Det här testet är avsett att visa effekten av att flera aktiviteter körs i följd. Det finns fem aktiviteter i sekvensen.

Transaktionsomfång

Transaktionsomfångstestet skiljer sig något från de andra testerna eftersom en ny arbetsflödesinstans inte skapas för varje iteration. I stället struktureras arbetsflödet med en while-loop som innehåller en TransactionScope aktivitet som innehåller en enda aktivitet som inte fungerar. Varje körning av en batch med 50 iterationer via while-loopen räknas som en enda åtgärd.

Kompensation

WF3-arbetsflödet har en enda kompenserande aktivitet med namnet WorkScope. Aktiviteten implementerar ICompensatableActivity helt enkelt gränssnittet:

class WorkScope :
        CompositeActivity, ICompensatableActivity
    {
        public WorkScope() : base() { }

        public WorkScope(string name)
        {
            this.Name = name;
        }

        public ActivityExecutionStatus Compensate(
            ActivityExecutionContext executionContext)
        {
            return ActivityExecutionStatus.Closed;
        }
    }

Felhanteraren riktar in sig på WorkScope aktiviteten. WF4-arbetsflödet är lika förenklat. A CompensableActivity har ett organ och en kompensationshanterare. En explicit kompensation är nästa i sekvensen. Aktivitet för brödtext och kompensationshanterare är båda tomma implementeringar:

public sealed class CompensableActivityEmptyCompensation : CodeActivity
    {
        public CompensableActivityEmptyCompensation()
            : base() { }

        public Activity Body { get; set; }

        protected override void Execute(CodeActivityContext context) { }
    }
    public sealed class CompensableActivityEmptyBody : CodeActivity
    {
        public CompensableActivityEmptyBody()
            : base() { }

        public Activity Body { get; set; }

        protected override void Execute(CodeActivityContext context) { }
    }

Följande diagram visar arbetsflödet för grundläggande kompensation. WF3-arbetsflödet finns till vänster och WF4-arbetsflödet finns till höger.

WF3 and WF4 basic compensation workflows

Prestandatestresultat

Table showing performance test results data

Column chart comparing WF3 and WF4 performance test data

Alla tester mäts i arbetsflöden per sekund med undantag för transaktionsomfångstestet. Som du ser ovan har WF-körningsprestandan förbättrats över hela linjen, särskilt i områden som kräver flera körningar av samma aktivitet som while-loopen.

Scenario för tjänstsammansättning

Som visas i föregående avsnitt, "Prestandajämförelser på komponentnivå", har det skett en betydande minskning av omkostnaderna mellan WF3 och WF4. WCF-arbetsflödestjänster kan nu nästan matcha prestandan för handkodade WCF-tjänster men har fortfarande alla fördelar med WF-körningen. Det här testscenariot jämför en WCF-tjänst med en WCF-arbetsflödestjänst i WF4.

Onlinebutikstjänst

En av fördelarna med Windows Workflow Foundation är möjligheten att skapa processer med flera tjänster. I det här exemplet finns det en onlinebutikstjänst som samordnar två tjänstanrop för att köpa en beställning. Det första steget är att verifiera ordern med hjälp av en orderverifierande tjänst. Det andra steget är att fylla i ordern med hjälp av en lagertjänst.

De två serverdelstjänsterna, Order Validating Service och Warehouse Service, förblir desamma för båda testerna. Den del som ändras är onlinebutikstjänsten som utför orkestreringen. I ett fall är tjänsten handkodad som en WCF-tjänst. I det andra fallet skrivs tjänsten som en WCF-arbetsflödestjänst i WF4. WF-specifika funktioner som spårning och beständighet inaktiveras för det här testet.

Environment

Environment setup for performance measurement

Klientbegäranden görs till Online Store-tjänsten via HTTP från flera datorer. En enda dator är värd för alla tre tjänsterna. Transportlagret mellan Online Store-tjänsten och serverdelstjänsterna är TCP eller HTTP. Mätningen av åtgärder/sekund baseras på antalet slutförda PurchaseOrder anrop till Online Store-tjänsten. Kanalpooler är en ny funktion som är tillgänglig i WF4. I WCF-delen av den här testkanalpoolen tillhandahålls inte en handkodad implementering av en enkel poolteknik i Online Store-tjänsten.

Prestanda

Column chart showing online Store Service performance

Anslut till serverdels-TCP-tjänster utan kanalpooler har WF-tjänsten 17,2 % inverkan på dataflödet. Med kanalpooler är straffet cirka 23,8 %. För HTTP är effekten mycket mindre: 4,3 % utan poolning och 8,1 % med poolning. Det är också viktigt att observera att kanalpoolen ger mycket lite nytta när du använder HTTP.

Även om det finns kostnader från WF4-körningen jämfört med en handkodad WCF-tjänst i det här testet, kan det betraktas som ett värsta scenario. De två serverdelstjänsterna i det här testet gör mycket lite arbete. I ett verkligt scenario från slutpunkt till slutpunkt skulle dessa tjänster utföra dyrare åtgärder som databasanrop, vilket gör prestandapåverkan på transportlagret mindre viktig. Detta plus fördelarna med de funktioner som är tillgängliga i WF4 gör Workflow Foundation till ett genomförbart val för att skapa orkestreringstjänster.

Viktiga prestandaöverväganden

Funktionsområdena i det här avsnittet, med undantag för interop, har ändrats dramatiskt mellan WF3 och WF4. Detta påverkar utformningen av arbetsflödesprogram samt prestanda.

Svarstid för arbetsflödesaktivering

I ett WCF-arbetsflödestjänstprogram är svarstiden för att starta ett nytt arbetsflöde eller läsa in ett befintligt arbetsflöde viktigt eftersom det kan blockera. Det här testfallet mäter en WF3 XOML-värd mot en WF4 XAMLX-värd i ett typiskt scenario.

Miljökonfiguration

Environment setup for latency and throughput tests

Testkonfiguration

I scenariot kontaktar en klientdator en WCF-arbetsflödestjänst med hjälp av kontextbaserad korrelation. Kontextkorrelation kräver en särskild kontextbindning och använder en kontextrubrik eller cookie för att relatera meddelanden till rätt arbetsflödesinstans. Det har en prestandafördel eftersom korrelations-ID:t finns i meddelandehuvudet så att meddelandetexten inte behöver parsas.

Tjänsten skapar ett nytt arbetsflöde med begäran och skickar ett omedelbart svar så att mätningen av svarstid inte inkluderar den tid som ägnas åt att köra arbetsflödet. WF3-arbetsflödet är XOML med en bakomliggande kod och WF4-arbetsflödet är helt XAML. WF4-arbetsflödet ser ut så här:

WF4 Correlation Scope workflow

Aktiviteten Receive skapar arbetsflödesinstansen. Ett värde som skickas i det mottagna meddelandet upprepas i svarsmeddelandet. En sekvens efter svaret innehåller resten av arbetsflödet. I ovanstående fall visas endast en kommentarsaktivitet. Antalet kommentarsaktiviteter ändras för att simulera arbetsflödets komplexitet. En kommentarsaktivitet motsvarar en WF3 CodeActivity som inte utför något arbete. Mer information om kommentarsaktiviteten finns i avsnittet Prestandajämförelse på komponentnivå tidigare i den här artikeln.

Testresultat

Kall och varm svarstid för WCF-arbetsflödestjänster:

Column chart showing cold and warm latency for WCF workflow services using WF3 and WF4

I föregående diagram refererar kall till det fall där det inte finns någon befintlig WorkflowServiceHost för det angivna arbetsflödet. Med andra ord är kall svarstid när arbetsflödet används för första gången och XOML eller XAML måste kompileras. Varm svarstid är det dags att skapa en ny arbetsflödesinstans när arbetsflödestypen redan har kompilerats. Arbetsflödets komplexitet gör mycket liten skillnad i WF4-fallet men har en linjär förlopp i WF3-fallet.

Korrelationsdataflöde

WF4 introducerar en ny innehållsbaserad korrelationsfunktion. WF3 tillhandahöll endast kontextbaserad korrelation. Kontextbaserad korrelation kunde bara göras över specifika WCF-kanalbindningar. Arbetsflödes-ID:t infogas i meddelandehuvudet när du använder dessa bindningar. WF3-körningen kunde bara identifiera ett arbetsflöde med dess ID. Med innehållsbaserad korrelation kan arbetsflödesförfattaren skapa en korrelationsnyckel av en relevant datadel som ett kontonummer eller kund-ID.

Kontextbaserad korrelation har en prestandafördel eftersom korrelationsnyckeln finns i meddelandehuvudet. Nyckeln kan läsas från meddelandet utan av-serialisering/meddelandekopiering. I innehållsbaserad korrelation lagras korrelationsnyckeln i meddelandetexten. Ett XPath-uttryck används för att hitta nyckeln. Kostnaden för den här extra bearbetningen beror på meddelandets storlek, djupet på nyckeln i brödtexten och antalet nycklar. Det här testet jämför kontext- och innehållsbaserad korrelation och visar även prestandaförsämring när du använder flera nycklar.

Miljökonfiguration

Environment setup for workflow performance test

Testkonfiguration

Correlation Throughput Workflow Test

Det tidigare arbetsflödet är samma som används i avsnittet Beständighet . För korrelationstesterna utan beständighet finns det ingen beständighetsprovider installerad i körningen. Korrelation sker på två platser: CreateOrder och CompleteOrder.

Testresultat

Correlation Throughput

Det här diagrammet visar en minskning av prestanda när antalet nycklar som används i innehållsbaserad korrelation ökar. Likheten i kurvorna mellan TCP och HTTP anger de omkostnader som är associerade med dessa protokoll.

Korrelation med beständighet

Med ett beständiga arbetsflöde flyttas CPU-trycket från innehållsbaserad korrelation från arbetsflödeskörningen till SQL-databasen. De lagrade procedurerna i SQL-beständighetsprovidern utför arbetet med att matcha nycklarna för att hitta rätt arbetsflöde.

Line chart showing correlation and persistence results

Kontextbaserad korrelation är fortfarande snabbare än innehållsbaserad korrelation. Skillnaden är dock mindre uttalad eftersom beständighet har större inverkan på prestanda än korrelation.

Komplext arbetsflödesdataflöde

Komplexiteten i ett arbetsflöde mäts inte bara av antalet aktiviteter. Sammansatta aktiviteter kan innehålla många barn och dessa barn kan också vara sammansatta aktiviteter. När antalet kapslingsnivåer ökar ökar också antalet aktiviteter som för närvarande kan vara i körningstillståndet och antalet variabler som kan vara i tillstånd. Det här testet jämför dataflödet mellan WF3 och WF4 när komplexa arbetsflöden körs.

Testkonfiguration

Dessa tester utfördes på en Intel Xeon X5355 @ 2,66 GHz 4-vägsdator med 4 GB RAM-minne som kör Windows Server 2008 x64. Testkoden körs i en enda process med en tråd per kärna för att nå 100 % cpu-användning.

Arbetsflödena som genereras för det här testet har två huvudvariabler: djup och antal aktiviteter i varje sekvens. Varje djupnivå innehåller en parallell aktivitet, medan loop, beslut, tilldelningar och sekvenser. I WF4-designern som visas nedan visas det översta flödesdiagrammet. Varje flödesschemaaktivitet liknar huvudflödesschemat. Det kan vara bra att tänka på en fraktal när du visar det här arbetsflödet, där djupet är begränsat till testparametrarna.

Antalet aktiviteter i ett visst test bestäms av djupet och antalet aktiviteter per sekvens. Följande ekvation beräknar antalet aktiviteter i WF4-testet:

Equation to compute number of activities

WF3-testets aktivitetsantal kan beräknas med en något annorlunda ekvation på grund av en extra sekvens:

Equation to compute number of WF3 activities

Där d är djupet och ett är antalet aktiviteter per sekvens. Logiken bakom dessa ekvationer är att den första konstanten, multiplicerad med en, är antalet sekvenser och den andra konstanten är det statiska antalet aktiviteter på den aktuella nivån. Det finns tre underordnade flödesschemaaktiviteter i varje flödesschema. På den nedre djupnivån är dessa flödesscheman tomma, men på de andra nivåerna är de kopior av huvudflödesschemat. Antalet aktiviteter i varje testvariants arbetsflödesdefinition anges i följande tabell:

A table that shows the number of activities used in each test

Antalet aktiviteter i arbetsflödesdefinitionen ökar kraftigt för varje djupnivå. Men endast en sökväg per beslutspunkt körs i en viss arbetsflödesinstans, så endast en liten delmängd av de faktiska aktiviteterna körs.

Flowchart of the complex throughput workflow

Ett motsvarande arbetsflöde skapades för WF3. WF3-designern visar hela arbetsflödet i designområdet i stället för kapsling, därför är det för stort för att visas i det här avsnittet. Ett kodfragment av arbetsflödet visas nedan.

Flowchart snippet of the WF3 workflow

Om du vill använda kapsling i ett extremt fall använder ett annat arbetsflöde som ingår i det här testet 100 kapslade sekvenser. I den innersta sekvensen finns en enskild Comment eller CodeActivity.

Flowchart of a nested sequence

Spårning och beständighet används inte som en del av det här testet.

Testresultat

Column chart showing throughput performance results

Även med komplexa arbetsflöden med mycket djup och ett stort antal aktiviteter är prestandaresultaten konsekventa med andra dataflödesnummer som visades tidigare i den här artikeln. WF4:s dataflöde är storleksordningar snabbare och måste jämföras på en logaritmisk skala.

Minne

Minneskostnaderna för Windows Workflow Foundation mäts inom två nyckelområden: arbetsflödeskomplexitet och antal arbetsflödesdefinitioner. Minnesmätningar gjordes på en Windows 7 64-bitars arbetsstation. Det finns många sätt att hämta måttet för arbetsuppsättningens storlek, till exempel övervakning av prestandaräknare, avsökningsmiljö.WorkingSet eller med hjälp av ett verktyg som VMMap som är tillgängligt från VMMap. En kombination av metoder användes för att hämta och verifiera resultatet av varje test.

Arbetsflödets komplexitetstest

Arbetsflödets komplexitetstest mäter arbetsuppsättningsskillnaden baserat på arbetsflödets komplexitet. Utöver de komplexa arbetsflöden som användes i föregående avsnitt läggs nya varianter till för att täcka två grundläggande fall: ett arbetsflöde för en enda aktivitet och en sekvens med 1 000 aktiviteter. För dessa tester initieras och körs arbetsflödena till slutförande i en enda seriell loop under en period av en minut. Varje testvariant körs tre gånger och de data som registreras är genomsnittet av dessa tre körningar.

De två nya grundläggande testerna har arbetsflöden som ser ut som de som visas nedan:

Complex workflow for both WF3 and WF4

I WF3-arbetsflödet som visas ovan används tomma CodeActivity aktiviteter. WF4-arbetsflödet ovan använder Comment aktiviteter. Aktiviteten Comment beskrevs i avsnittet Prestandajämförelser på komponentnivå tidigare i den här artikeln.

Column chart showing complex workflow memory usage for WF3 and WF4 workflows

En av de tydliga trenderna att märka i det här diagrammet är att kapsling har relativt liten inverkan på minnesanvändningen i både WF3 och WF4. Den mest betydande minnespåverkan kommer från antalet aktiviteter i ett visst arbetsflöde. Med tanke på data från sekvens 1000, komplext djup 5 sekvens 5 och komplexa djup 7 sekvens 1 variationer, är det tydligt att när antalet aktiviteter kommer in tusentals, minnesanvändningen öka blir mer märkbar. I det extrema fallet (djup 7 sekvens 1) där det finns ~29 000 aktiviteter använder WF4 nästan 79 % mindre minne än WF3.

Test av flera arbetsflödesdefinitioner

Mätning av minne per arbetsflödesdefinition är indelat i två olika tester på grund av tillgängliga alternativ för att hantera arbetsflöden i WF3 och WF4. Testerna körs på ett annat sätt än arbetsflödets komplexitetstest eftersom ett visst arbetsflöde instanseras och körs bara en gång per definition. Det beror på att arbetsflödesdefinitionen och dess värd finns kvar i minnet under appdomänens livslängd. Det minne som används vid körning av en viss arbetsflödesinstans bör rensas under skräpinsamlingen. Migreringsvägledningen för WF4 innehåller mer detaljerad information om värdalternativen. Mer information finns i WF Migration Cookbook: Workflow Hosting( WF Migration Cookbook: Workflow Hosting).

Du kan skapa många arbetsflödesdefinitioner för ett arbetsflödesdefinitionstest på flera sätt. Man kan till exempel använda kodgenerering för att skapa en uppsättning med 1 000 arbetsflöden som är identiska förutom i namn och spara var och en av dessa arbetsflöden i separata filer. Den här metoden användes för det konsolhanterade testet. I WF3 WorkflowRuntime användes klassen för att köra arbetsflödesdefinitionerna. WF4 kan antingen använda WorkflowApplication för att skapa en enskild arbetsflödesinstans eller direkt använda WorkflowInvoker för att köra aktiviteten som om det vore ett metodanrop. WorkflowApplication är en värd för en enda arbetsflödesinstans och har en närmare funktionsparitet så WorkflowRuntime att den användes i det här testet.

När du är värd för arbetsflöden i IIS är det möjligt att använda en VirtualPathProvider för att skapa en ny WorkflowServiceHost i stället för att generera alla XAMLX- eller XOML-filer. Hanterar VirtualPathProvider den inkommande begäran och svarar med en "virtuell fil" som kan läsas in från en databas eller, i det här fallet, genereras i farten. Det är därför onödigt att skapa 1 000 fysiska filer.

Arbetsflödesdefinitionerna som användes i konsoltestet var enkla sekventiella arbetsflöden med en enda aktivitet. Den enda aktiviteten var tom CodeActivity för WF3-fallet och en Comment aktivitet för WF4-fallet. Det IIS-värdbaserade ärendet använde arbetsflöden som börjar ta emot ett meddelande och slutar med att skicka ett svar:

Följande bild visar ett WF3-arbetsflöde med ReceiveActivity och ett WF4-arbetsflöde med mönster för begäran/svar:

Workflow Services in WF3 and WF4

I följande tabell visas delta i arbetsuppsättningen mellan en enskild arbetsflödesdefinition och 1001-definitioner:

Värdalternativ Delta i WF3-arbetsuppsättning Delta i WF4-arbetsuppsättning
Värdbaserade arbetsflöden för konsolprogram 18 MB 9 MB
IIS-värdbaserade arbetsflödestjänster 446 MB 364 MB

Att vara värd för WorkflowServiceHostarbetsflödesdefinitioner i IIS förbrukar mycket mer minne på grund av , detaljerade WCF-tjänstartefakter och logiken för meddelandebearbetning som är associerad med värden.

För konsolvärd i WF3 implementerades arbetsflödena i kod i stället för XOML. I WF4 är standardvärdet att använda XAML. XAML lagras som en inbäddad resurs i sammansättningen och kompileras under körningen för att tillhandahålla implementeringen av arbetsflödet. Det finns vissa kostnader som är associerade med den här processen. För att göra en rättvis jämförelse mellan WF3 och WF4 användes kodade arbetsflöden i stället för XAML. Ett exempel på ett av WF4-arbetsflödena visas nedan:

public class Workflow1 : Activity
{
    protected override Func<Activity> Implementation
    {
        get
        {
            return new Func<Activity>(() =>
            {
                return new Sequence
                {
                    Activities = {
                        new Comment()
                    }
                };
            });
        }
        set
        {
            base.Implementation = value;
        }
    }
}

Det finns många andra faktorer som kan påverka minnesförbrukningen. Samma råd för alla hanterade program gäller fortfarande. I IIS-värdbaserade miljöer finns objektet WorkflowServiceHost som skapats för en arbetsflödesdefinition kvar i minnet tills programpoolen återanvänds. Detta bör vara i åtanke när du skriver tillägg. Det är också bäst att undvika "globala" variabler (variabler som är begränsade till hela arbetsflödet) och begränsa omfånget för variabler där det är möjligt.

Arbetsflödeskörningstjänster

Bevarande

WF3 och WF4 levereras båda med en SQL-beständighetsprovider. WF3 SQL-beständighetsprovidern är en enkel implementering som serialiserar arbetsflödesinstansen och lagrar den i en blob. Därför beror prestanda för den här providern mycket på arbetsflödesinstansens storlek. I WF3 kan instansstorleken öka av många orsaker, vilket beskrivs tidigare i det här dokumentet. Många kunder väljer att inte använda standardprovidern för SQL-beständighet eftersom lagring av en serialiserad instans i en databas inte ger någon insyn i arbetsflödets tillstånd. För att hitta ett visst arbetsflöde utan att känna till arbetsflödes-ID:t måste man deserialisera varje bevarad instans och undersöka innehållet. Många utvecklare föredrar att skriva sina egna beständighetsleverantörer för att övervinna detta hinder.

WF4 SQL-beständighetsprovidern har försökt åtgärda några av dessa problem. Beständighetstabellerna exponerar viss information, till exempel aktiva bokmärken och promotable-egenskaper. Den nya innehållsbaserade korrelationsfunktionen i WF4 skulle inte fungera bra med WF3 SQL persistence-metoden, vilket har lett till en viss förändring i organisationen av den bevarade arbetsflödesinstansen. Detta gör jobbet för beständighetsprovidern mer komplext och lägger extra stress på databasen.

Miljökonfiguration

Environment setup for workflow performance test

Testkonfiguration

Även med en förbättrad funktionsuppsättning och bättre samtidighetshantering är SQL-beständighetsprovidern i WF4 snabbare än providern i WF3. För att visa upp detta jämförs två arbetsflöden som utför i stort sett samma åtgärder i WF3 och WF4 nedan.

Persistence workflow in WF3 on left and WF4 on right

De två arbetsflödena skapas båda av ett mottaget meddelande. När du har skickat ett första svar sparas arbetsflödet. I WF3-fallet används en tom TransactionScopeActivity för att initiera beständigheten. Samma sak kan uppnås i WF3 genom att markera en aktivitet som "spara på nära". Ett andra korrelerat meddelande slutför arbetsflödet. Arbetsflödena sparas men tas inte bort.

Testresultat

Column chart showing throughput persistence

När transporten mellan klienten och mellannivån är HTTP visar beständighet i WF4 en förbättring på 2,6 gånger. TCP-transporten ökar den faktorn till 3,0 gånger. I samtliga fall är processoranvändningen på mellannivån 98 % eller högre. Anledningen till att WF4-dataflödet är större beror på den snabbare arbetsflödeskörningen. Storleken på den serialiserade instansen är låg för båda fallen och är inte ett stort bidragande element i den här situationen.

Både WF3- och WF4-arbetsflödena i det här testet använder en aktivitet för att uttryckligen ange när beständighet ska inträffa. Detta har fördelen att bevara arbetsflödet utan att ta bort det. I WF3 är det också möjligt att bevara med hjälp av TimeToUnload funktionen, men detta tar bort arbetsflödesinstansen från minnet. Om en utvecklare som använder WF3 vill se till att ett arbetsflöde bevaras vid vissa tidpunkter måste de antingen ändra arbetsflödesdefinitionen eller betala kostnaden för att ta bort och läsa in arbetsflödesinstansen igen. En ny funktion i WF4 gör det möjligt att spara utan att ta bort: TimeToPersist. Den här funktionen gör att arbetsflödesinstansen kan sparas på inaktivt men stanna kvar i minnet tills tröskelvärdet uppfylls TimeToUnload eller körningen återupptas.

Observera att WF4 SQL-beständighetsprovidern utför mer arbete på databasnivån. SQL-databasen kan bli en flaskhals så det är viktigt att övervaka cpu- och diskanvändningen där. Se till att inkludera följande prestandaräknare från SQL-databasen när du testar arbetsflödesprogram för prestandatestning:

  • PhysicalDisk\%Disk Read Time

  • PhysicalDisk\% disktid

  • PhysicalDisk\% diskskrivningstid

  • PhysicalDisk\% Genomsnittlig diskkölängd

  • PhysicalDisk\Avg. Diskläs kölängd

  • PhysicalDisk\Genomsnittlig längd på diskskrivningskö

  • PhysicalDisk\Aktuell diskkölängd

  • Processorinformation\% processortid

  • SQLServer:Latches\Average Latch Wait Time (ms)

  • SQLServer:Latches\Latch Waits/s

Spårning

Arbetsflödesspårning kan användas för att spåra förloppet för ett arbetsflöde. Den information som ingår i spårningshändelserna bestäms av en spårningsprofil. Ju mer komplex spårningsprofilen är, desto dyrare blir spårningen.

WF3 levereras med en SQL-baserad spårningstjänst. Den här tjänsten kan fungera i batchbaserade och icke-batchbaserade lägen. I icke-batchbaserat läge skrivs spårningshändelser direkt till databasen. I batchläge samlas spårningshändelser in i samma batch som arbetsflödesinstansens tillstånd. Batchläget har den bästa prestandan för det bredaste utbudet av arbetsflödesdesigner. Batchbearbetning kan dock ha en negativ prestandapåverkan om arbetsflödet kör många aktiviteter utan att spara och dessa aktiviteter spåras. Detta skulle ofta inträffa i loopar och det bästa sättet att undvika det här scenariot är att utforma stora loopar så att de innehåller en beständighetspunkt. Att införa en beständighetspunkt i en loop kan också påverka prestanda negativt, så det är viktigt att mäta kostnaderna för var och en och komma med en balans.

WF4 levereras inte med en SQL-spårningstjänst. Registrering av spårningsinformation till en SQL-databas kan hanteras bättre från en programserver i stället för inbyggt i .NET Framework. Därför hanteras SQL-spårning nu av AppFabric. Den färdiga spårningsprovidern i WF4 baseras på händelsespårning för Windows (ETW).

ETW är ett händelsesystem på kernelnivå med låg latens som är inbyggt i Windows. Den använder en leverantörs-/konsumentmodell som gör det möjligt att endast ådra sig påföljden för händelsespårning när det faktiskt finns en konsument. Förutom kernelhändelser som processor, disk, minne och nätverksanvändning utnyttjar många program även ETW. ETW-händelser är kraftfullare än prestandaräknare eftersom händelser kan anpassas till programmet. En händelse kan innehålla text som ett arbetsflödes-ID eller ett informationsmeddelande. Händelser kategoriseras också med bitmasker så att användning av en viss delmängd av händelser får mindre prestandapåverkan än att samla in alla händelser.

Fördelarna med att använda ETW för spårning i stället för SQL är:

  • Insamling av spårningshändelser kan separeras till en annan process. Detta ger större flexibilitet i hur händelserna registreras.

  • ETW-spårningshändelser kombineras enkelt med WCF ETW-händelser eller andra ETW-leverantörer, till exempel en SQL Server- eller kernelprovider.

  • Arbetsflödesförfattare behöver inte ändra ett arbetsflöde för att fungera bättre med en viss spårningsimplementering, till exempel WF3 SQL-spårningstjänstens batchläge.

  • En administratör kan aktivera eller inaktivera spårning utan att återanvända värdprocessen.

Prestandafördelarna med ETW-spårning har en nackdel. ETW-händelser kan gå förlorade om systemet är under hårt resurstryck. Bearbetningen av händelser är inte avsedd att blockera normal programkörning och därför är det inte garanterat att alla ETW-händelser kommer att sändas till sina prenumeranter. Detta gör ETW-spårning bra för hälsoövervakning men inte lämplig för granskning.

Även om WF4 inte har någon SQL-spårningsprovider gör AppFabric det. AppFabrics SQL-spårningsmetod är att prenumerera på ETW-händelser med en Windows-tjänst som batchar händelserna och skriver dem till en SQL-tabell som är utformad för snabbinfogningar. Ett separat jobb tömmer data från den här tabellen och reformerar dem i rapporteringstabeller som kan visas på AppFabric-instrumentpanelen. Det innebär att en batch med spårningshändelser hanteras oberoende av det arbetsflöde som den kom från och därför inte behöver vänta på en beständighetspunkt innan den registreras.

ETW-händelser kan registreras med verktyg som logman eller xperf. Den kompakta ETL-filen kan visas med ett verktyg som xperfview eller konverteras till ett mer läsbart format, till exempel XML, med tracerpt. I WF3 är det enda alternativet för att hämta spårningshändelser utan en SQL-databas att skapa en anpassad spårningstjänst. Mer information om ETW finns i WCF-tjänster och händelsespårning för Windows - och Händelsespårning – Windows-program.

Aktivering av arbetsflödesspårning påverkar prestanda i varierande grad. Riktmärket nedan använder logman-verktyget för att använda ETW-spårningshändelserna och registrera dem i en ETL-fil. Kostnaden för SQL-spårning i AppFabric finns inte i omfånget för den här artikeln. Den grundläggande spårningsprofilen, som också används i AppFabric, visas i det här riktmärket. Dessutom ingår kostnaden för att endast spåra hälsoövervakningshändelser. Dessa händelser är användbara för att felsöka problem och fastställa systemets genomsnittliga dataflöde.

Miljökonfiguration

Environment setup for workflow performance test

Testresultat

Column chart showing workflow tracking costs

Hälsoövervakning har ungefär 3 % inverkan på dataflödet. Basprofilens kostnad är cirka 8 %.

Interop

WF4 är nästan en fullständig omskrivning av WF och därför är WF3-arbetsflöden och aktiviteter inte direkt kompatibla med WF4. Många kunder som antog Windows Workflow Foundation tidigt kommer att ha interna eller externa arbetsflödesdefinitioner och anpassade aktiviteter för WF3. Ett sätt att underlätta övergången till WF4 är att använda Interop-aktiviteten, som kan köra WF3-aktiviteter inifrån ett WF4-arbetsflöde. Vi rekommenderar att Interop aktiviteten endast används när det behövs. Mer information om hur du migrerar till WF4 finns i WF4-migreringsvägledningen.

Miljökonfiguration

Environment setup for workflow performance test

Testresultat

Följande tabell visar resultatet av att köra ett arbetsflöde som innehåller fem aktiviteter i en sekvens i olika konfigurationer.

Testa Dataflöde (arbetsflöden/s)
WF3-sekvens i WF3-körning 1,576
WF3-sekvens i WF4-körning med Interop 2,745
WF4-sekvens 153,582

Det finns en märkbar prestandaökning för att använda Interop över raka WF3. Men jämfört med WF4-aktiviteter är ökningen försumbar.

Sammanfattning

Stora investeringar i prestanda för WF4 har lönat sig på många viktiga områden. Prestanda för enskilda arbetsflödeskomponenter är i vissa fall hundratals gånger snabbare i WF4 jämfört med WF3 på grund av en smalare WF-körning. Svarstidsnummer är också betydligt bättre. Det innebär att prestandastraffet för att använda WF i stället för att handkoda WCF-orkestreringstjänster är mycket liten med tanke på de extra fördelarna med att använda WF. Beständighetsprestanda har ökat med en faktor på 2,5–3,0. Hälsoövervakning med hjälp av arbetsflödesspårning har nu mycket lite omkostnader. En omfattande uppsättning migreringsguider är tillgängliga för dem som överväger att flytta från WF3 till WF4. Allt detta bör göra WF4 till ett attraktivt alternativ för att skriva komplexa program.