MSSQL Error 17883: Process Worker appears to be non-yielding on Node — Решение
- В Errorlog фиксируется ошибка
Process X:X:X (0x...) Worker 0x... appears to be non-yielding on Node X. Operating system error 0x00000000. - Экземпляр SQL Server перестает отвечать на запросы (SQL Server Freeze), падает throughput базы 1С:Предприятие.
- Автоматически генерируется мини-дамп (SQL Server MiniDump) в каталоге
LOG. - В диспетчере задач загрузка одного или нескольких ядер CPU доходит до 100% в привилегированном режиме ядра (Kernel Time).
1. Анализ планировщиков SQLOS через DMV
-- Проверка зависших планировщиков и времени невыдачи кванта времени (non-yielding)
SELECT
scheduler_id,
cpu_id,
status,
is_online,
current_tasks_count,
active_workers_count,
work_queue_count,
yield_count,
last_timer_activity
FROM sys.dm_os_schedulers
WHERE status = 'VISIBLE ONLINE';2. Идентификация выполняемого запроса через дамп планировщика
-- Поиск активных сессий на зависших воркерах
SELECT
r.session_id,
r.status,
r.command,
r.cpu_time,
r.total_elapsed_time,
t.text AS sql_text,
p.query_plan
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) p
WHERE r.scheduler_id IN (
SELECT scheduler_id FROM sys.dm_os_schedulers WHERE is_idle = 0
);3. Проверка конфликтов спинлоков (Spinlocks)
Часто non-yielding вызывается высокой конкуренцией за Spinlock (например, MUTEX, LOCK_HASH или SOS_CACHESTORE при интенсивной работе временных таблиц 1С):
SELECT TOP 10
name,
collisions,
spins,
spins_per_collision,
sleep_time
FROM sys.dm_os_spinlock_stats
ORDER BY spins DESC;4. Применение обновлений накопительного пакета (CU)
Большинство ошибок non-yielding worker в модулях SOS_Scheduler::YieldDurationTracker являются багами ядра SQL Server и исправляются установкой последних Cumulative Updates (CU).
Частые вопросы (FAQ)
Что означает 'non-yielding worker' в архитектуре SQLOS?
SQL Server использует кооперативную многозадачность внутри SQLOS. Каждый поток (worker) обязан добровольно отдавать квант процессорного времени (yield) каждые несколько миллисекунд. Если воркер выполняет цикл и не отдает квант более 60 секунд, планировщик фиксирует ошибку 17883.
Как этот сбой влияет на кластер 1С:Предприятие?
Все рабочие процессы rphost, обратившиеся к заблокированному планировщику, зависают в ожидании ответа, что приводит к лавинообразному исчерпанию пула соединений и зависанию сеансов всех пользователей 1С.
Могут ли сторонние модули (антивирусы, фильтры резервного копирования) вызывать 17883?
Да, драйверы фильтров файловой системы (antivirus filter drivers, backup drivers), работающие в режиме ядра, могут прерывать работу потоков SQL Server и удерживать управление, блокируя yield.
Где сохраняются дампы памяти при ошибке 17883?
Файлы дампов с расширением .mdmp и сопутствующие текстовые файлы SQLDumpXXXX.log сохраняются в стандартной папке журналов: C:\Program Files\Microsoft SQL Server\MSSQLXX.MSSQLSERVER\MSSQL\Log.