Задать вопрос
tonyslark
@tonyslark
junior system administrator

Как побороть проблемы с производительностью?

Проблема заключается в следующем - написал скрипт на PS для контроля пользовательской активности с СЭД. Суть его состоит в том что ожидаем появление процессов СЭД на клиентской машине, после этого по совету товарища azarij с помощью такой штуки https://wasp.codeplex.com/ отлавливаем активные окна (процессы) и предпринимаем, скажем так, определенные действия исходя из некоторых условий) Проблема в том что скрипт "много кушает" - до 250мб ОП и до 90!!! CPU на ХРюше (1 ядро 2Ггц 1024МБ ОЗУ) и до 700!!!(wtf?)Мб ОП и до 50 CPU на моей 10ке (4 ядра 8Гб ОЗУ). Это все конечно же с пиковой нагрузкой. Вопрос собственной в том как можно это побороть (оптимизировать).
Прошу за код сильно не ругать - с PSом познокомился 2 месяца назад, а кодил в последний раз года 3 назад)
Основные функции:

function Directumchk {
Write-log "Waiting for Directum processes" -type Default
for ($i = 0; (-not (ps | ? { $_.ProcessName -eq $SBRte })) -or (-not (ps | ? { $_.ProcessName -eq $SBLogon })) ; $i++)
{
sleep 3
}
do {
sleep 1
$SBRtehandle = (ps ($SBRte)).mainwindowhandle
}
until ($SBRtehandle -ne 0)
$global:SBRteID = (ps ($SBRte)).ID
Write-log "Directum processes will be found" -type "Complete"
ActWinStr
}

function ActWinStr {
Write-log "Check user activity" -type Default
for (;;){
$Answer = $null
if (-not(ps|?{$_.ProcessName -eq $SBRte})){
if (gjb|?{$_.Name -eq "STimer"}){Remove-Job -Name STimer -Force}
Write-log "Directum closed by user" -type "Complete"
Directumchk}
else{
if (([PInvoke.Win32.UserInput]::IdleTime).Minutes -ge $CountTime){
if (gjb|?{$_.Name -eq "STimer"}){Remove-Job -Name STimer -Force}
Write-log "Idle time left" -type "Warning"
$Answer = GUITimer
UserChoice -Answer $Answer
}
else{
$Act = Select-Window -ActiveWindow
if ($Act.ProcessName -eq $SBRte){
if (gjb|?{$_.Name -eq "STimer"}){Remove-Job -Name STimer -Force}
}
else{
$ParentID = gwmi win32_process | ? -FilterScript {$_.ProcessId -eq $Act.ProcessID} | % {$_.parentprocessid}
if ($ParentID -ne $global:SBRteID){
if (gjb|?{$_.Name -eq "STimer"}){
if ($Timer.state -eq "Completed"){
Remove-Job -Name STimer -Force
Write-log "User don't work in Directum" -type "Warning"
$Answer = GUITimer
UserChoice -Answer $Answer
}
}
else{$Timer = Start-Job -Name STimer -ScriptBlock {for ($x = 900;$x -gt 0;$x--){sleep 1}}}
}
else {if (gjb|?{$_.Name -eq "STimer"}){Remove-Job -Name STimer -Force}}}
}
}
}
}
  • Вопрос задан
  • 216 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@azarij
В меру опытный никто
мне никогда не нравились джобы и скрипты, которые постоянно запущены. я правильно понимаю, что скрипт делает своё дело, а потом спит 900 секунд и так по кругу?
если да, то память он сразу выжирает или сразу после запуска все ок, а со временем он жрет больше и больше памяти?
может запускать это дело по расписанию через планировщик задач? запустился, сделал, что надо, выключился.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы