איך לנתח בעיות ביצועים באורקל - מדריך - ilDBA Portal

איך לנתח בעיות ביצועים באורקל – מדריך

06/09/2015 | פורסם על ידי

בפוסט זה אציג כיצד ניתן לנתח ביצועים באורקל באמצעות Wait-Event Analysis.

מבחינה לוגית התהליך הוא פשוט:

  1. בודקים מהו צוואר הבקבוק המשמעותי ביותר
  2. משפרים\מתקנים אותו
  3. חוזרים חלילה עד שהביצועים טובים

השאלה היא איך מוצאים מהו צוואר הבקבוק המשמעותי ביותר session או ב SQL מסוים? איך מוצאים מהו צוואר הבקבוק המשמעותי ביותר בכל ה Instance?

כל תהליך באורקל יכול להיות בשלושה מצבים:

  • צורך CPU – לרוב, מצב תקין וחיוני (למרות שגם את ניצולת ה CPU צריך לשאוף להפחית במידה ואפשרי).
  • Non-Idle Wait event – ממתין למשהו (נעילה, פעולת I/O, Latch Contention, ועוד …)
    • לדוגמא, כאשר ה Process קורא מספר בלוקים מהדיסק בפעולת I/O אחת, למשל במקרים של Full Table Scan או Index Fast Full Scan אורקל ידווח על Wait Event שנקרא: db file scattered read
    • על-מנת לקבל את רשימת כל ה Non-Idle Wait Events, ניתן להריץ את ה SQL הבא:
SELECT name
 FROM v$event_name
 WHERE wait_class <> 'Idle'
  • Idle Wait Event – לא מבצע כלום, אינדיקציה לכך שה user session במצב Inactive.
    • לדוגמא, כאשר ה Server Process ממתין ל User Client שיבצע משהו אז אורקל ידווח על Wait Event שנקרא : SQL*Net message from client
    • על-מנת לקבל את רשימת כל ה Idle Wait Events, ניתן להריץ את ה SQL הבא:
SELECT name
 FROM v$event_name
 WHERE wait_class = 'Idle'

הערה: גם כאשר התהליך ממתין למשהו הוא יכול לצרוך CPU, למשל, במקרים מסוימים של latch contentions אז גם תהיה עליה בשימוש במעבד (בעיקר בגלל latch spinning, אך לא נרחיב בנושא בפוסט זה).

כעת, כל מה שנותר הוא לבדוק מהו צוואר הבקבוק המשמעותי ביותר ולתקן\לשפר אותו.

כיצד ניתן למדוד מה ה Top non-Idle Wait Events בבסיס הנתונים? ישנן מספר שיטות:

Oracle Dynamic Views

ישנן מספר Dynamic Views באורקל אשר יתנו לנו אינפורמציה על Wait Events:

  • V$SYSTEM_EVENT– נותן מידע על כל Wait Events שהתרחשו בבסיס הנתונים מאז עלייתו. ניתן לקבל את Non-Idle Wait Events ממוינים בסדר יורד לפי הזמן (בשניות) מאז עליית ה Instance באמצעות ה SQL הבא:
  SELECT event, time_waited / 100 "Seconds Waited"
    FROM v$system_event
   WHERE wait_class <> 'Idle'
ORDER BY 2 DESC
  • V$SESSION_EVENT – נותן מידע על כל ה Wait Events שהתרחשו אצל Session ספציפי (רק sessions המחוברים כרגע בלבד, ולא sessions היסטוריים). ניתן לקבל את Non-Idle Wait Events ממוינים בסדר יורד לפי הזמן (בשניות) עבור ה Session באמצעות ה SQL הבא:
select event, time_waited / 100 "Seconds Waited" from v$session_event
   WHERE wait_class <> 'Idle' AND SID = &SID
ORDER BY 2 DESC

AWR

כמובן שגם בדו"ח ה AWR ניתן לקבל את האינפורמציה על Wait-Events, כאשר לרוב יהיה מספיק להתמקד ב Section המופיע בהתחלה בשם “Top 5  Timed Foreground Events”:

top-5-wait-events

כיצד ניתן למדוד ביצועים:

באורקל יש מדד שנקרא “DB Time” אשר מייצג את סך הזמן שאורקל "בזבז" בזמן שהוא עבד (CPU) והמתין (Non-Idle Wait Events). כלומר:  DB Time = CPU Time + Non-Idle wait events

  1. מדד זה לא לוקח בחשבון Background Sessions (רק Foreground Sessions)
  2. מדד זה לא לוקח בחשבון Idle Wait Events

גם את ה DB Time ניתן למדוד במספר דרכים:

Oracle Dynamic Views

ישנן מספר Dynamic Views באורקל אשר יתנו לנו אינפורמציה על ה DB time:

  • V$SYSSTAT– מציג ערכי סטטיסטיקות של אורקל ברמת ה Instance. ניתן לקבל את ערך ה DB time (מאז עליית ה Instance), באמצעות ה SQL הבא:
SELECT value
  FROM v$sysstat
 WHERE name = 'DB time';
  • V$SESSTAT– מציג ערכי סטטיסטיקות של אורקל ברמת sessions. ניתן לקבל את ערך ה DB timeעבור sessions (רק כאלו המחוברים כרגע בלבד, ולא sessions היסטוריים) באמצעות ה SQL הבא:
SELECT value
  FROM v$sesstat JOIN v$statname USING (statistic#)
 WHERE name = 'DB time' AND sid = &SID;

AWR Report


כמובן שגם בדו"ח ה AWR ניתן לקבל את האינפורמציה על DB time בתחילת הדו"ח.

awr-report-header

כפי שניתן לראות, הדו"ח מבוסס על שני Snapshots שהמרחק ביניהם הוא שעה (משעה 15:00 עד שעה 16:00) ולכן הערך של “Elapsed” הוא שעה.

הערך של DB Time, כפי שניתן לראות, הוא ~180 דקות (= 3 שעות). כיצד זה ייתכן שזמן ה DB יותר גדול מכל הזמן שבין שני ה Snapshots? האם ייתכן שבמשך שעה הזמן שאורקל עבד היה כ 3 שעות? התשובה היא: בהחלט!

אם זמן ה DB מחושב כסך הזמן שאורקל "בזבז" על CPU ו Non-Idle Wait Events, אז

כמובן שאם יש בשרת ה DB יותר ממעבד אחד (במקרה זה יש לי 4 ליבות), אז אורקל יכול לנצל את כולם בו-זמנית ואז "זמן ה Database" יהיה סך זמן העבודה בכל הליבות.

דוגמא: אם במשך 10 שניות, כל הארבע ליבות עבדו בניצולת מלאה, אזי DB time יהיה 40 עבור אותן 10 שניות.

לאחר שזיהינו את ה Wait-Events המשמעותיים ביותר, כאלו המשפיעים הכי הרבה על ה DB time, כיצד ניתן להפחית מזמן ה"המתנה" של התהליך לסיום אותם ה wait events או אפילו להימנע מהם לחלוטין? זה כבר עניין של ניסיון והיכרות עם wait events…

באורקל יש למעלה מאלף wait events (כמובן שהמספר המדויק משתנה מגרסה לגרסה), אך בסופו של דבר יש מספר מצוצמם (יחסית) של wait events נפוצים שלומדים את המשמעות שלהם וכיצד ניתן לשפר את זמן ההמתנה עבור אותם wait events. בין אם זה באמצעות שינוי קונפיגרציה של קבצים באורקל, שינוי פרמטרים, או בכלל שיפור זמן הריצה של משפט SQL באמצעות טכניקות שונות של אופטימיזציות למשפטי SQL (לא נרחיב בנושא בפוסט הזה).

כמובן שאם נתקלים ב wait-events שלא מכירים תמיד ניתן להיעזר בחברנו הטוב, גוגל.

ישנם כלים (למשל Oracle Enterprise Manager) המציגים ויזואליזציה של הפעילות באורקל (גם פעילות נוכחית וגם היסטורית) בחיתוכים לפי Wait Classes שהן קטגוריות שונות של Wait Events.

דוגמאות ל Wait Classes : User I/O, Commit, Concurrency וכו' . היתרון הגדול בויזואליזציה זה העובדה שניתן לראות מהר מאוד את הבעיה וכפועל יוצא מכך ה DBA יכול לפתור את הבעיה מהר יותר כי הרי תמונה אחת שווה אלף מילים J

מעבר לעובדה ש OEM מאפשר ויזואליזציה ברמת ה Instance, החל מ OEM 12c, אורקל הציגו Feature שנקרא ASH Analytics המאפשר לראות Wait Events ו Wait Categories  בחיתוכים של “מימדים” שונים כמו:

  • SQL Statement
  • DB User
  • OS User
  • Program
  • Machine
  • PDB (עבור 12c Multi tenancy)

למשל, ניתן לבצע חיתוכים מתוחכמים, כמו לראות את כל Wait Events/Wait Classes של יוזר SALES שרץ לפני שבוע והתחבר מ Toad ב PDB בשם Test. אלו הן יכולות מרשימות שלא ניתן היה לבצע ב-OEM לפני גרסת 12c:

ash-report-oem

חשוב לציין, שעל-מנת להשתמש בכל היכולות המתקדמות של חקירת ביצועים כמו : AWR, ASH, ASH Analytics, הלקוח חייב לעבוד עם Enterprise Edition + Tuning & Diagnostics Packs. כלומר, לקוחות אשר עובדים עם Standard Edition או Standard Edition One לא יכולים להשתמש ב Features אלו ולמעשה גם לקוחות אשר עובדים עם Enterprise Edition אך אין ברשותם את ה Tuning & Diagnostics packs מוגבלים מבחינת יכולות חקירת ביצועים.

עוד מוצר מצוין אשר מאפשר לחתוך היסטורית (תומך עד שנתיים אחורה) מימדים שונים על-מנת לראות את כל הסטטיסטיקות ו Wait Events של מימד אחד או קומבינציה של מימדים ואפילו תומך באופן מלא ב Standard Edition & Standard Edition One הוא Foglight של חברת Dell:

foglight-deshboard

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

להלן כל המימדים  הקיימים במוצר:

foglight-tree

להלן דוגמא הממחישה איך ניתן לחתוך את כל ה SQL Statements שרצו מ Toad ע"י המשתמש SALES:

foglight-performace-tree

כמובן שעבור כל קומבינציה של מימדים ניתן גם לראות את כל הסטטיסטיקות וה Wait-Events בצורה גרפית.

לסיכום:

  • DB time זה מדד חשוב אשר מייצג את סך זמן ה CPU time ו Non-Idle wait events של Foreground sessions בתוך ה Database
  • כאשר רוצים לשפר ביצועים באורקל, השאיפה היא לחקור את ה Wait Events המרכזיים ולהפחית\להעלים אותם, וכפועל יוצא מכך, להפחית גם את ה DB time עד שהביצועים יהיו טובים.
  • ישנם כלים אשר מאפשריים ויזואליזציה של הפעילות ב DB (Wait Events + Statistics) תוך כדי פילוח למימדים שונים כמו SQL Statements, Users, Programs, Machines. שימוש בכלים אלו לרוב מפחית את הזמן שלוקח ל DBA למצוא את הבעיה ולפתור אותה.
  • דוגמאות לכלים כאלה: Oracle Enterprise Manager ו Dell Foglight

נתראה בפוסט הבא!

ניתן ליצור איתי קשר באמצעות המייל: pini.dibask@software.dell.com

הבלוג שלי: oracledbpro.blogspot.com

The following two tabs change content below.
פיני דיבסק (pini.dibask@software.dell.com) הוא Oracle DBA בכיר עם 10 שנות ניסיון, ובעל הסמכה בינלאומית של Oracle Certified Professional. את הקריירה החל בחיל המודיעין כמומחה תשתיות וביצועים והשתחרר בדרגת סרן כראש צוות DBA. כיום הוא Oracle Domain Expert בחברת Dell Software. בעל בלוג מקצועי: http://oracledbpro.blogspot.com וחבר פעיל בקהילת ה OTN. פיני בוגר תואר ראשון בניהול ומדעי המחשב של האוניברסיטה הפתוחה.

השאר תגובה:

שם (חובה):
אימייל (לא יפורסם) (חובה):
תגובה (חובה):

*



מאמרים קשורים

MySQL

MySQL for Oracle DBA’s – התקנה וחיות אחרות

אני עוד זוכר שהתקנה של אורקל הייתה לוקחת יום ואפילו יומיים שלמים, גם היום להתקין אורקל יכול להיות משימה לא פשוטה במידה ומדובר ב-RAC ואו אנשי ה-SYSTEM לא סיפקו לנו סביבת Linux נאותה שיש בה את כל Packages [...]
MySQL

MySQL for Oracle DBA’s – ארכיטקטורה ומנועים

לאחר שהכרנו את ההיסטוריה של MySQL הגיע הזמן להכיר קצת יותר לעומק את הארכיטקטורה ואפילו להשוות אותה לזו של Oralce. ארכיטקטורה כ-DBA-ים מנוסים בטח תשימו לב שבדיוק כמו ל-Oracle ל-MySQL יש Optimizer שתפקידו לקבוע את [...]
MySQL

MySQL for Oracle DBA's – מבוא

פני מספר שנים רכשה אורקל את חברת SUN, רכישה זו כללה את בסיס הנתונים ה-OpenSource המוביל של אותם זמנים – MySQL. רבים שאלו אותי מה לדעתי יקרה עם MySQL האם הוא יטמע בתוך Oracle, האם אורקל  תחליט להרוג אותו או [...]

שחזור טבלה באמצעות RMAN

בפוסט זה אציג פיצ'ר שאורקל הוסיפו בגרסת  12c (12.1.0.1 ליתר דיוק) – שחזור טבלה\טבלאות לנקודת זמן מסוימת באמצעות RMAN. הפיצ'ר יכול להיות שימושי במקרים הבאים: נמחק או השתנה המידע בטבלה ולא ניתן להשתמש [...]
Copyright 2017 ilDBA Portal. Brought to you by Brillix - Israel Leading DBA company. Sponsored by: DBSnaps - Database Video Tutorialss
Website Security Test
%d בלוגרים אהבו את זה: