Tengo una secuencia de comandos que ejecutará y hará ping a todos los servidores de una lista que está almacenada en SQL Server. El script funciona bien pero lo hace todo secuencialmente (cojo).Ayuda de subprocesamiento múltiple con Powershell
¿Alguien puede ayudarme a cómo cambiaría esto para usar multiprocesamiento en lugar de un ciclo foreach?
$Server = "ServerName"
$Database = "DatabaseName"
$con = "server=$Server;database=$Database;Integrated Security=sspi"
$cmd = "SELECT ServerName FROM dbo.vwServerListActive"
$da = new-object System.Data.SqlClient.SqlDataAdapter ($cmd, $con)
$dt = new-object System.Data.DataTable
$da.fill($dt) | out-null
foreach ($srv in $dt)
{
$ping = new-object System.Net.NetworkInformation.Ping
$Reply = $ping.send($srv.ServerName)
$ServerName = $srv.ServerName
$ServerName
$Reply.status
if ($Reply.status –eq “Success”)
{
$sql = "UPDATE dbo.ServerList SET GoodPing = 1 WHERE GoodPing <> 1 AND ServerName = '$ServerName'"
}
else
{
$sql = "UPDATE dbo.ServerList SET GoodPing = 0 WHERE GoodPing <> 0 AND ServerName = '$ServerName'"
}
$Reply = ""
invoke-sqlcmd -serverinstance $Server -database $Database -query $sql
}
, entonces lo que está sugiriendo es mantener mi procesamiento bastante bien tal como está y comenzar x número de sesiones de PowerShell (¿dividir mi lista de servidores de manera uniforme en todas las agrupaciones)? Tener un trabajo por separado para cada corrida parece que está agregando una gran cantidad de sobrecarga, así que esta podría ser una mejor solución que va a jugar y le avisaré. :) gracias – ColinStasiuk
Eso es correcto al utilizar el trabajo inicial o, alternativamente, iniciar un proceso de PowerShell genera una sobrecarga para configurar el espacio de ejecución o iniciar el proceso. Debido a esto, generalmente quiere limitar el número de procesos o trabajos en segundo plano. Los tipos de procesos que haré en segundo plano pueden ejecutarse independientemente del proceso principal y tomar más de unos minutos para ejecutarse; de lo contrario, no vale la pena la sobrecarga. También me gustaría sugerir que no se cargue el cmdlet SQL solo para invoke-sqlcmd, esto se suma a la sobrecarga, sino que use la llamada ADO.NET directa como mencioné en la publicación anterior. –
Además, en lugar del enfoque de agrupación, he usado un par de scripts de aproximación de cola en los que configura el número de trabajos o procesos para ejecutar en paralelo, sin necesidad de agruparlos manualmente. Nota: nada de lo que estamos haciendo es un verdadero enhebrado, sino un procesamiento concurente. Descargue mi presentación de PowerShell ETL para obtener las secuencias de comandos: http://sev17.com/2010/06/powershell-etl-presentation/ –