Question pb : runspacepool et wmi connectserver

Plus d'informations
il y a 12 ans 6 mois #15732 par blanc
Bonjour,

Veuillez m'excuser pour mon manque de considération.

J'utilise le script suivant :
mspowershell.blogspot.fr/2013/01/executi...-in-parallel-in.html
J'ai modifié le scriptblock pour l'adapter à mon besoin qui est : lancer un process sur plusieurs milliers de machines XP SP3 distantes en workgroup ( pas de domaine ) en fournissant un compte et un mot de passe différent pour chaque machine.
Je n'ai trouvé que WMI pour faire cela. Du code VBS adapté.
Le runspacepool permet de lancer des \"thread\" ( des vrais ou des faux je ne sais pas ) en parallèle. Si je dois faire les connexions WMI l'une après l'autre il me faut la semaine. Avec mon portable 4Go de ram, je lance des \"net use ip user mdp/copy\" vers 2000 machines en moins de 2 heures avec 200 threads en parallèle en utilisant le script cité.
Tout va bien donc.
Sauf que dans le cas où je remplace les \"net use\" par des connectserver et createprocess de wmi, si je dépasse 20 threads en parallèle, alors le PS se plante.
La partie wmi du scriptblock des threads:
[code:1]$cmd='c:\winnt\system32\cmd.exe /c c:\test.cmd'
$locator = New-Object -ComObject \"WbemScripting.SWbemLocator\"
$oRemoteWmi = $locator.ConnectServer($computer,\"root\cimv2\",$user,$mdp)
$oRemoteClassProcess=$oRemoteWmi.Get(\"Win32_Process\"«»)
$oPS=$oRemoteWmi.Get(\"Win32_ProcessStartup\"«»)
$oMethodeCreate=$oRemoteClassProcess.Methods_|?{$_.name -eq 'create'}
$oInParam=$oMethodeCreate.inParameters.SpawnInstance_()
($oInParam.Properties_ | where {$_.name -eq \"CommandLine\"}).Value = $cmd
($oInParam.Properties_ | where {$_.name -eq \"CurrentDirectory\"}).Value = \"c:\\"
($oInParam.Properties_ | where {$_.name -eq \"ProcessStartupInformation\"}).Value = $oPS
$outParam = $oRemoteClassProcess.ExecMethod_(\"Create\", $oInParam)
#lecture code du pid
$remotePid = ($outParam.Properties_ | ?{$_.name -eq \"ProcessId\"}).Value
Write-Host \"remotePid = $remotePid\"[/code:1]
Ce qui manque à ce bout de code, c'est le passage des paramètres qui ne sert pas au problème. Le \"main\" lit un fichier contenant \"ip,user,mdp\" des machines distantes.

Ma question : avez vous une idée de l'origine du plantage dans le contexte wmi si $trottlelimit du runspacepool est plus grand que 30 pour un ensemble de 2000 machines?
Et pourquoi tout marche bien avec les connexions (\"net use \\ip\c$\" puis copy \\ip\c$\toto.txt c:\toto.txt\" puis \"net use \\ip /d\") avec $trottlelimit = 200 pour un ensemble de 2000 machines?

Au passage pourquoi 200? parce que la charge cpu est importante mais il y encore de la marge sur mon pc pour que je puis travailler.
Attention : si vous faites le test avec beaucoup de machines et avec un routeur sur un réseau \"naté\", selon la configuration de votre routeur, il se peut qu'il ne reste plus de ports pour sortir pour les autres usagers.

Il paraît qu'avec \"foreach -parallele\" de PS V3 je pourrais faire mieux comme administration distante. Mais il me semble que la phase connexion de \"winrm\" est très très lente en comparaison à celle de WMI qui est déjà bien plus longue que celle d'un agent comme \"vnc\" indisponible pour moi.

J'ai éliminé la piste des job car trop lents et trop \"complexes\" à gérer. Voir learn-powershell.net/2012/05/13/using-ba...-better-performance/

Et aujourd'hui, j'ai fait un test rapide, mais sans tout vérifier malheureusement, avec la modification suivante lors de la création du pool :
[code:1]$sessionState = [system.management.automation.runspaces.initialsessionstate]::CreateDefault()
$runspacePool = [runspacefactory]::CreateRunspacePool(1, $throttleLimit, $sessionState, $host)
$runspacePool.ApartmentState = \"STA\"
$runspacePool.Open()[/code:1]
Ca ressemble à une recette de cuisine que j'ai trouvé ici : newsqlblog.com/2012/05/22/concurrency-in...ding-with-runspaces/

Si quelqu'un peut m'en dire plus sur, d'une part le rôle de ce paramètre et, d'autre part sur le lien avec le plantage avec les requêtes WMI connectserver...

Je sais que l'on est à la frontière de la programmation et du scripting avec ce genre de chose comme les runspacepool. Pourtant, c'est spectaculaire de rapidité.
Au fait il y a plein d'autres trucs pour accélérer son script comme dit sur

La présentation dit :

In this webcast, MVP Dr. Tobias Weltner illustrates how you can spawn lightweight threads to execute multiple things at the same time. Unlike background jobs, this technique uses fewer resources and allows threads to communicate with each other, which not only enables you to considerably speed up scripts, but also enables you to open multiple GUI windows and keep them open while other PowerShell threads update the window content.

Comme je ne comprends que la moitié de ce je lis et rien de ce que j'entends, si une âme charitable veut bien me faire un résumé des astuces...ou le déposer sur ce site...

Merci d'avance.
Noël

Ps : toutes mes excuses à ceux qui ont répondu à mes questions précédentes ( en 2012 ) et à qui, en retour, je n'ai pu répondre...

Message édité par: noel, à: 28/08/13 22:40<br><br>Message édité par: noel, à: 28/08/13 22:43

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 6 mois #15771 par Matthew BETTON
Bonjour,

Une mise en page de ton post s'impose, notamment si tu souhaites qu'une personne bienveillante un jour te réponde.

A faire :

Clique sur le lien \&quot;Editer\&quot; pour éditer ton message puis, pour chaque partie de code, surligne la et clique sur le bouton \&quot;Code\&quot;. Enregistre enfin ton message.

Aussi, pour chaque partie qui est un extrait ou une citation, tu peux utiliser le bouton \&quot;Quote\&quot;.

Pour le moment et en ce qui me concerne, j'ai du mal à lire ton message et à aller jusqu'au bout.

@ +

Matthew BETTON<br><br>Message édité par: Matthew BETTON, à: 28/08/13 12:17

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 6 mois #15774 par Laurent Dardenne
Matthew BETTON écrit:

j'ai du mal à lire ton message et à aller jusqu'au bout.

+1<br><br>Message édité par: Laurent Dardenne, à: 29/08/13 16:26

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 6 mois #15784 par blanc
Bonjour,
Aujourd'hui j'ai pu faire le test sur 7800 machines distantes XPSP3. Avec le paramètre STA, j'ai pu copier un script sur ces 7800 machines et le lancer en 5h30 avec trottlelimite = 500. Alors qu'il fallait plus de 14H pour faire la même chose avec trottlelimite = 20.
L'ajout de STA :
[code:1]$sessionState = [system.management.automation.runspaces.initialsessionstate]::CreateDefault()
$runspacePool = [runspacefactory]::CreateRunspacePool(1, $throttleLimit, $sessionState, $host)
$runspacePool.ApartmentState=\&quot;STA\&quot;
$runspacePool.Open()[/code:1]
Je ne peux pas expliquer, simplement constater.

Si vous avez une idée sur le rôle de ce paramètre, voire si vous êtes capables de faire un tutorial sur non pas la mise en oeuvre mais les coulisses de ce monde des runspacepool, ce serait super. C'est vrai que cela ne rejoint pas l'administration normale en domaine avec GPO et que cet \&quot;objet\&quot; reste anecdotique.

J'aurais bien une autre question concernant les tables de hashage synchronisées qui sembleraient servir à échanger des variables entre thread d'un pool et qui rentre dans le cadre de la philosophie des runspace mais une chose à la fois.
[code:1]$sharedData = [HashTable]::«»Synchronized(@{})[/code:1]
Respectueusement.
Noël

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 6 mois #15794 par Laurent Dardenne
Merci pour les balise codes.
Je te réponds, mais sans pouvoir t'aider.
noel écrit:

Le runspacepool permet de lancer des \&quot;thread\&quot; ( des vrais ou des faux je ne sais pas ) en parallèle.

Sous PS on ne parle pas de thread, mais de tâche de fond qui est une implémentation d'exécution de tâche en parallèle.

noel écrit:

Ma question : avez vous une idée de l'origine du plantage dans le contexte wmi si $trottlelimit du runspacepool est plus grand que 30 pour un ensemble
de 2000 machines?

Moi non.
Je n'ai pas le code sous les yeux, ni 2000 machines sous le coude, ni le temps pour tester.
noel écrit:

Si quelqu'un peut m'en dire plus sur, d'une part le rôle de ce paramètre et

\&quot;In simplest terms, the threading apartment model controls the number of threads of execution in any single object at any given time.
In the multithreaded apartment (MTA), multiple threads can be accessing an object at the same time so if the object hasn't been carefully designed,
it could suffer from race conditions. For example, two threads may be trying to update the same property at the same time and it becomes a race to
see whose change takes effect. These race conditions lead to very hard to track down bugs. In the single threaded apartment (STA), t
he system guarantees that only one thread is updating an object at a time making everything much simpler. So why have MTA at all? Because for a lot of
objects, multiple threads in the object may be fine - for example, they may only be reading data but not changing state. This type of concurrent access, in turn, leads to better performance characteristics, especially in this day of multi-core processors.
\&quot;
noel écrit:

, d'autre part sur le lien avec le plantage avec les requêtes WMI
connectserver...

Que donne l'exécution de ton script sans préciser ce paramètre ?
Et si WMI pose pb, supprime son usage.
noel écrit:

Je sais que l'on est à la frontière de la programmation et du scripting

Il s'agit de la même chose, l'un ayant besoin de détailler les choses là où l'autre en est déchargé.
En quoi une boucle C++ est elle différente d'une boucle Powershell ?
Un administrateur n'a pas besoin de connaitre l'usage d'une interface, là où un développeur le doit.
Un autre exemple :
www.codeproject.com/Articles/9190/Unders...hreaded-Apartment-Pa

noel écrit:

Comme je ne comprends que la moitié de ce je lis

Réjouis toi, certains ne comprennent rien à ce qu'ils lisent :-)

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 6 mois #15795 par Laurent Dardenne
Un post à lire sur STA/MTA.
Quant au titre du blog( 'L'armée mexicaine fabrique des usines à gaz'), il y a de forte chance que son auteur ait fait pas mal de TMA, qui est une sorte de dev multicouches :laugh:

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.064 secondes
Propulsé par Kunena