ঘড়ির সময়ের চেয়ে অপেক্ষাের সময়গুলি কীভাবে বেশি হতে পারে?


15

আমি যখন sp_BlitzFirst এর সাথে অপেক্ষা করতে দেখি তখন আমি এই বিশদটি পাই:

<?ClickToSeeDetails -- 
For 20 seconds over the last 5 seconds, SQL Server was waiting on this 
particular bottleneck.


 -- ?>

এটি কি "শেষ 5 সেকেন্ডে 20 বার পড়া উচিত?" সন্ধান ছিল CLR_SEMAPHORE MA

উত্তর:


24

না - অপেক্ষার পরিসংখ্যানগুলি সার্ভারের জন্য ব্যয় করা শারীরিক সময়ের চেয়ে মোট বেশি (এবং প্রায়শই নয়, হবে) করতে পারে can

এমন পরিস্থিতিটি কল্পনা করুন যেখানে 2 পৃথক থ্রেড একই সংস্থানটিতে কিছু সংস্থানটির জন্য অপেক্ষা করে - আপনার ঘড়ির সময় 1 সেকেন্ডের জন্য অপেক্ষা হবে 2 সেকেন্ড।

প্রতিটি থ্রেডের নিজস্ব অপেক্ষা রয়েছে - বার্তাটি আপনাকে বলছে যে নির্দিষ্ট সংস্থানটির জন্য 20 সেকেন্ড অপেক্ষা সময়টি শেষ 5 সেকেন্ডের ঘড়ির সময় ঘটেছে।

বা অন্য উপায়ে বলতে গেলে, প্রতিটি কোর একই সময়ে একাধিক অনুসন্ধান চালাতে পারে এবং একাধিক কোর এমনকি আরও অপেক্ষা করতে পারে। যা বলতে হবে, ইউনিটটি সত্যই থ্রেড · সেকেন্ড নয়, সেকেন্ড।


8

এটি উদাহরণের মাধ্যমে কাজ করতেও সহায়ক হতে পারে। একজন শ্রমিকের জন্য তিনটি সাধারণ অবস্থা বিবেচনা করুন :

চলমান = কর্মী বর্তমানে হয় অ-প্রাকৃতিকভাবে বা পূর্বস্ময়করভাবে চলছে।

রুননেবল = কর্মসূচিটি শিডিউলারে চালাতে প্রস্তুত।

আশ্বাসপ্রাপ্ত = কর্মচারী বর্তমানে সাসপেন্ড করা হয়েছে, কোনও ইভেন্ট এটির সংকেত প্রেরণের জন্য অপেক্ষা করছে waiting

একটি রাষ্ট্রের সাথে কর্মীরা RUNNINGঅপেক্ষা করার সময় উত্পন্ন করতে পারে। উদাহরণস্বরূপ, যদি কর্মীকে এসকিউএলএসের পরিবর্তে ওএসে কোড চালানোর প্রয়োজন হয় তবে এটি একটি প্রাকদর্শন বা বাহ্যিক অপেক্ষা করতে পারে। সেই সময়ে এটি সম্পর্কিত সিপিইউতে কোড চলবে তবে এটি এখনও অপেক্ষার সময় উত্পন্ন করবে।

একটি রাষ্ট্রের শ্রমিকরা RUNNABLEঅপেক্ষা করার সময় উত্পন্ন করতে পারে (যতদূর আমি জানি তারা সর্বদা করে)। যদি কর্মীটিকে সংকেত দেওয়া হয়েছিল যে কোনও সংস্থান উপলব্ধ ছিল তবে এটি শেষ অপেক্ষার ভিত্তিতে সংকেত অপেক্ষা করার সময় সংগ্রহ করতে পারে। যদি শ্রমিক তার পূর্ববর্তী 4 এমএস কোয়ান্টামটি শেষ করে দেয় তবে এটি SOS_SCHEDULER_YIELDঅপেক্ষা করার সময়টি জমা করতে পারে ।

একটি রাষ্ট্রের সাথে কর্মীরা SUSPENDEDঅপেক্ষা করার সময় উত্পন্ন করতে পারে। এমন একজন কর্মী বিবেচনা করুন যা লকের জন্য অপেক্ষা করছে। এটি প্রয়োজন সময় লক সংস্থান যা উপলব্ধ না হওয়া পর্যন্ত এটি অপেক্ষা সময় উত্পন্ন করবে। কিছু সাসপেন্ড করা কর্মী কোনও কাজের সাথে জড়িত না এমনদের সহিত অপেক্ষা করার সময় উত্পন্ন করে না।

আমার ডেস্কটপে চারটি লজিক্যাল কোর রয়েছে, তাই ডিফল্ট সর্বোচ্চ কর্মীর সংখ্যা 512 । এটি প্রায় অবশ্যই অবাস্তব, তবে এই যন্ত্রটিতে আমি তাত্ত্বিকভাবে প্রতি সেকেন্ডে 512 সেকেন্ডের জন্য অপেক্ষা করার সময় উত্পন্ন করতে পারতাম যদি আমি প্রতিটি কর্মীকে একবারে কোনও কিছুতে অপেক্ষা করতে পারি। কোর / শ্রমিকের সংখ্যা বাড়ার সাথে সাথে এই সংখ্যাটি আরও বেশি হতে পারে।

আপনি প্রতি সেকেন্ডের অপেক্ষা এক সেকেন্ডেরও বেশি দেখতে পাবেন এমনকি আপনি এসকিউএল সার্ভারের বিরুদ্ধে কোনও অনুসন্ধান চালাচ্ছেন না। আমার মেশিনে, নিম্নলিখিত কোয়েরিটি 9-14 সারিগুলির মধ্যে উত্পন্ন বলে মনে হচ্ছে:

SELECT [state], last_wait_type, wait_started_ms_ticks
FROM sys.dm_os_workers
WHERE [state] IN ('SUSPENDED', 'RUNNABLE')
AND task_address IS NOT NULL
AND wait_started_ms_ticks <> 0
AND wait_started_ms_ticks >= start_quantum;

আমি সর্বমোট অপেক্ষার সময়ের স্ন্যাপশট নিতে পারি যেহেতু আমি সর্বশেষে সার্ভারটি পুনরায় চালু করেছি এবং দশ সেকেন্ড অপেক্ষা করার পরে এটি একটি নতুন মোটের সাথে তুলনা করব:

DECLARE @start_wait_time_ms BIGINT;

SELECT @start_wait_time_ms = SUM(wait_time_ms)
FROM sys.dm_os_wait_stats
WHERE wait_type <> 'WAITFOR';

WAITFOR DELAY '00:00:10';

SELECT SUM(wait_time_ms) - @start_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type <> 'WAITFOR';

কখনও কখনও গণিত কাজ করে। শেষবার যখন আমি এটি চালিয়েছি তখন ডেল্টা ছিল 101339 এমএস। অন্য কথায়, সিস্টেমের কাজগুলি থেকে আমার প্রতি সেকেন্ডে 10 সেকেন্ডেরও বেশি অপেক্ষা ছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.