এসকিউএল সার্ভার - কীভাবে এক সেকেন্ডেরও কম সময়ের মধ্যে ঘটে যাওয়া ব্লক করা ট্র্যাক করবেন


14

আমি একটি ব্লকিং সমস্যা সমাধানের চেষ্টা করছি যা এক সেকেন্ডেরও কম সময় ঘটে। ওয়ালটিপি অ্যাপ্লিকেশনটি অত্যন্ত সংবেদনশীল এবং সম্মত এসএলএ অনুযায়ী কিছু লেনদেনের জন্য 200 মিলের কম সময়ের প্রতিক্রিয়া সময় থাকতে হবে। নতুন কোড রিলিজের সাথে আমাদের কয়েকটি লক বাড়ানোর সমস্যা ছিল যা আমরা আপডেটগুলিতে ব্যাচের আকার হ্রাস করে সমাধান করতে সক্ষম হয়েছি। এমনকি ছোট ব্যাচের আকারের সাথেও, আমরা সন্দেহ করি যে নতুন এসপি ওলটিপি লেনদেনগুলি আপডেট করছে একই সারিগুলিকে ব্লক করছে।

আমার যে সেশনটি অবরুদ্ধ হচ্ছে এবং এটির অপেক্ষায় থাকা সংস্থানটি সন্ধান করা দরকার। আমার বোঝার হিসাবে "ব্লকড প্রসেস থ্রোহোল্ড" সর্বনিম্ন 1 সেকেন্ডের জন্য সেট করতে পারে এবং তাই এটি ব্লকিং ক্যাপচার করবে না।

আমি ওয়েট_ইনফো এবং ওয়েট_কম্প্লেটেড এক্স ইভেন্টের সাথে পরীক্ষা করছি।

আমরা এটি ট্র্যাক করতে পারে অন্য কোন উপায় আছে কি? ধন্যবাদ


: তাই একই ব্যবহারকারীর দ্বারা একই প্রশ্ন stackoverflow.com/questions/38407021/...
TheGameiswar

উত্তর:


10

যেহেতু আপনি সাধারণভাবে অপেক্ষা করার চেয়ে লক করতে বিশেষভাবে আগ্রহী locks_lock_waitsবর্ধিত ইভেন্টটি আরও উপযুক্ত মনে হচ্ছে।

একটি ফিল্টার চালু আছে increment >= 200

CREATE EVENT SESSION [locks_lock_waits] ON SERVER 
ADD EVENT sqlserver.locks_lock_waits(
        ACTION(sqlserver.sql_text)
            WHERE  ( [sqlserver].[is_system] = 0
                     AND [increment] >= 200
                     AND [counter] <= 1000 ) 
    )
ADD TARGET package0.ring_buffer;

GO

ALTER EVENT SESSION [locks_lock_waits]  
ON SERVER  STATE = start;  

উপরেরগুলি সময়সীমা পরিমাণের জন্য লকগুলির জন্য অপেক্ষা করা বিবৃতি সংগ্রহ করে তবে নির্দিষ্ট লক সংস্থান দেয় না।

আমি এই ইভেন্টটি কখনই ব্যবহার করি নি এবং এই অধিবেশনটি আপনার প্রোডাকশন সার্ভারে কতটা ওভারহেডের কারণ হতে পারে সে সম্পর্কে আমার অন্তর্দৃষ্টি নেই।

আমি বিষয়টিতে এই ভিডিওটি পেয়েছি । counterসংগ্রহ করা ইভেন্টের সংখ্যা হ্রাস করার জন্য এটি ফিল্টারিংয়ের দৃ strongly়ভাবে প্রস্তাব দেয় এবং আমি উপরে এটি করেছি done

এটি একটি পুরানো উত্তরাধিকারের অননুমোদিত কমান্ডেরও উল্লেখ করেছে

dbcc lock(StallReportThreshold, 200) -- 200 is threshold in ms

যা (যদি ট্রেস পতাকা 3605 সক্ষম করা থাকে) এসকিউএল সার্ভার ত্রুটি লগের জন্য নীচের মতো সীমিত তথ্য ছড়িয়ে দেয়।

প্রক্রিয়া 53 RID- এ এস লকটির জন্য অপেক্ষা করেছিল 6844 এমএস: 2: 1: 120: 2 ফলাফল: ওকেওয়াইট

আমি কেবল এটি পাস করার ক্ষেত্রে উল্লেখ করেছি কারণ বর্ধিত ইভেন্টগুলি যেভাবেই হোক স্পষ্টভাবে পছন্দনীয় হবে কারণ এটি নথিভুক্ত এবং আরও অনেক শক্তিশালী।


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

দুঃখিত, আমি আমার আত্ম পরিষ্কার করতে পারি নি। আমি জিজ্ঞাসা করছিলাম, ডিবিসিসি লক কমান্ডটি চালা না করা পর্যন্ত আমাদের কত দিন আছে? যেমন লকিং ঘটে এবং আমি যদি এক ঘন্টা পরে ডিবিসিসি লক চালাই, আমরা কী এখনও তথ্যটি পাই?
জেসিজেসি

@ জেসিজেসি - আমি এর আগে এর আগে কখনও শুনিনি। আমার এ সম্পর্কে আর কোনও তথ্য নেই। এমনকি এটি নিষ্ক্রিয় করার জন্য প্যারামিটারগুলি আমি জানি না। তবে আপনি dbcc lock(StallReportThreshold, 200) প্রথমে চালান এবং ট্রেস পতাকা 3605 সক্ষম হওয়া অবধি থ্রেশহোল্ড ছাড়িয়ে গেলে এটি তথ্য আউটপুট করে। এসকিউএল সার্ভার এই তথ্যটি সংগ্রহ করে না যদি আপনি এটি পরে চালাতে পারেন।
মার্টিন স্মিথ

2
ধন্যবাদ। xevents এ রিসোর্স_0,1,2 মান রূপান্তর করতে একটি কার্যকর ফাংশন রয়েছে এমন একটি লিঙ্ক যুক্ত করুন। sqlnotes.info/2011/10/24/…
jesijesi

5

আপনি যদি লক করতে আগ্রহী হন তবে বেশ কয়েকটি বর্ধিত ইভেন্ট উপলব্ধ রয়েছে:

lock_acquired
lock_released
lock_escalation

প্রথম দুটি ইভেন্টের duration(মাইক্রোসেকেন্ডস) কলাম রয়েছে যা আপনি আপনার প্রান্তিকের জন্য ফিল্টার করতে পারেন। তাদের একটি resource_descriptionক্রিয়াও রয়েছে যা আপনাকে জড়িত সংস্থানগুলি সম্পর্কে কিছু বিশদ দেবে।

lock_escalationঘটনা আরো একটি আছে statementআপনি যে টি-SQL বক্তব্য যে লক উদ্দীপন আলোড়ন সৃষ্টি সংগ্রহ যোগ করতে পারে। এছাড়া রয়েছে escalation_cause। এখানে একটি নমুনা অধিবেশন:

CREATE EVENT SESSION [locking] ON SERVER 
ADD EVENT sqlserver.lock_acquired( SET collect_resource_description = (1) ),
ADD EVENT sqlserver.lock_escalation( SET collect_statement = (1) ),
ADD EVENT sqlserver.lock_released( SET collect_resource_description = (1) )
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

আমার সন্দেহ হয় যে কোনও কারণ আছে যা আপনি ব্লকড প্রক্রিয়া প্রতিবেদনের প্রান্তিকে এক সেকেন্ডেরও কম স্থির করতে পারবেন না: আরডিবিএমএসে লকিং পুরোপুরি স্বাভাবিক - তাদের সুরক্ষার জন্য ডাটাবেস ইঞ্জিনকে রিসোর্স লক করতে হবে। লকিং কখন ব্লক হয়ে যায় সে সম্পর্কে কোনও আনুষ্ঠানিক সংজ্ঞা না থাকলেও সাব-সেকেন্ডের চেয়ে লক করা আমার কাছে একধরনের স্বাভাবিক বলে মনে হয়।


1
অন্য কারও কাছে রিসোর্সে অ্যাক্সেস অস্বীকার করার সাথে সাথে লকিং ব্লক হয়ে যায় এবং লকের কারণে অপেক্ষা করতে হবে।
মার্টিন স্মিথ

ধন্যবাদ, আমি সময়কাল ক্ষেত্রের সাথে লক_এক্কায়ার্ড ব্যবহার করার পরিকল্পনা করছি।
জেসিজি

শুভকামনা। আপনি এসকিউএল সার্ভার ২০১৪-তে থাকাকালীন, আপনি স্থানীয়ভাবে সংকলিত সঞ্চিত প্রক্সের সাথে ইন-মেমরি ওলটিপি টেবিলগুলি একটি উচ্চ কার্যকারিতা ল্যাচ-ফ্রি বিকল্প সরবরাহ করতে পারেন। আপনি স্ন্যাপশট বিচ্ছিন্নতা তাকান পারে।
ডাব্লু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.