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}}}
}
}
}
}
  • Вопрос задан
  • 214 просмотров
Решения вопроса 1
@azarij
В меру опытный никто
мне никогда не нравились джобы и скрипты, которые постоянно запущены. я правильно понимаю, что скрипт делает своё дело, а потом спит 900 секунд и так по кругу?
если да, то память он сразу выжирает или сразу после запуска все ок, а со временем он жрет больше и больше памяти?
может запускать это дело по расписанию через планировщик задач? запустился, сделал, что надо, выключился.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы