.net - كيفية استكشاف أخطاء مهلة SQL المتقطعة




sql-server sql-server-2008 (10)

تشغيل تتبع SQL من الاستعلامات على المدى الطويل و deadlocks. هذا لا يُظهِر أي طريق مسدود في أوقات المشاكل ، وطلبات البحث الطويلة تتطابق مع أخطاء المهلة ، لكن يجب أن تكون تأثيرًا جانبيًا ، وليس السبب. تؤدي الاستعلامات التي تتسم بطبيعتها الأساسية جدًا والتي تظهر عادةً على الفور إلى اتخاذ 30 أو 60 أو 120 ثانية في بعض الأحيان. هذا يحدث لبضع دقائق ثم كل شيء يلتقط ويعمل بشكل جيد بعد ذلك.

يبدو أن بعض الاستعلامات / المعاملات قفل قاعدة البيانات الخاصة بك حتى يتم الانتهاء منها. يجب عليك معرفة طلبات البحث التي تم حظرها وإعادة كتابتها / تشغيلها في وقت آخر لتجنب حظر العمليات الأخرى. في هذه اللحظة استفسارات الانتظار فقط مهلة.

نقطة إضافية للتنقيب هي حجم الزيادة التلقائية لسجل المعاملات وقاعدة البيانات الخاصة بك. اضبطها على حجم ثابت بدلاً من نسبة مئوية من الملفات الحالية. إذا كانت الملفات تحصل على أطول ، فإن الوقت الذي يستغرقه تخصيص مساحة كافية سيؤدي في النهاية إلى انتهاء مهلة المعاملة. و دي بي الخاص بك يأتي في حالة توقف.

لقد كان لدينا عدد قليل من الحالات في اليوم حيث نحصل على عدد كبير من أخطاء SQL Timeout من تطبيقات متعددة (System.Data.SqlClient.SqlException: انتهت صلاحية المهلة. انقضت فترة المهلة قبل إتمام العملية أو أن الخادم لا يستجيب .) لدينا أكثر من 100 تطبيق مختلف على شبكتنا ، سواء تطبيقات الويب وتطبيقات سطح المكتب. كل شيء من VB6 و Classic ASP إلى .NET 4. يمكنني العثور على جميع أنواع البيانات التي تظهر الآثار الجانبية ولكن لا يمكن تحديد ما الذي يسبب هذا. يقول DBA الخاص بنا أنه لا يوجد أي شيء خاطئ مع خادم SQL ، وتقول تقنية المعلومات أنه لا يوجد شيء خاطئ في خوادم الويب أو الشبكات ، لذلك بالطبع تركت في الوسط في محاولة استكشاف ذلك.

أنا حقا مجرد البحث عن اقتراحات حول ما يمكن القيام به لتحرّي الخلل وإصلاحه الأخرى لتتبع هذا الأمر.

نحن نستخدم SQL Server 2008 R2 في نظام مجموعة. هناك عدد قليل من الخوادم المختلفة التي تتصل بها ، بدءا من ويندوز سيرفر 2003 إلى 2008 من أنواع مختلفة.

إليك ما قمت به حتى الآن:

  • تشغيل تتبع SQL من الاستعلامات على المدى الطويل و deadlocks. هذا لا يُظهِر أي طريق مسدود في أوقات المشاكل ، وطلبات البحث الطويلة تتطابق مع أخطاء المهلة ، لكن يجب أن تكون تأثيرًا جانبيًا ، وليس السبب. تؤدي الاستعلامات التي تتسم بطبيعتها الأساسية جدًا والتي تظهر عادةً على الفور إلى اتخاذ 30 أو 60 أو 120 ثانية في بعض الأحيان. هذا يحدث لبضع دقائق ثم كل شيء يلتقط ويعمل بشكل جيد بعد ذلك.
  • استخدم مراقب الأداء لتتبع اتصالات تجمع الاتصال. يعرض هذا أحيانًا بعض الارتفاعات في عدد الاتصالات بالقرب من أوقات المهلة ، ولكن لا يزال حتى منتصف الطريق إلى حد الاتصال الافتراضي 100. مرة أخرى ، لا شيء هنا يبدو أنه يشير إلى سبب.
  • تطبيقات ويب منفصلة إلى مجمعات تطبيقات مختلفة. حاولنا تضييق نطاق التطبيقات التي نعتقد أنها قد تكون المشكلة الرئيسية (معظمها شاذة ، إلخ) ووضعها في مجمعات تطبيقات منفصلة ولكن لا يبدو أنها تؤثر على أي شيء أو تساعدنا على تضييق أي شيء.
  • مراقبة استخدام القرص على SQL Server. لقد قمنا ببعض المراقبة على خادم SQL ولا نرى أي طفرات أو أي إشارات للمشاكل عندما تحدث هذه المهلات.
  • تم التحقق من TempDB لم يكن سبب المشكلة.

سأعود وأضيف المزيد إذا فكرت في ما حاولنا أيضًا. يرجى إعلامي ببعض الأفكار حول ما يجب استكشافه وإصلاحه بعد ذلك.


أقترح عليك إلقاء نظرة عميقة على ميزة " طرق عرض الإدارة الديناميكية" الرائعة الخاصة بـ SQL Server:

تقوم طرق العرض والإدارة الديناميكية بإرجاع معلومات حالة الخادم التي يمكن استخدامها لمراقبة صحة مثيل الخادم وتشخيص المشكلات وضبط الأداء.

هذه المقالة بداية جيدة مع DMVs ، على الرغم من أنه تمت كتابتها لـ SQL 2005 (مظهر DMVs الميزة الأولى): استكشاف مشكلات الأداء في SQL Server 2005 ، خاصة فصول "حظر".


بما أنني أقوم باستكشاف الأخطاء وإصلاحها يوميًا كجزء من وظيفتي ، فإليك ما أود القيام به:

  1. نظرًا لأنه SQL Server 2008 R2 ، يمكنك تشغيل SQLDiag الذي يأتي كجزء من المنتج. يمكنك الرجوع إلى الكتب عبر الإنترنت لمزيد من التفاصيل. باختصار ، التقاط تتبع خادم الجانب والبرنامج النصي مانع.

  2. بمجرد التقاط التتبع ، ابحث عن حدث "الاهتمام". من شأنه أن يكون spid الذي تلقى الخطأ. إذا قمت بالتصفية بواسطة SPID ، سترى RPC: اكتمال الحدث قبل "الانتباه". تحقق من الوقت هناك. هل هذا الوقت 30 ثانية؟ إذا كانت الإجابة بنعم ، فانتظر العميل لمدة 30 ثانية للحصول على استجابة من SQL وحصلت على "timed out" [هذا هو إعداد العميل حيث أن SQL لن تتوقف أبدًا والاتصال]

  3. الآن ، تحقق مما إذا كان الاستعلام الذي تم تشغيله فعليًا يجب أن يستغرق 30 ثانية؟

  4. إذا كانت الإجابة بنعم ، قم بضبط الاستعلام أو قم بزيادة إعداد المهلة من العميل.

  5. إذا كان لا ، فيجب أن يكون هذا الاستعلام في انتظار بعض الموارد (المحظورة)

  6. عند هذه النقطة ، ارجع إلى Blocker Script وتحقق من الإطار الزمني عند ظهور "Attention"

أعلاه يفترض أن المسألة مع SQL Server لا الشبكة ذات الصلة!


تجربتي مع هذه المشكلات (وليس على SQL Server مع ذلك) هي أن overdone تعدد المهام غالباً ما يكون سبب المشكلة. إذا كانت هناك بيانات / جداول مشابهة / متصلة تم الاستعلام عنها في (تقريبًا) في نفس الوقت من خلال العديد من الاتصالات ، فقد يكون نظام إدارة قواعد البيانات (DBMS) يواجه مشكلة في الاحتفاظ بكل العزل عند الفحص. هذا ليس الكثير من قضية استخدام القرص لجعل بعض الاتصالات تنتظر الأشياء التي يمكن القيام بها من قبل الآخرين. التزامن غالي جدا من حيث استخدام وحدة المعالجة المركزية.

الروابط 100 هي الطريقة في رأيي. (في تجربتي مرة أخرى) حتى 20 اتصالاً يطلب أن يتم بواسطة آلة واحدة قد تكون مفرطة في التفاؤل.


قد يبدو لك بالفعل إجابتك ولكن في حال كنت بحاجة إلى مكان آخر للنظر قد ترغب في التحقق من حجم ونشاط قاعدة البيانات الخاصة بك. كان لدينا مشكلة كهذه مرة واحدة في موقع العميل حيث بضع مرات في اليوم من شأنه أن يتحلل أداء فظيعة وأحيانا مهلة. تحولت المشكلة إلى أن يكون تطبيقًا منفصلاً كان يعمل على القضاء على درجة الحرارة المؤقتة لدرجة أنه كان يؤثر على أداء الخادم الكلي.

حظا سعيدا مع استمرار استكشاف الأخطاء وإصلاحها!


قليلاً من لقطة طويلة ، ولكن على مختبر أثناء العودة ، كان لدينا موقف حيث ظهر SQL Server لا يستجيب ، ليس لأننا قد ارتفعت وحدة المعالجة المركزية أو أي شيء يمكن أن نتتبع داخل SQL Server ، بدا يعمل على جميع الاختبارات ولكن فشل الاتصالات تحت بعض الحمولة.

وتبين أن السبب في ذلك يرجع إلى أن حجم حركة المرور على الخادم يعني أننا كنا نفتح النوافذ المدمجة في Syn Synack Flood Protection ضمن Windows. بشكل مزعج عندما تضغط على هذا ، لا توجد رسالة مسجلة داخل مخدم ويندوز ، أو داخل SQL - سترى فقط symtpoms التي لا يتم إجراء اتصالات - وهذا لأن النوافذ تتباطأ عند قبول الرسائل ودعنا بناء قائمة الانتظار. من وجهة نظر الاتصال ، يبدو أن الخادم لا يستجيب عندما يجب عليه (حتى لا يسلم الرسالة)

http://msdn.microsoft.com/en-us/library/ee377084(v=bts.10).aspx

انتقل لأسفل إلى SynAttackProtect وسترى الافتراضي في ويندوز سيرفر 2003 SP1 فصاعدا لتمكين هذه الميزة بشكل افتراضي. إنها آلية حماية DDOS سارية المفعول ، ونقص التسجيل الذي يتم تشغيله يجعل من الصعب للغاية اكتشافه عندما يقوم الخادم بذلك.

استغرق الأمر 3 أيام داخل مختبر MS قبل أن يتم التعرف عليها.

لقد ذكرت 100 عملية ، وكان لدينا تطبيق متصل باستمرار ، ونفذ استعلامات ثم تم قطع اتصاله ، ولم يعقد الاتصالات مفتوحة. هذا يعني أنه كان لدينا العديد من الخيوط على كل اتصال للآلة للقيام بذلك ، 10 آلات ، خيوط متعددة لكل جهاز ، واعتبر اتصالات مختلفة كافية يتم إسقاطها / إسقاطها لإطلاق الدفاع.

يصعب القول ما إذا كنت على هذا المستوى (لأنه ليس عتبة محددة بوضوح من قبل MS).


لقد رأيت مشاكل مماثلة تحدث إذا تم تثبيت مكافحة الفيروسات على خادم SQL. كانت ميزات التحديث التلقائي لـ AV تعمل على تسجيل الخادم وعدم السماح بما يكفي من وحدة المعالجة المركزية لـ SQL Server.

أيضا ، هل قمت بوضع تطبيق صغير على خادم SQL نفسه الذي يتحقق من أن الاتصالات يمكن إجراؤها أو تشغيل SQL بسيطة للغاية مثل "SELECT GETDATE ()؛" هذا من شأنه القضاء على احتمالات الشبكة.


لقد واجهنا ذلك مع SQL Server 2012 / SP3 ، عند تشغيل استعلام عبر كائن SqlCommand من داخل تطبيق C #. كان الأمر عبارة عن استدعاء بسيط لإجراء مخزن يحتوي على معلمة جدول واحد؛ كنا نمر قائمة من حوالي 300 أعداد صحيحة. استدعى الإجراء بدوره ثلاث وظائف المعرفة من قبل المستخدم واجتاز الجدول كمعلمة لكل منها. تم تعيين CommandTimeout إلى 90 ثانية.

عند تشغيل نفس proc المخزنة بنفس الوسيطة نفسها من داخل SQL Server Management Studio ، تشغيل الاستعلام في 15 ثانية. ولكن عند تشغيله من تطبيقنا باستخدام الإعداد أعلاه ، انقضت مهلة SqlCommand. تم تشغيل نفس SqlCommand (مع بيانات مختلفة ولكن قابلة للمقارنة) بنجاح لعدة أسابيع ، لكنها الآن فشلت مع أي وسيطة جدول تحتوي على أكثر من 20 رقم صحيح أو أكثر. لقد قمنا بعملية تتبع واكتشفت أنه عند التشغيل من كائن SqlCommand ، قضت قاعدة البيانات مدة 90 ثانية كاملة للحصول على أقفال ، ولم تستدعي الإجراء إلا في وقت انتهاء المهلة. قمنا بتغيير وقت CommandTimeout ، وبغض النظر عن الوقت الذي اخترناه ، فإن البروكسي المخزن لن يتم استدعاؤه إلا في نهاية تلك الفترة. لذلك نحن نؤمن بأن SQL Server قد تم الحصول على نفس الإقفال بشكل غير محدد مرارًا وتكرارًا ، وأن مهلة الكائن Command فقط هي التي أدت إلى توقف SQL Server عن حلقة لا نهائية وبدء تنفيذ الاستعلام ، وفي ذلك الوقت كان الوقت متأخرًا جدًا لتحقيق النجاح. محاكاة لهذه العملية نفسها على خادم مماثل باستخدام بيانات مماثلة لم تظهر مشكلة من هذا القبيل. كان حلنا هو إعادة تشغيل خادم قاعدة البيانات بالكامل ، وبعد ذلك اختفت المشكلة.

لذلك يبدو أن هناك بعض المشاكل في SQL Server حيث يتم استهلاك بعض الموارد بشكل تراكمي ولم يتم إصدارها مطلقًا. في نهاية المطاف عند الاتصال عبر SqlConnection وتشغيل SqlCommand تتضمن معلمة جدول ، ينتقل SQL Server في حلقة لا نهائية الحصول على التأمين. يتم إنهاء الحلقة بواسطة مهلة الكائن SqlCommand. الحل هو إعادة التشغيل ، على ما يبدو استعادة التعقل (مؤقتة؟) إلى SQL Server.


هل هذه الخوادم افتراضية؟ في منشور آخر قرأت عن خادم SQL يعمل ببطء شديد في بعض الأحيان بسبب نقص الذاكرة الكافية. وقد نتج هذا بدوره عن ما يسمى بالون الذاكرة الذي يستخدمه المحلل الافتراضي للحد من مقدار الذاكرة المستخدمة من قبل ذلك الملقم الظاهري. كان من الصعب العثور عليه لأن الضغط على الذاكرة الفعلية ليس له علاقة بخادم SQL نفسه.

سبب آخر شائع لتدهور الأداء المؤقت قد يكون ماسحًا للفيروسات. عندما يتم تثبيت تعريف فيروس جديد ، سوف تعاني جميع العمليات الأخرى وتعمل ببطء شديد. تحقق من أي عملية تحديث تلقائية أخرى ، قد يستغرق هذا أيضًا الكثير من الموارد بشكل غير متوقع. حظا سعيدا مع ذلك!


المشكلة بسبب استعلام سيئ يستغرق وقت تنفيذ الاستعلام أكثر من 60 ثانية أو تأمين على الجدول

تبدو المشكلة مثل حدوث حالة توقف تام؛ لدينا استعلامات تمنع طلبات البحث لإكمالها في الوقت المناسب. المهلة الافتراضية للاستعلام هي 60 ثانية وبعد ذلك سيكون لدينا SQLException للمهلة.

الرجاء التحقق من سجلات SQL Server من أجل deadlocks. الطريقة الأخرى لحل المشكلة لزيادة المهلة على كائن الأوامر (Temp Solution).





timeout