Таймауты WMI в Zabbix Agent (wmi.get): решение проблем мониторинга
Симптомы таймаутов WMI в Zabbix Agent
На сервере Zabbix элементы данных типа wmi.get[...] переходят в состояние Not Supported с ошибкой «Timeout while executing a shell script or WMI query». На стороне опрашиваемого Windows Server процесс WmiPrvSE.exe потребляет много оперативной памяти, а в журнале WMI регистрируется код 0x8004106C (WMI Quota Violation) или Event ID 5612.
| Симптом | Где проявляется | Причина |
|---|---|---|
| Zabbix item: Not Supported (Timeout) | Панель Zabbix | WQL-запрос выполняется дольше установленного в zabbix_agentd.conf таймаута Timeout=3-30 |
| Event ID 5612 WMI-Activity | Журнал WMI-Activity | Провайдер WMI превысил квоту памяти (MemoryPerHost Limit) |
| WmiPrvSE.exe утечка памяти | Диспетчер задач | Слишком частый запуск тяжелых запросов через COM-модель старого Zabbix Agent 1 |
Пошаговое устранение таймаутов WMI в Zabbix
- Увеличьте лимит времени ответа (Timeout) в конфигурации Zabbix Agent: в файле
C:\Program Files\Zabbix Agent\zabbix_agentd.confзадайте максимальный таймаут:Timeout=30 - Увеличьте квоту оперативной памяти для хоста WMI-провайдеров: по умолчанию лимит равен 512 МБ. Увеличьте его до 2048 МБ:
$provider = Get-CimInstance -Namespace "root" -ClassName "__ProviderHostQuotaConfiguration"; Set-CimInstance -InputObject $provider -Property @{MemoryPerHost = 2147483648}; Restart-Service -Name Winmgmt -Force - Оптимизируйте WQL-запросы (избегайте Win32_Product и SELECT *): всегда запрашивайте только конкретные необходимые свойства (например,
SELECT FreeSpace, Size FROM Win32_LogicalDisk WHERE DeviceID='C:'). - Перейдите на Zabbix Agent 2 (написан на Go): агент Zabbix Agent 2 использует постоянные эффективные сессии для WMI и нативных счетчиков Perfmon, предотвращая дедлоки WMI.
Совет: Везде, где это возможно, заменяйте ключи wmi.get на нативные высокопроизводительные счетчики производительности perf_counter[...].
Частые вопросы (FAQ)
Почему ключи perf_counter работают быстрее wmi.get?
Счетчики производительности опрашиваются напрямую из разделяемой памяти ядра Windows, минуя тяжелый транслятор WMI и парсинг WQL-запросов.
Как протестировать WMI-запрос локально на клиенте с помощью zabbix_agentd?
Выполните: zabbix_agentd.exe -t "wmi.get[root\cimv2,SELECT FreeSpace FROM Win32_LogicalDisk WHERE DeviceID='C:']".
Что делать, если WmiPrvSE.exe завис на 100% CPU?
Определите проблемный процесс-клиент по ClientProcessId в журнале Microsoft-Windows-WMI-Activity/Operational (Event ID 5858).
Как перезапустить службу Zabbix Agent через PowerShell?
Выполните команду Restart-Service -Name "Zabbix Agent" -Force.