Parallel verwerken met PowerShell
In dit blog ga ik in op parallel verwerken met PowerShell. PowerShell werkt op een traditionele wijze en verwerkt zijn opdrachten 1 voor 1. Wil je bijvoorbeeld weten of er een service op een Windows Server aanwezig is, dan geef je een lijstje met 1 of meerdere servers op en Powershell werkt deze lijst server per server af. Dit is op zich geen probleem als je de actie wilt uitvoeren op tien servers, maar wat nu als het duizenden servers zijn?
Voorbeeld standaard code:
Het is mogelijk om parallel opdrachten uit te voeren. Dit kan op verschillende manieren:
1. PowerShell Jobs;
2. PowerShell Workflows;
3. PowerShell runspaces;
Bij een van onze klanten hebben we de workflow methode geïmplementeerd, voor het verwijderen van een grote hoeveelheid individuele bestanden in de TFS-database, wat een tijdbesparing van enkele dagen opleverde.
PowerShell Jobs
Jobs zijn opdrachten die op de achtergrond uitgevoerd worden. Er kunnen meerdere jobs op een server worden gestart, dus dit geeft ons de mogelijk om een commando parallel te laten draaien.
Voorbeeld code:
Met Get-Job, kunnen de running jobs worden opgevraagd
Zijn de jobs klaar, dan is met het commando Receive-Job -het resultaat op te vragen
Resultaat:
Om de jobs op te schonen, kan Remove-Job worden gebruikt.
PowerShell Workflows
Workflows zijn geïntroduceerd in PowerShell 3.0 en zijn onder de juiste omstandigheden zeer krachtig. Zo kunnen ze onder andere gebruikt worden in scripts waarbij de target machine moet herstarten. Ook krijg je de output rechtstreeks, zodat je geen jobs hoeft uit te lezen. Workflows werken alleen in een 64 bit omgeving.
Voorbeeld code:
Resultaat:
Workflows heeft wat eigenaardigheden. Zo werkt bijvoorbeeld Write-Host “Hello world!” niet, maar “Hello World!” geeft wel output. Ook is het oplossen van code probleempjes binnen de workflow lastiger, omdat de foutmelding onsamenhangend en onlogisch over kunnen komen.
PowerShell Runspaces
De laatste optie is runspaces. Deze manier van parallel uitvoeren gaat meer richting de programmeer kant dan de script kant. Er wordt gebruikt gemaakt van het .Net Framework. Mocht je hier niet in thuis zijn, dan is het handiger om 1 van de eerder genoemde opties te gebruiken.
In dit voorbeeld maken we 5 powershell runspaces aan, halen we de gewenste Windows Service op en geven we deze weer, voordat het runspace weer afgesloten wordt.
Voorbeeld code:
Resultaat:
Conclusie:
Er zijn meerdere manieren om binnen PowerShell meerdere processen parallel naast elkaar te laten draaien. Houd met het aantal parallelle taken rekening met de server capaciteiten, aangezien scripts met complexe functies soms aardig wat geheugen en/of CPU willen gebruiken. Meer weten over het parallel verwerken met PowerShell? Neem gerust contact met mij op.
Peter Barendse
DevOps Engineer