Get-WinEvent против Get-EventLog
Первое повышение производительности, которое вы можете получить, это использование Get-WinEvent
над Get-EventLog
. Это потому, что Get-WinEvent
заменяет Get-EventLog
, а должен работать лучше .
Правильная фильтрация запроса
Я нашел fantasti c статья Эд Уилсона , в которой подробно рассказывается о том, как можно повысить производительность запроса, подобного тому, который я опубликовал выше. Я выделю настройки производительности, которые я сделал, чтобы значительно улучшить производительность моего сценария.
- Не используйте параметр
-LogName
, а скорее используйте соответствующий -ProviderName
провайдера, который генерирует событие, которое вы ищете (в блоге Эда подробно рассказывается, как это найти). В моем случае мне нужно было использовать провайдера User32
, поскольку именно этот провайдер генерирует интересующее меня событие 1074
. - Избегайте полного обхода данных, если это возможно. Вы заметите, что в моем сценарии есть предложение
Where-Object
. Этот пункт будет перебирать все передаваемые в него события, ища только те, которые имеют 1074
Id. Чтобы избежать этого, Get-WinEvent имеет параметр -FilterHashtable
, который можно использовать для фильтрации результатов запроса в командлете Get-WinEvent
, что повышает эффективность. Как указано в документации Microsoft: "При работе с большими журналами событий неэффективно отправлять объекты по конвейеру команде Where-Object."
Код
Я реализовал вышеупомянутые концепции и рассчитал улучшения для каждого из них, чтобы показать разницу в производительности с помощью командлета Measure-Command
с параметром -Expression
. Обратите внимание, что машина, на которой я тестирую, имеет 23 581 событие в журнале System
.
Baseline
Measure-Command -Expression {
Get-WinEvent -LogName 'System' | Where-Object { $_.Id -eq 1074 }
}
# TotalSeconds : 7.600536
Использование ProviderName
против LogName
Measure-Command -Expression {
Get-WinEvent -ProviderName 'User32' | Where-Object { $_.Id -eq 1074 }
}
# TotalSeconds : 0.1929325
Использование FilterHashtable
Measure-Command -Expression {
Get-WinEvent -FilterHashtable @{ProviderName = "User32"; Id = 1074}
}
# TotalSeconds : 0.1578928