Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Sets Icinga for Windows processes to BelowNormal #756

Merged
merged 1 commit into from
Sep 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions doc/100-General/10-Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ Released closed milestones can be found on [GitHub](https://github.com/Icinga/ic

### Enhancements

* [#756](https://github.com/Icinga/icinga-powershell-framework/pull/756) Adds feature to set process priority for Icinga for Windows to BelowNormal for improved Host performance

## 1.13.0 Beta-1 (2024-08-30)

[Issues and PRs](https://github.com/Icinga/icinga-powershell-framework/milestone/32)
Expand Down
22 changes: 22 additions & 0 deletions jobs/SetProcessPriority.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Load the basic framework data
Use-Icinga -Minimal;

# Wait 10 seconds before procedding
Start-Sleep -Seconds 10;

# Fetch the process information for JEA and the Icinga for Windows PID
$JeaProcess = Get-Process -Id (Get-IcingaJEAServicePid) -ErrorAction SilentlyContinue;
$IfWProcess = Get-Process -Id (Get-IcingaForWindowsServicePid) -ErrorAction SilentlyContinue;

# Set the JEA pid to below normal
if ($null -ne $JeaProcess -And $JeaProcess.ProcessName -eq 'wsmprovhost') {
$JeaProcess.PriorityClass = 'BelowNormal';
}

# Set the Icinga for Windows pid to below normal
if ($null -ne $IfWProcess -And $IfWProcess.ProcessName -eq 'powershell') {
$IfWProcess.PriorityClass = 'BelowNormal';
}

# Exit with okay
exit 0;
11 changes: 11 additions & 0 deletions lib/core/framework/Invoke-IcingaForWindowsMigration.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,18 @@ function Invoke-IcingaForWindowsMigration()
Start-IcingaWindowsScheduledTaskRenewCertificate;
# Ensure the Icinga Agent is not spamming the Application log by default
Write-IcingaAgentEventLogConfig -Severity 'warning';
# Set our newly added process update task
Register-IcingaWindowsScheduledTaskProcessPriority -Force;

Set-IcingaForWindowsMigration -MigrationVersion (New-IcingaVersionObject -Version '1.13.0');
}

if (Test-IcingaForWindowsMigration -MigrationVersion (New-IcingaVersionObject -Version '1.13.0.1')) {
Write-IcingaConsoleNotice 'Applying pending migrations required for Icinga for Windows v1.13.0.1';

# Set our newly added process update task
Register-IcingaWindowsScheduledTaskProcessPriority -Force;

Set-IcingaForWindowsMigration -MigrationVersion (New-IcingaVersionObject -Version '1.13.0.1');
}
}
2 changes: 2 additions & 0 deletions lib/core/windows/Restart-IcingaWindowsService.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ function Restart-IcingaForWindows()
}

Restart-IcingaService -Service 'icingapowershell';
# Update the process priority after each restart
Start-IcingaWindowsScheduledTaskProcessPriority;
}

Set-Alias -Name 'Restart-IcingaWindowsService' -Value 'Restart-IcingaForWindows';
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
function Register-IcingaWindowsScheduledTaskProcessPriority()
{
param (
[switch]$Force = $FALSE
);

[string]$TaskName = 'Set Process Priority';
[string]$TaskPath = '\Icinga\Icinga for Windows\';

$SetProcessPriorityTask = Get-ScheduledTask -TaskName $TaskName -TaskPath $TaskPath -ErrorAction SilentlyContinue;

if ($null -ne $SetProcessPriorityTask -And $Force -eq $FALSE) {
Write-IcingaConsoleWarning -Message 'The {0} task is already present. User -Force to enforce the re-creation' -Objects $TaskName;
return;
}

$ScriptPath = Join-Path -Path (Get-IcingaFrameworkRootPath) -ChildPath '\jobs\SetProcessPriority.ps1';
$TaskAction = New-ScheduledTaskAction -Execute 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' -Argument ([string]::Format("-WindowStyle Hidden -Command &{{ & '{0}' }}", $ScriptPath));
$TaskPrincipal = New-ScheduledTaskPrincipal -UserId 'S-1-5-18' -RunLevel 'Highest' -LogonType ServiceAccount;
$TaskSettings = New-ScheduledTaskSettingsSet -DontStopIfGoingOnBatteries -AllowStartIfOnBatteries -StartWhenAvailable;

Register-ScheduledTask -TaskName $TaskName -TaskPath $TaskPath -Force -Principal $TaskPrincipal -Action $TaskAction -Settings $TaskSettings | Out-Null;

Write-IcingaConsoleNotice -Message 'The task "{0}" has been successfully registered at location "{1}".' -Objects $TaskName, $TaskPath;
}
14 changes: 14 additions & 0 deletions lib/core/wintasks/daemon/Start-TaskSetProcessPriority.psm1
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
function Start-IcingaWindowsScheduledTaskProcessPriority()
{
[string]$TaskName = 'Set Process Priority';
[string]$TaskPath = '\Icinga\Icinga for Windows\';

$SetProcessPriorityTask = Get-ScheduledTask -TaskName $TaskName -TaskPath $TaskPath -ErrorAction SilentlyContinue;

if ($null -eq $SetProcessPriorityTask) {
Write-IcingaConsoleNotice -Message 'The "{0}" task is not present on this system.' -Objects $TaskName;
return;
}

Start-ScheduledTask -TaskName $TaskName -TaskPath $TaskPath;
}