آموزش جامع sys.dm_os_schedulers در SQL Server | آموزش و مثال‌های عملی

آموزش جامع sys.dm_os_schedulers در SQL Server

توسط admin | گروه SQL Server | 1405/04/31

نظرات 0

آموزش جامع sys.dm_os_schedulers در SQL Server

مقدمه و جایگاه این DMV

sys.dm_os_schedulers یکی از DMVهای لایه SQL Server Operating System یا SQLOS است. برای هر Scheduler یک ردیف ارائه می‌کند و صف Runnable، Workerها، I/O معلق و بار ادراک‌شده SQLOS را نشان می‌دهد. این نما برای تشخیص مبتنی بر شواهد طراحی شده و خروجی آن نباید به‌صورت جدا از بار کاری، زمان نمونه‌برداری و وضعیت سیستم‌عامل تفسیر شود.

در معماری اجرا، Request می‌تواند یک یا چند Task بسازد، Task به Worker متصل شود و Worker روی Scheduler و Thread اجرا گردد. جایگاه دقیق sys.dm_os_schedulers در این زنجیره تعیین می‌کند هر ستون چه چیزی را اندازه می‌گیرد و کدام نتیجه‌گیری از آن معتبر است.

DMVها معمولاً Snapshot جاری یا شمارنده تجمعی از زمان شروع سرویس هستند. بنابراین بهترین روش این است که زمان UTC، زمان شروع SQL Server و چند نمونه با فاصله ثابت جمع‌آوری شود. مقایسه Delta و هم‌بستگی با Waitها و Queryهای فعال از آستانه‌گذاری کورکورانه قابل‌اعتمادتر است.

بازگشت به راهنمای جامع DMVهای CPU و Scheduler در SQL Server

تعریف، Syntax و نوع خروجی

برای هر Scheduler یک ردیف ارائه می‌کند و صف Runnable، Workerها، I/O معلق و بار ادراک‌شده SQLOS را نشان می‌دهد.

این DMV نمای صف‌بندی در سطح Scheduler است؛ sys.dm_os_tasks واحدهای کار و sys.dm_os_workers مجریان آن واحدها را نشان می‌دهند.

Syntax پایه

SELECT *
FROM sys.dm_os_schedulers;

پارامترها

sys.dm_os_schedulers تابع پارامتردار نیست و بدون آرگومان در بخش FROM استفاده می‌شود. محدودسازی باید با انتخاب ستون‌ها، WHERE، TOP و در صورت نیاز پیوند به DMVهای دیگر انجام شود.

نوع خروجی

خروجی یک مجموعه ردیف Read-only است. تعداد ردیف‌ها و مقادیر با وضعیت لحظه‌ای Instance تغییر می‌کند؛ آدرس‌های حافظه و Tickها فقط در عمر جاری سرویس معنا دارند و شناسه کسب‌وکاری دائمی نیستند.

ستون‌های کلیدی

ستونمعنی و کاربرد
scheduler_idشناسه Scheduler؛ Schedulerهای معمولی درخواست کاربر شناسه‌ای کمتر از 1048576 دارند.
statusوضعیت VISIBLE، HIDDEN، ONLINE یا OFFLINE و Scheduler ویژه DAC.
runnable_tasks_countتعداد Workerهای دارای Task که در صف Runnable منتظر CPU هستند.
work_queue_countتعداد Taskهای منتظر تخصیص Worker.
active_workers_countWorkerهای فعال دارای Task در وضعیت اجرای Non-preemptive.
pending_disk_io_countI/Oهای ثبت‌شده و تکمیل‌نشده در Scheduler.
total_cpu_usage_msمصرف تجمعی CPU Scheduler از SQL Server 2016 به بعد.

روش تفسیر حرفه‌ای خروجی

ابتدا سؤال عملیاتی را دقیق تعریف کنید: آیا هدف تشخیص فشار CPU، کمبود Worker، انتظار I/O، توپولوژی NUMA، حافظه یا Inventory است؟ سپس فقط ستون‌هایی را انتخاب کنید که همان فرضیه را می‌سنجند. جمع‌آوری داده بدون سؤال مشخص، حجم زیاد و نتیجه مبهم تولید می‌کند.

در تحلیل sys.dm_os_schedulers باید مقدارهای حالت، شمارنده تجمعی و شناسه‌های پیوند از هم جدا شوند. State وضعیت همان لحظه است؛ Counter معمولاً برای Delta مناسب است؛ Address و ID مسیر اتصال به لایه مکمل را فراهم می‌کنند. ترکیب این سه نوع داده تصویر قابل دفاع‌تری می‌سازد.

Baseline باید ساعت اوج، ساعت عادی و دوره نگهداری را پوشش دهد. آستانه‌ای که در یک سرور هشت‌هسته‌ای هشدار است ممکن است در سرور دیگر طبیعی باشد. روند چند Snapshot و اثر روی SLA مهم‌تر از یک عدد عمومی در اینترنت است.

اصل تشخیصی: DMV علت قطعی را اعلام نمی‌کند؛ DMV شواهدی تولید می‌کند که باید با زمان، بار کاری و منابع مکمل هم‌بسته شود.

مثال‌های عملی و قابل اجرا

مثال 1: فهرست Schedulerهای قابل مشاهده و آنلاین

در نخستین بررسی باید Schedulerهای مربوط به درخواست‌های عادی کاربر از Schedulerهای مخفی جدا شوند. این کوئری فقط ردیف‌های VISIBLE ONLINE را برمی‌گرداند و وضعیت صف اجرا، Workerهای فعال و کارهای منتظر Worker را در همان لحظه نشان می‌دهد.

SELECT scheduler_id, cpu_id, parent_node_id, status,
       runnable_tasks_count, active_workers_count, work_queue_count
FROM sys.dm_os_schedulers
WHERE status = N'VISIBLE ONLINE'
ORDER BY scheduler_id;
خروجی نمونهمقدار نمایشیبرداشت سریع
مثال 1Scheduler 2؛ runnable=0؛ work queue=0در نمونه، Scheduler دوم صف CPU یا کمبود Worker ندارد. عدد صفر در یک Snapshot کافی نیست؛ همین خروجی باید در چند نوبت و هنگام کندی واقعی جمع‌آوری شود.

در نمونه، Scheduler دوم صف CPU یا کمبود Worker ندارد. عدد صفر در یک Snapshot کافی نیست؛ همین خروجی باید در چند نوبت و هنگام کندی واقعی جمع‌آوری شود.

مثال 2: شناسایی فشار پایدار CPU

وقتی runnable_tasks_count در چند نمونه متوالی بزرگ‌تر از صفر باشد، Workerهایی آماده اجرا هستند اما نوبت CPU نگرفته‌اند. فیلتر زیر Schedulerهای دارای صف Runnable را مشخص می‌کند تا بررسی پلن‌های پرمصرف و انتظارهای مرتبط هدفمند شود.

SELECT scheduler_id, cpu_id, runnable_tasks_count,
       current_tasks_count, total_cpu_usage_ms
FROM sys.dm_os_schedulers
WHERE status = N'VISIBLE ONLINE'
  AND runnable_tasks_count > 0
ORDER BY runnable_tasks_count DESC;
خروجی نمونهمقدار نمایشیبرداشت سریع
مثال 2Scheduler 5؛ runnable=4؛ current tasks=19وجود چهار کار Runnable یک علامت لحظه‌ای است، نه حکم قطعی کمبود CPU. اگر مقدار در نمونه‌های پیاپی حفظ شود و مصرف CPU سیستم نیز بالا باشد، فرضیه فشار پردازنده تقویت می‌شود.

وجود چهار کار Runnable یک علامت لحظه‌ای است، نه حکم قطعی کمبود CPU. اگر مقدار در نمونه‌های پیاپی حفظ شود و مصرف CPU سیستم نیز بالا باشد، فرضیه فشار پردازنده تقویت می‌شود.

مثال 3: تشخیص انتظار برای Worker

work_queue_count تعداد Taskهایی را نشان می‌دهد که هنوز Worker دریافت نکرده‌اند. این وضعیت با صف Runnable فرق دارد و می‌تواند به اشباع Worker Pool، کوئری‌های موازی فراوان یا Block شدن طولانی تعداد زیادی Session مربوط باشد.

SELECT scheduler_id, current_workers_count,
       active_workers_count, work_queue_count
FROM sys.dm_os_schedulers
WHERE status = N'VISIBLE ONLINE'
  AND work_queue_count > 0
ORDER BY work_queue_count DESC;
خروجی نمونهمقدار نمایشیبرداشت سریع
مثال 3Scheduler 1؛ workers=512؛ work queue=7در نتیجه فرضی، هفت Task هنوز Worker ندارند. باید هم‌زمان درخواست‌ها، Parallelism و انتظار THREADPOOL بررسی شود؛ افزایش کورکورانه max worker threads معمولاً نخستین راه‌حل مناسبی نیست.

در نتیجه فرضی، هفت Task هنوز Worker ندارند. باید هم‌زمان درخواست‌ها، Parallelism و انتظار THREADPOOL بررسی شود؛ افزایش کورکورانه max worker threads معمولاً نخستین راه‌حل مناسبی نیست.

مثال 4: مقایسه بار میان NUMA Nodeها

توزیع نامتوازن کار میان Nodeها ممکن است از Affinity، Soft-NUMA یا الگوی اتصال ناشی شود. تجمیع Schedulerهای آنلاین بر اساس parent_node_id تصویری سریع از صف Runnable و Workerهای فعال هر Node ارائه می‌کند.

SELECT parent_node_id,
       SUM(runnable_tasks_count) AS runnable_tasks,
       SUM(active_workers_count) AS active_workers,
       SUM(work_queue_count) AS queued_work
FROM sys.dm_os_schedulers
WHERE status = N'VISIBLE ONLINE'
GROUP BY parent_node_id
ORDER BY parent_node_id;
خروجی نمونهمقدار نمایشیبرداشت سریع
مثال 4Node 0؛ runnable=1، Node 1؛ runnable=9اختلاف بزرگ و پایدار میان Nodeها ارزش بررسی دارد. یک اختلاف کوتاه طبیعی است، اما تداوم آن همراه با Affinity نامناسب یا تعداد اتصال نامتوازن می‌تواند ظرفیت CPU را هدر دهد.

اختلاف بزرگ و پایدار میان Nodeها ارزش بررسی دارد. یک اختلاف کوتاه طبیعی است، اما تداوم آن همراه با Affinity نامناسب یا تعداد اتصال نامتوازن می‌تواند ظرفیت CPU را هدر دهد.

مثال 5: مرور I/Oهای معلق هر Scheduler

pending_disk_io_count شمار درخواست‌های I/O ثبت‌شده در Scheduler است که هنوز تکمیل نشده‌اند. این شمارنده وضعیت خود I/O را توضیح نمی‌دهد، اما برای یافتن Schedulerهایی که هم‌زمان با کندی ذخیره‌ساز فعالیت بیشتری دارند مفید است.

SELECT scheduler_id, pending_disk_io_count,
       runnable_tasks_count, current_tasks_count
FROM sys.dm_os_schedulers
WHERE status = N'VISIBLE ONLINE'
ORDER BY pending_disk_io_count DESC;
خروجی نمونهمقدار نمایشیبرداشت سریع
مثال 5Scheduler 7؛ pending I/O=12عدد بالا باید با sys.dm_io_pending_io_requests، آمار فایل و Latency ذخیره‌ساز تطبیق داده شود. از pending_disk_io_count به‌تنهایی نمی‌توان نوع یا علت کندی I/O را نتیجه گرفت.

عدد بالا باید با sys.dm_io_pending_io_requests، آمار فایل و Latency ذخیره‌ساز تطبیق داده شود. از pending_disk_io_count به‌تنهایی نمی‌توان نوع یا علت کندی I/O را نتیجه گرفت.

مثال 6: کنترل شکست ساخت Worker

ستون failed_to_create_worker در شرایطی مانند فشار حافظه می‌تواند مقدار یک بگیرد. کوئری زیر علاوه بر این پرچم، Workerهای جاری و حد ایده‌آل را نمایش می‌دهد تا کمبود منابع از صف معمول CPU جدا شود.

SELECT scheduler_id, failed_to_create_worker,
       current_workers_count, ideal_workers_limit
FROM sys.dm_os_schedulers
WHERE status = N'VISIBLE ONLINE'
  AND (failed_to_create_worker = 1
       OR current_workers_count > ideal_workers_limit);
خروجی نمونهمقدار نمایشیبرداشت سریع
مثال 6هیچ ردیفی بازگردانده نشدخروجی خالی نتیجه مطلوب است. ideal_workers_limit در نسخه‌های جدیدتر ارائه می‌شود و ستون‌های اطلاعاتی یا نسخه‌محور باید پیش از استفاده در اسکریپت‌های چندنسخه‌ای کنترل شوند.

خروجی خالی نتیجه مطلوب است. ideal_workers_limit در نسخه‌های جدیدتر ارائه می‌شود و ستون‌های اطلاعاتی یا نسخه‌محور باید پیش از استفاده در اسکریپت‌های چندنسخه‌ای کنترل شوند.

مثال 7: پیوند Scheduler با Taskهای فعال

برای عبور از شمارنده کلی به Task مشخص می‌توان scheduler_id را با sys.dm_os_tasks پیوند داد. این نمونه فقط Sessionهای کاربری را نگه می‌دارد و تعداد Taskهای RUNNABLE یا SUSPENDED هر Scheduler را گزارش می‌کند.

SELECT s.scheduler_id, t.task_state, COUNT_BIG(*) AS task_count
FROM sys.dm_os_schedulers AS s
JOIN sys.dm_os_tasks AS t
  ON t.scheduler_id = s.scheduler_id
WHERE s.status = N'VISIBLE ONLINE'
  AND t.session_id > 50
GROUP BY s.scheduler_id, t.task_state
ORDER BY s.scheduler_id, t.task_state;
خروجی نمونهمقدار نمایشیبرداشت سریع
مثال 7Scheduler 3؛ RUNNABLE=3، SUSPENDED=8پیوند نشان می‌دهد فشار مشاهده‌شده از چه وضعیت Taskی می‌آید. برای رسیدن به متن SQL، session_id و request_id را با DMVهای اجرایی تکمیل کنید و دسترسی به داده دیگر Sessionها را در نظر بگیرید.

پیوند نشان می‌دهد فشار مشاهده‌شده از چه وضعیت Taskی می‌آید. برای رسیدن به متن SQL، session_id و request_id را با DMVهای اجرایی تکمیل کنید و دسترسی به داده دیگر Sessionها را در نظر بگیرید.

مثال 8: محاسبه سهم مصرف CPU Schedulerها

total_cpu_usage_ms شمارنده تجمعی مصرف CPU Workerهای Non-preemptive است. تبدیل مقدار هر Scheduler به درصدی از مجموع، Schedulerهای داغ را آشکار می‌کند؛ این درصد از زمان شروع سرویس تا لحظه نمونه‌برداری محاسبه می‌شود.

WITH s AS
(
    SELECT scheduler_id, total_cpu_usage_ms,
           SUM(total_cpu_usage_ms) OVER () AS all_cpu_ms
    FROM sys.dm_os_schedulers
    WHERE status = N'VISIBLE ONLINE'
)
SELECT scheduler_id, total_cpu_usage_ms,
       CAST(100.0 * total_cpu_usage_ms / NULLIF(all_cpu_ms, 0)
            AS decimal(6,2)) AS cpu_share_pct
FROM s
ORDER BY cpu_share_pct DESC;
خروجی نمونهمقدار نمایشیبرداشت سریع
مثال 8Scheduler 4؛ سهم تجمعی CPU برابر 18.42٪این سهم تجمعی لزوماً بار جاری را نشان نمی‌دهد. برای تحلیل بازه‌ای، دو Snapshot بگیرید و Delta شمارنده را محاسبه کنید تا فعالیت جدید از تاریخچه سرویس جدا شود.

این سهم تجمعی لزوماً بار جاری را نشان نمی‌دهد. برای تحلیل بازه‌ای، دو Snapshot بگیرید و Delta شمارنده را محاسبه کنید تا فعالیت جدید از تاریخچه سرویس جدا شود.

مثال 9: اندازه‌گیری Delta در یک بازه کوتاه

یک Snapshot قبل و بعد از فاصله یک‌ثانیه‌ای، تغییر yield_count و total_cpu_usage_ms را نشان می‌دهد. این روش به‌جای تفسیر مقدار تجمعی، فعالیت همان بازه را بررسی می‌کند و برای ساخت Collector نیز الگوی مناسبی است.

SELECT scheduler_id, yield_count, total_cpu_usage_ms
INTO #scheduler_before
FROM sys.dm_os_schedulers
WHERE status = N'VISIBLE ONLINE';

WAITFOR DELAY '00:00:01';

SELECT s.scheduler_id,
       s.yield_count - b.yield_count AS yield_delta,
       s.total_cpu_usage_ms - b.total_cpu_usage_ms AS cpu_ms_delta
FROM sys.dm_os_schedulers AS s
JOIN #scheduler_before AS b
  ON b.scheduler_id = s.scheduler_id
ORDER BY cpu_ms_delta DESC;

DROP TABLE #scheduler_before;
خروجی نمونهمقدار نمایشیبرداشت سریع
مثال 9Scheduler 0؛ cpu delta=312ms؛ yield delta=84فاصله یک ثانیه برای آموزش است. در مانیتورینگ واقعی، Interval ثابت و Timestamp ثبت کنید و اثر خود Collector را با انتخاب ستون‌های محدود و تناوب منطقی کاهش دهید.

فاصله یک ثانیه برای آموزش است. در مانیتورینگ واقعی، Interval ثابت و Timestamp ثبت کنید و اثر خود Collector را با انتخاب ستون‌های محدود و تناوب منطقی کاهش دهید.

مثال 10: اصلاح روش پرهزینه SELECT ستاره

برداشت همه ستون‌ها در نمونه‌برداری پرتکرار حجم ذخیره‌سازی و وابستگی به تغییرات نسخه را زیاد می‌کند. نمونه اصلاح‌شده فقط ستون‌های لازم برای تشخیص فشار CPU و Worker را انتخاب می‌کند و Schedulerهای داخلی را کنار می‌گذارد.

-- روش نامناسب برای Collector دائمی:
-- SELECT * FROM sys.dm_os_schedulers;

-- نسخه کنترل‌شده و کم‌حجم:
SELECT scheduler_id, parent_node_id,
       runnable_tasks_count, work_queue_count,
       active_workers_count
FROM sys.dm_os_schedulers
WHERE status = N'VISIBLE ONLINE';
خروجی نمونهمقدار نمایشیبرداشت سریع
مثال 10به‌جای ده‌ها ستون، پنج شاخص هدفمند ذخیره می‌شودبهینه‌سازی اینجا به معنای Index روی DMV نیست؛ DMV قابل ایندکس‌گذاری توسط کاربر نیست. کاهش ستون، نرخ نمونه‌برداری مناسب و نگهداری تاریخچه در جدول جداگانه روش صحیح است.

بهینه‌سازی اینجا به معنای Index روی DMV نیست؛ DMV قابل ایندکس‌گذاری توسط کاربر نیست. کاهش ستون، نرخ نمونه‌برداری مناسب و نگهداری تاریخچه در جدول جداگانه روش صحیح است.

خطاهای رایج و راه اصلاح

نخستین خطا اجرای SELECT ستاره در Job پرتکرار است. این روش ستون‌های غیرضروری، داده داخلی و وابستگی نسخه‌ای را وارد تاریخچه می‌کند. Query هدفمند با ستون‌های محدود هم سبک‌تر است و هم گزارش بعدی را قابل نگهداری می‌کند.

خطای دوم تبدیل یک Snapshot به حکم قطعی است. صف Runnable یا پرچم فشار ممکن است گذرا باشد؛ از طرف دیگر مقدار صفر لحظه‌ای مشکل گذشته را رد نمی‌کند. نمونه‌برداری زمان‌دار و Alert رخدادمحور این شکاف را جبران می‌کند.

خطای سوم جمع‌زدن داده پس از Join یک‌به‌چند بدون توجه به تکرار است. Request موازی، چند Task یا چند Worker می‌تواند عدد CPU و Duration را چندبار تکرار کند. سطح Grain هر DMV و کلیدهای Join باید پیش از Aggregate نوشته شود.

خطای چهارم اجرای اسکریپت نسخه جدید روی نسخه قدیمی بدون کنترل ستون است. مجوزها، Platform و ستون‌های اطلاعاتی تغییر می‌کنند. اسکریپت سازمانی باید نسخه، EngineEdition و دسترسی لازم را ثبت و خطای واضح تولید کند.

ملاحظات Performance و امنیت

خواندن موردی sys.dm_os_schedulers با ستون‌های محدود معمولاً سبک است، اما هزینه به نرخ اجرا، تعداد ردیف، Joinها، مرتب‌سازی و تبدیل XML بستگی دارد. Collector ثانیه‌ای تنها وقتی توجیه دارد که داده همان تفکیک زمانی واقعاً برای تشخیص استفاده شود.

برای SQL Server و SQL Managed Instance معمولاً مجوزهای مشاهده وضعیت سرور مطرح هستند. در SQL Server 2022 و نسخه‌های جدیدتر، بسیاری از این نماها VIEW SERVER PERFORMANCE STATE می‌خواهند. اصل حداقل دسترسی و حفاظت از متن Query یا نام سرور باید رعایت شود.

تاریخچه را در پایگاه مانیتورینگ جداگانه، با Timestamp UTC، شناسه Instance و Retention مشخص نگه دارید. Index تاریخچه باید براساس Query گزارش ساخته شود؛ افزودن Index به خود DMV ممکن نیست و تلاش برای Hint یا تغییر داخلی روش درستی نیست.

  • ستون‌های لازم را صریح نام ببرید.
  • فیلتر را تا حد ممکن زود اعمال کنید.
  • برای شمارنده تجمعی Delta بسازید.
  • Uptime و Restart را ثبت کنید.
  • در Incident شواهد مکمل را هم‌زمان بگیرید.
  • روی Production از Query آزمایش‌نشده و XML سنگین دوری کنید.

بهترین روش‌ها و کاربرد سازمانی

sys.dm_os_schedulers زمانی بیشترین ارزش را دارد که در Runbook مشخص جای بگیرد: Trigger چه چیزی است، Query چه زمانی اجرا می‌شود، چه ستون‌هایی ثبت می‌شوند و مسئول تفسیر کیست. این نظم داده خام را به تصمیم عملیاتی تبدیل می‌کند.

برای آموزش تیم، نتیجه نمونه را کنار Query نگه دارید تا کارشناسان بدون اجرای Production معنای ستون‌ها را بفهمند. سپس در محیط آزمایش بار مصنوعی ایجاد و انتظار می‌رود کدام شاخص تغییر کند. این تمرین رابطه علت و علامت را روشن می‌کند.

در پروژه مشاوره یا بهینه‌سازی، Snapshot باید با Query Store، Wait Statistics، Extended Events، Performance Counter و شاخص‌های سیستم‌عامل هم‌بسته شود. هیچ ابزار واحدی همه لایه‌ها را پوشش نمی‌دهد.

  1. فرضیه و بازه زمانی را مشخص کنید.
  2. نسخه و مجوز را کنترل کنید.
  3. Query کم‌حجم را در آزمایش اجرا کنید.
  4. Timestamp و Uptime را ذخیره کنید.
  5. حداقل دو Snapshot قابل مقایسه بگیرید.
  6. داده را با DMV مکمل Join کنید.
  7. تکرار یک‌به‌چند را کنترل کنید.
  8. نتیجه را با SLA و تجربه کاربر مرتبط کنید.

سؤالات متداول

sys.dm_os_schedulers دقیقاً چه چیزی را نشان می‌دهد؟

sys.dm_os_schedulers برای هر Scheduler یک ردیف ارائه می‌کند و صف Runnable، Workerها، I/O معلق و بار ادراک‌شده SQLOS را نشان می‌دهد. خروجی یک Snapshot زنده است و برای نتیجه‌گیری باید با زمان Capture، Uptime و DMVهای مکمل تفسیر شود.

چطور نخستین گزارش آموزشی از sys.dm_os_schedulers بسازیم؟

از انتخاب ستون‌های کلیدی، فیلتر Session یا وضعیت مرتبط و ثبت Timestamp UTC شروع کنید. سپس نتیجه نمونه را با Baseline محیط سالم مقایسه کنید و معنی هر ستون را پیش از تعریف Alert مستند سازید.

آیا داده sys.dm_os_schedulers برای تصمیم خرید CPU یا حافظه کافی است؟

خیر. تصمیم تجاری خرید سخت‌افزار به روند بلندمدت، SLA، رشد بار، Waitها و داده سیستم‌عامل نیاز دارد. این DMV یکی از شواهد است و مشاوره ظرفیت‌سنجی می‌تواند از هزینه خرید اشتباه جلوگیری کند.

چگونه پایش sys.dm_os_schedulers هزینه عملیاتی را کاهش می‌دهد؟

Collector کم‌حجم می‌تواند نشانه‌های فشار را پیش از Incident ثبت کند و زمان عیب‌یابی را کاهش دهد. ارزش اقتصادی زمانی ایجاد می‌شود که داده با Runbook، Alert قابل اقدام و مسئول مشخص همراه باشد.

تفاوت sys.dm_os_schedulers با DMV مکمل آن چیست؟

این DMV نمای صف‌بندی در سطح Scheduler است؛ sys.dm_os_tasks واحدهای کار و sys.dm_os_workers مجریان آن واحدها را نشان می‌دهند. ترکیب لایه‌ها مانع می‌شود یک شمارنده منفرد به علت قطعی تبدیل شود.

چه زمانی برای تحلیل sys.dm_os_schedulers از خدمات تخصصی استفاده کنیم؟

وقتی مشکل گذرا، چندلایه یا Production است و تیم نمی‌تواند Snapshot را دوباره تولید کند، طراحی Session جمع‌آوری شواهد و تحلیل حرفه‌ای مفید است. آموزش هدفمند نیز به تیم کمک می‌کند Queryها را ایمن و تکرارپذیر اجرا کند.

رایج‌ترین خطا هنگام خواندن sys.dm_os_schedulers چیست؟

رایج‌ترین خطا تفسیر مقدار لحظه‌ای یا تجمعی بدون Baseline و بدون توجه به Restart است. خطای دیگر استفاده از SELECT ستاره در Collector پرتکرار و فرض ثبات همه ستون‌های داخلی در نسخه‌های مختلف است.

اجرای sys.dm_os_schedulers چه اثر Performance دارد؟

یک SELECT محدود و موردی معمولاً سبک است، اما Polling بسیار پرتکرار، پردازش XML یا ذخیره همه ستون‌ها هزینه ایجاد می‌کند. ستون‌های لازم، TOP، فیلتر زودهنگام و تناوب متناسب با هدف را انتخاب کنید.

Best Practice ذخیره تاریخچه sys.dm_os_schedulers چیست؟

Timestamp UTC، sqlserver_start_time، شناسه Instance و فقط شاخص‌های لازم را ذخیره کنید. جدول تاریخچه باید Retention، Index متناسب با Query گزارش و جداسازی دسترسی امنیتی داشته باشد.

sys.dm_os_schedulers در کدام نسخه‌های SQL Server قابل استفاده است؟

این DMV در نسخه‌های پشتیبان SQL Server ارائه می‌شود، اما ستون‌ها و مجوزها می‌توانند با نسخه و Platform فرق کنند. در SQL Server 2022 و جدیدتر برای بسیاری از DMVهای Performance مجوز VIEW SERVER PERFORMANCE STATE لازم است؛ اسکریپت چندنسخه‌ای باید این تفاوت را کنترل کند.

سؤالات مصاحبه SQL Server

چرا یک Snapshot از sys.dm_os_schedulers برای تشخیص قطعی کافی نیست؟

زیرا State می‌تواند گذرا و Counter تجمعی باشد. پاسخ حرفه‌ای باید به Baseline، Delta، Uptime و هم‌بستگی با شواهد مکمل اشاره کند.

تفاوت Task، Worker، Scheduler و Thread چیست؟

Task واحد کار، Worker مجری SQLOS، Scheduler هماهنگ‌کننده اجرای Cooperative و Thread موجودی سیستم‌عامل است. یک Request موازی می‌تواند چند Task و Worker داشته باشد.

چرا Timestamp UTC و زمان شروع سرویس ثبت می‌شوند؟

UTC مقایسه بین سرورها را پایدار می‌کند و زمان شروع سرویس Reset شمارنده‌های تجمعی را آشکار می‌سازد.

چگونه هزینه Collector را کاهش می‌دهید؟

ستون‌های محدود، Filter زودهنگام، Interval متناسب، حذف Sort غیرضروری و Retention روشن انتخاب می‌شوند. Query در بار مشابه Production آزمایش می‌شود.

مجوز مناسب در SQL Server 2022 چیست؟

برای بسیاری از DMVهای Performance مجوز VIEW SERVER PERFORMANCE STATE لازم است. پاسخ دقیق باید نسخه، Platform و اصل حداقل دسترسی را نیز در نظر بگیرد.

چک‌لیست نهایی

  • هدف Query مربوط به sys.dm_os_schedulers روشن است.
  • نسخه و وجود ستون‌های استفاده‌شده بررسی شده است.
  • مجوز با اصل حداقل دسترسی واگذار شده است.
  • SELECT ستاره در Collector استفاده نشده است.
  • Timestamp UTC و Uptime ثبت می‌شوند.
  • مقدار تجمعی با Delta تحلیل می‌شود.
  • Snapshot منفرد به علت قطعی تبدیل نمی‌شود.
  • Join یک‌به‌چند از نظر Double Count کنترل شده است.
  • Retention و امنیت جدول تاریخچه مشخص است.
  • نتیجه با DMVها و شواهد مکمل تطبیق داده می‌شود.

جمع‌بندی

sys.dm_os_schedulers ابزار ارزشمندی برای پایش Schedulerهای SQL Server است، به شرط آنکه خروجی آن در Context معماری SQLOS، نسخه SQL Server و زمان نمونه‌برداری خوانده شود. مثال‌های این مقاله از Query پایه تا Snapshot و پیوند چند DMV را پوشش دادند تا مسیر تشخیص قابل تکرار باشد.

برای مشاهده ارتباط این DMV با هشت نمای دیگر، راهنمای جامع CPU، Scheduler، Worker، Task و منابع SQLOS را مطالعه کنید.

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر