none
SQLCLR WAIT RRS feed

  • שאלה

  • שלום,

    אתמול בסוף יום העבודה (פעילות נמוכה אצלנו)

    קבלנו התראות של WAIT PER SEC גבוהה. (יש אצלנו מערכת ניטור חיצונית)

    כאשר בדקתי את הACTIVITY MONITOR ראיתי יש נעילות מסוג SQLCLR.

    

    מכיוון שאנחנו לא משתמשים ב CLR - אני לא מבין מאיפה זה מגיע?

    גירסה:

    Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 
    Copyright (c) Microsoft Corporation
    Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

    תודה,

    יוסי

    יום שלישי 07 אוקטובר 2014 12:11

תשובות

  • הי יוסי,

    קודם כל, תרשה לי לחוות דעה אישית בנוגע ל-Activity Monitor. זה לא כלי מוצלח במיוחד, והוא הרבה פעמים מטעה, כמו במקרה הזה. אני ממליץ לתשאל ישירות את ה-DMVs הרלוונטיים ולכתוב שאילתות שמתאימות לצרכים שלך ושאתה יודע בדיוק איזה נתונים הן מחזירות.

    אחת הבעיות עם Activity Monitor בהקשר של Waits היא שהוא מציג לך את ה-Waits לפי קטגוריות, ואתה לא יכול לדעת איזה Wait Types בדיוק מעורבים בסיפור. בעיה אחרת היא שבתוך ה-Wait Categories הוא מכניס לפעמים גם Wait Types לא מעניינים במובן הזה שהם גבוהים תמיד, וזה לא אומר כלום. אחד מה-Wait Types האלה הוא CLR_AUTO_EVENT. ה-Wait Type הזה בסך הכל אומר ש-CLR Worker אחד או יותר מחכים לבצע עבודה. זה לא אומר שיש בעיה במערכת שלך. זה לא אומר כלום...

    מה שאני מציע לך לעשות הוא לתשאל את sys.dm_os_wait_stats ולראות איזה Wait Types ספציפיים הכי גבוהים במערכת שלך. אתה יכול גם לפלטר רק את ה-Wait Types ששייכים לקטגוריה SQLCLR ולראות איזה Wait Types ספציפיים בתוך הקטגוריה תורמים למספרים הגבוהים. בשביל לדעת איזה Wait Types ספציפיים יש בכל קטגוריה, אתה יכול פשוט להריץ Trace או Event Session בזמן שאתה מפעיל את ה-Activity Monitor. אתה תמצא שם Batch שמכניס רשומות לתוך טבלה זמנית בשם am_wait_types#. הטבלה הזאת מכילה את כל ה-Wait Types שיש בכל קטגוריה.

    לפי הפוסט הזה של צוות ה-CSS של SQL Server במיקרוסופט, יש באג ב-Activity Monitor שגורם ל-Wait Types ספציפיים לא מעניינים להיכנס לתוך הקטגוריה SQLCLR. הפוסט גם טוען שהבאג היה אמור להיות מתוקן ב-SQL Server 2008 SP1, אבל בפועל הוא לא תוקן עד היום, וזה עדיין ככה ב-SQL Server 2014.

    לסיכום, אני מציע לך להשתמש בשאילתה ששולפת נתונים ישירות מ-sys.dm_os_wait_stats ומראש מפלטרת החוצה את כל ה-Wait Types הלא מעניינים. אתה יכול למצוא ברשת כל מיני דוגמאות מוכנות לשאילתות כאלה, כמו למשל השאילתה הזאת של Paul Randal.

    בהצלחה!

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeirasql.com

    • סומן כתשובה על-ידי Yossi Drori יום ראשון 12 אוקטובר 2014 09:00
    יום ראשון 12 אוקטובר 2014 01:35
    מנחה דיון
  • אהלן

    אתה בטוח שאתה לא עובד עם SQLCLR?!?

    למעשה אתה טועה  :-)
    שרתי SQL מארחים הרבה מאוד משימות CLR. למעשה לא הוסיפו את האפשות של שימוש ב CLR בשבילנו בלבד, אלא בשביל המפתחים של השרת עצמו. מגרסת 2005 ועד הגרסה האחרונה ניתן למצוא יותר ויותר אלמנטים וקודים שנכתבו במקור בדוט נט על ידי המפתחים. יש אלמנטים מובנים של CLR בשרת. לפעמים אפילו נתקלים בהודעת שגיאה של דוט-נט (באגים מסויימים או מצבים מסויימים). אני לא אגיד לך למשל לבצע פעולה של הינדוס לאחור אבל מי שביצע דיווח שהקוד שהוא מזהה כולל C וכן CLR למשל. חלק מהקודים גלויים דרך אגב.

    דוגמה אחת מוכרת רק לשם הדיון: הפונקציה FORMAT היא מתודה של מחלקה בדוט נט.
    דוגמה נוספת בעניין WAITS: המתנות כגון CLR_MANUAL_EVENT וכן CLR_AUTO_EVENT שמקבלים ב DMV הם בדרך כלל תוצאה של אלמנטים פנימיים, אלו למעשה דיווחים על CLR worker והן חסרי משמעות. אלו אירועים שקשורים למחלקות דוט בשם AutoResetEvent וכן ManualResetEvent. גם שימוש בקוד שלך הכולל מחלקות אלו יכול להוביל לאותן המתנות כמובן.

    לעצם השאלה. מכיוון שיש לך הרבה אלמנטים של דוט נט בהחלט ייתכן הודעות על המתנות הקשורות לאלמנטים אלו ,גם אם אתה לא מוסיף ספריות CLR שלכם. קשה מאוד לנטר את הסיבות, גם בספריות שמוסיפים ללא ידע בפיתוח CLR, ולעיתים קוד של CLR בהרבה בחינות הוא "קופסא שחורה". למרות זאת מדובר לדעתי במידע חשוב מאוד שניתן להפיק ממנו החלטות. יש מספר שאילתות ואפילו DMV ייחודי לניטור CLR כמו dm_clr_tasks או dm_clr_properties.

    רשימה של המתנות CLR לדוגמה:

    SQLCLR	CLR_AUTO_EVENT
    SQLCLR	CLR_CRST
    SQLCLR	CLR_JOIN
    SQLCLR	CLR_MANUAL_EVENT
    SQLCLR	CLR_MEMORY_SPY
    SQLCLR	CLR_MONITOR
    SQLCLR	CLR_RWLOCK_READER
    SQLCLR	CLR_RWLOCK_WRITER
    SQLCLR	CLR_SEMAPHORE
    SQLCLR	CLR_TASK_START
    SQLCLR	CLRHOST_STATE_ACCESS
    SQLCLR	ASSEMBLY_LOAD
    SQLCLR	FS_GARBAGE_COLLECTOR_SHUTDOWN
    SQLCLR	SQLCLR_APPDOMAIN
    SQLCLR	SQLCLR_ASSEMBLY
    SQLCLR	SQLCLR_DEADLOCK_DETECTION
    SQLCLR	SQLCLR_QUANTUM_PUNISHMENT

    עוד נקודה חשובה, בגרסת 2014 כפי שיש לכם SQLCLR נטען גם אם לא הגדרת clr enabled. הוא נטען ברגע הפעלת השירות של השרת. הסיבה היא בדיוק אותם אלמנטים מובנים של CLR כניראה.

    אני מסכים עם גיא בנושא של כתיבת שאילתות לבד [+1]. אני מקורב יותר לצד של הפיתוח ולכן אולי מרגיש שתמיד אני נוטה לכתוב קוד ולא לעבוד עם כלים מוכנים. כלי ניטור מבחינתי יעילים בניטור מספר רב של שרתים בעיקר כדי לספק את הודעת האזהרה, אבל עבודת הניטור תעשה בצורה יותר hands-on. הקישור שגיא צירף מעולה ואכן מדבר על הודעות מיותרות אבל הוא גם מזכיר שיש הודעות חשובות. בדרך כלל ניטור CLR כאשר אתם לא עושים שימוש ב CLR באופן יזום הוא פעולה שלא מבצעים.

    הסקריפט של Paul Randal מעולה ואני תמיד ממליץ על כל מה ש Paul Randal כותב. הוא ממש מהאנשים היותר מוערכים על ידי והרבה מאוד ממה שאני לומד מאחור הלקעים על השרת מגיע ממנו.


    [Personal Site]  [Blog]  [Facebook
    signature

    • סומן כתשובה על-ידי Yossi Drori יום שני 13 אוקטובר 2014 08:26
    • נערך על-ידי pituachMVP, Editor יום שני 13 אוקטובר 2014 11:46
    יום ראשון 12 אוקטובר 2014 21:47
    מנחה דיון

כל התגובות

  • הי יוסי,

    קודם כל, תרשה לי לחוות דעה אישית בנוגע ל-Activity Monitor. זה לא כלי מוצלח במיוחד, והוא הרבה פעמים מטעה, כמו במקרה הזה. אני ממליץ לתשאל ישירות את ה-DMVs הרלוונטיים ולכתוב שאילתות שמתאימות לצרכים שלך ושאתה יודע בדיוק איזה נתונים הן מחזירות.

    אחת הבעיות עם Activity Monitor בהקשר של Waits היא שהוא מציג לך את ה-Waits לפי קטגוריות, ואתה לא יכול לדעת איזה Wait Types בדיוק מעורבים בסיפור. בעיה אחרת היא שבתוך ה-Wait Categories הוא מכניס לפעמים גם Wait Types לא מעניינים במובן הזה שהם גבוהים תמיד, וזה לא אומר כלום. אחד מה-Wait Types האלה הוא CLR_AUTO_EVENT. ה-Wait Type הזה בסך הכל אומר ש-CLR Worker אחד או יותר מחכים לבצע עבודה. זה לא אומר שיש בעיה במערכת שלך. זה לא אומר כלום...

    מה שאני מציע לך לעשות הוא לתשאל את sys.dm_os_wait_stats ולראות איזה Wait Types ספציפיים הכי גבוהים במערכת שלך. אתה יכול גם לפלטר רק את ה-Wait Types ששייכים לקטגוריה SQLCLR ולראות איזה Wait Types ספציפיים בתוך הקטגוריה תורמים למספרים הגבוהים. בשביל לדעת איזה Wait Types ספציפיים יש בכל קטגוריה, אתה יכול פשוט להריץ Trace או Event Session בזמן שאתה מפעיל את ה-Activity Monitor. אתה תמצא שם Batch שמכניס רשומות לתוך טבלה זמנית בשם am_wait_types#. הטבלה הזאת מכילה את כל ה-Wait Types שיש בכל קטגוריה.

    לפי הפוסט הזה של צוות ה-CSS של SQL Server במיקרוסופט, יש באג ב-Activity Monitor שגורם ל-Wait Types ספציפיים לא מעניינים להיכנס לתוך הקטגוריה SQLCLR. הפוסט גם טוען שהבאג היה אמור להיות מתוקן ב-SQL Server 2008 SP1, אבל בפועל הוא לא תוקן עד היום, וזה עדיין ככה ב-SQL Server 2014.

    לסיכום, אני מציע לך להשתמש בשאילתה ששולפת נתונים ישירות מ-sys.dm_os_wait_stats ומראש מפלטרת החוצה את כל ה-Wait Types הלא מעניינים. אתה יכול למצוא ברשת כל מיני דוגמאות מוכנות לשאילתות כאלה, כמו למשל השאילתה הזאת של Paul Randal.

    בהצלחה!

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeirasql.com

    • סומן כתשובה על-ידי Yossi Drori יום ראשון 12 אוקטובר 2014 09:00
    יום ראשון 12 אוקטובר 2014 01:35
    מנחה דיון
  • אהלן

    אתה בטוח שאתה לא עובד עם SQLCLR?!?

    למעשה אתה טועה  :-)
    שרתי SQL מארחים הרבה מאוד משימות CLR. למעשה לא הוסיפו את האפשות של שימוש ב CLR בשבילנו בלבד, אלא בשביל המפתחים של השרת עצמו. מגרסת 2005 ועד הגרסה האחרונה ניתן למצוא יותר ויותר אלמנטים וקודים שנכתבו במקור בדוט נט על ידי המפתחים. יש אלמנטים מובנים של CLR בשרת. לפעמים אפילו נתקלים בהודעת שגיאה של דוט-נט (באגים מסויימים או מצבים מסויימים). אני לא אגיד לך למשל לבצע פעולה של הינדוס לאחור אבל מי שביצע דיווח שהקוד שהוא מזהה כולל C וכן CLR למשל. חלק מהקודים גלויים דרך אגב.

    דוגמה אחת מוכרת רק לשם הדיון: הפונקציה FORMAT היא מתודה של מחלקה בדוט נט.
    דוגמה נוספת בעניין WAITS: המתנות כגון CLR_MANUAL_EVENT וכן CLR_AUTO_EVENT שמקבלים ב DMV הם בדרך כלל תוצאה של אלמנטים פנימיים, אלו למעשה דיווחים על CLR worker והן חסרי משמעות. אלו אירועים שקשורים למחלקות דוט בשם AutoResetEvent וכן ManualResetEvent. גם שימוש בקוד שלך הכולל מחלקות אלו יכול להוביל לאותן המתנות כמובן.

    לעצם השאלה. מכיוון שיש לך הרבה אלמנטים של דוט נט בהחלט ייתכן הודעות על המתנות הקשורות לאלמנטים אלו ,גם אם אתה לא מוסיף ספריות CLR שלכם. קשה מאוד לנטר את הסיבות, גם בספריות שמוסיפים ללא ידע בפיתוח CLR, ולעיתים קוד של CLR בהרבה בחינות הוא "קופסא שחורה". למרות זאת מדובר לדעתי במידע חשוב מאוד שניתן להפיק ממנו החלטות. יש מספר שאילתות ואפילו DMV ייחודי לניטור CLR כמו dm_clr_tasks או dm_clr_properties.

    רשימה של המתנות CLR לדוגמה:

    SQLCLR	CLR_AUTO_EVENT
    SQLCLR	CLR_CRST
    SQLCLR	CLR_JOIN
    SQLCLR	CLR_MANUAL_EVENT
    SQLCLR	CLR_MEMORY_SPY
    SQLCLR	CLR_MONITOR
    SQLCLR	CLR_RWLOCK_READER
    SQLCLR	CLR_RWLOCK_WRITER
    SQLCLR	CLR_SEMAPHORE
    SQLCLR	CLR_TASK_START
    SQLCLR	CLRHOST_STATE_ACCESS
    SQLCLR	ASSEMBLY_LOAD
    SQLCLR	FS_GARBAGE_COLLECTOR_SHUTDOWN
    SQLCLR	SQLCLR_APPDOMAIN
    SQLCLR	SQLCLR_ASSEMBLY
    SQLCLR	SQLCLR_DEADLOCK_DETECTION
    SQLCLR	SQLCLR_QUANTUM_PUNISHMENT

    עוד נקודה חשובה, בגרסת 2014 כפי שיש לכם SQLCLR נטען גם אם לא הגדרת clr enabled. הוא נטען ברגע הפעלת השירות של השרת. הסיבה היא בדיוק אותם אלמנטים מובנים של CLR כניראה.

    אני מסכים עם גיא בנושא של כתיבת שאילתות לבד [+1]. אני מקורב יותר לצד של הפיתוח ולכן אולי מרגיש שתמיד אני נוטה לכתוב קוד ולא לעבוד עם כלים מוכנים. כלי ניטור מבחינתי יעילים בניטור מספר רב של שרתים בעיקר כדי לספק את הודעת האזהרה, אבל עבודת הניטור תעשה בצורה יותר hands-on. הקישור שגיא צירף מעולה ואכן מדבר על הודעות מיותרות אבל הוא גם מזכיר שיש הודעות חשובות. בדרך כלל ניטור CLR כאשר אתם לא עושים שימוש ב CLR באופן יזום הוא פעולה שלא מבצעים.

    הסקריפט של Paul Randal מעולה ואני תמיד ממליץ על כל מה ש Paul Randal כותב. הוא ממש מהאנשים היותר מוערכים על ידי והרבה מאוד ממה שאני לומד מאחור הלקעים על השרת מגיע ממנו.


    [Personal Site]  [Blog]  [Facebook
    signature

    • סומן כתשובה על-ידי Yossi Drori יום שני 13 אוקטובר 2014 08:26
    • נערך על-ידי pituachMVP, Editor יום שני 13 אוקטובר 2014 11:46
    יום ראשון 12 אוקטובר 2014 21:47
    מנחה דיון
  • יש בפורום באג חמור לגבי שימוש בטקסט בולט!

    הורדתי את השימוש בטקסט בולט בהודעה לי מעל כדי לאפשר קריאה נוחה


    [Personal Site]  [Blog]  [Facebook]
    signature

    יום שני 13 אוקטובר 2014 12:35
    מנחה דיון