מעקב אחרי ביצועי השאילתות באמצעות תובנות מתקדמות לגבי שאילתות

בחירת גרסת תיעוד:

התכונה 'תובנות מתקדמות לגבי שאילתות' מאפשרת לכם לזהות, לאבחן ולמנוע בעיות בביצועים של שאילתות במסד הנתונים שלכם ב-AlloyDB Omni. הוא מתעד נתוני טלמטריה של מסד הנתונים, כולל נתונים סטטיסטיים מנורמלים של שאילתות, אירועי המתנה, כתובות ה-IP של הלקוחות, תגים ועומס על המכונה, ושומר מדדים היסטוריים למשך 30 יום.

אפשר להשתמש בתובנות מתקדמות לגבי שאילתות כדי לבצע את המשימות הבאות:

  • לזהות שאילתות עם חביון גבוה ושאילתות שצורכות הרבה משאבים על ידי ניתוח של זמן הביצוע, זמן הקלט/פלט, זמן ההמתנה, פעילות מאגר הנתונים הזמני המשותף ומספר השורות.
  • פתרון בעיות של צווארי בקבוק על ידי התאמה בין שאילתות איטיות לבין אירועי המתנה וסוגים של אירועי המתנה.
  • אפשר לעקוב אחרי ביצועי שאילתות לרכיבי אפליקציה ספציפיים על ידי תיוג שאילתות במטא-נתונים של SQLCommenter.
  • מעקב אחרי שאילתות פעילות ועסקאות פתוחות בזמן אמת, והפסקת סשנים בעייתיים.

לפני שמתחילים

לפני שמפעילים את התובנות המתקדמות לגבי שאילתות, צריך לוודא שהדרישות הבאות מתקיימות:

  • אתם מפעילים מכונת עצמאית של AlloyDB Omni במאגר.

  • יש לכם גישת משתמש-על (postgres) למכונה של מסד הנתונים והרשאת אדמין להפעלה מחדש של הקונטיינר.

  • מסד הנתונים alloydbadmin קיים במופע שלכם. ‫AlloyDB Omni יוצר את מסד הנתונים הזה כברירת מחדל במהלך האתחול.

הפעלת תובנות מתקדמות לגבי שאילתות

כדי להפעיל את התובנות המתקדמות לגבי שאילתות:

  1. מתחברים למסד הנתונים postgres בתור משתמש-העל postgres:

    Docker

    docker exec -it CONTAINER_NAME psql -U postgres -d postgres
    

    Docker

    docker exec -it CONTAINER_NAME psql -U postgres -d postgres
    

    Podman

    podman exec -it CONTAINER_NAME psql -U postgres -d postgres
    

    Podman

    podman exec -it CONTAINER_NAME psql -U postgres -d postgres
    

    מחליפים את CONTAINER_NAME בשם של קונטיינר AlloyDB Omni, למשל my-omni-1.

  2. בודקים את הספריות שנטענו ב-shared_preload_libraries, מוסיפים את התובנות המתקדמות לגבי שאילתות לרשימת הטעינה מראש, מפעילים את התוסף ויוצאים מ-psql:

    SHOW shared_preload_libraries;
    ALTER SYSTEM SET shared_preload_libraries = 'LIBRARY_1','LIBRARY_2','google_insights_v2';
    ALTER SYSTEM SET google_insights_v2.enabled = on;
    \q
    

    מחליפים את LIBRARY_1,‏ LIBRARY_2 וכל ספרייה קיימת נוספת בשמות הספריות שמוחזרים על ידי SHOW shared_preload_libraries. צריך להקיף כל רשומה של ספרייה במירכאות בודדות, כמו 'g_stats','google_columnar_engine','google_insights_v2', ולכלול את כל הספריות הקיימות שנדרשות ל-AlloyDB Omni כדי לא להחליף אותן.

  3. מפעילים מחדש את שרת AlloyDB Omni כדי להחיל את הגדרות הטעינה מראש:

    Docker

    docker restart CONTAINER_NAME
    

    Docker

    docker restart CONTAINER_NAME
    

    Podman

    podman restart CONTAINER_NAME
    

    Podman

    podman restart CONTAINER_NAME
    
  4. מתחברים למסד הנתונים alloydbadmin כמשתמש העל postgres:

    Docker

    docker exec -it CONTAINER_NAME psql -U postgres -d alloydbadmin
    

    Docker

    docker exec -it CONTAINER_NAME psql -U postgres -d alloydbadmin
    

    Podman

    podman exec -it CONTAINER_NAME psql -U postgres -d alloydbadmin
    

    Podman

    podman exec -it CONTAINER_NAME psql -U postgres -d alloydbadmin
    
  5. יוצרים את התוסף advanced query insights במסד הנתונים alloydbadmin:

    CREATE EXTENSION IF NOT EXISTS google_insights_v2;
    
  6. מוודאים שהספרייה נטענה, שהתוסף מופעל ושהתוסף google_insights_v2 מותקן ב-alloydbadmin:

    SHOW shared_preload_libraries;
    SHOW google_insights_v2.enabled;
    SELECT extname, extversion FROM pg_extension WHERE extname = 'google_insights_v2';
    

    עליך לאשר שshared_preload_libraries כולל google_insights_v2, google_insights_v2.enabled החזרות on, וpg_extension מחזיר שורה עבור google_insights_v2.

מאפיינים ופרמטרים של יכולות

ב-AlloyDB Omni, התכונה "תובנות מתקדמות לגבי שאילתות" מתעדת את נתוני הטלמטריה של מסד הנתונים בטבלאות, בתצוגות ובפונקציות של SQL במסד הנתונים alloydbadmin, לפי המאפיינים והיכולות הבאים:

  • שאילתות: משמש לזיהוי משפטי SQL איטיים או כאלה שצורכים הרבה משאבים, כשזמן האחזור של השאילתה עולה.
  • סוגי אירועי המתנה: משמשים כדי לקבוע אם צווארי הבקבוק בעומס העבודה נגרמים בגלל המעבד (CPU), קלט/פלט של דיסק או תחרות על נעילה.
  • אירועי המתנה: משמשים לזיהוי אירוע המתנה ספציפי של PostgreSQL, כמו DataFileRead או WALWrite, שגורם לעיכוב בהרצת השאילתה.
  • מסדי נתונים: אפשר להשתמש בהם כדי להשוות את צריכת המשאבים במסדי נתונים לוגיים ולבודד מסדי נתונים עם עומס גבוה במופעים משותפים.
  • משתמשים וכתובות IP של לקוחות: משמשים לשיוך עומס השאילתות לתפקידים ספציפיים במסד הנתונים או לכתובות ה-IP של הלקוחות, ולזיהוי לקוחות בעייתיים של אפליקציות.
  • תגים: משמשים כדי לקשר בין העומס על מסד הנתונים לבין שירותי אפליקציות, נתיבים או פעולות ORM ספציפיים שמתויגים באמצעות SQLCommenter.
  • שאילתות פעילות: משמשות לאבחון עליות חדות בביצועים בזמן אמת, עסקאות חסומות וסשנים ארוכים בזמן אמת.

כשמגדירים את google_insights_v2.enabled לערך on, מערכת AlloyDB Omni אוספת באופן אוטומטי מדדים לגבי שאילתות, סוגי אירועים של המתנה, אירועים של המתנה, מסדי נתונים ומשתמשים.

כדי לעדכן פרמטר כלשהו של google_insights_v2.* בזמן הריצה בלי להפעיל מחדש את שרת מסד הנתונים, מריצים את ALTER SYSTEM SET וטוענים מחדש את ההגדרות:

ALTER SYSTEM SET PARAMETER_NAME = VALUE;
SELECT pg_reload_conf();

מחליפים את מה שכתוב בשדות הבאים:

  • ‫PARAMETER_NAME: השם של הפרמטר המתקדם של תובנות לגבי שאילתות שרוצים להגדיר, כמו google_insights_v2.qi_track_active_queries,‏ google_insights_v2.qi_track_tag או google_insights_v2.qi_track_client_address.
  • ‫VALUE: הערך החדש של הפרמטר, למשל on.

במאמר הפניה לתובנות מתקדמות לגבי שאילתות מופיעים תיאורים של כל פרמטר, תצוגות התוצאות התואמות, המדדים והעמודות שמוחזרים בכל תצוגה.

יחידות הזמן

כל תצוגה היסטורית של observability_service_* זמינה בשלוש רמות פירוט של זמן:

  • צפיות בסיסיות (*_view): אינטרוולים של 15 שניות. התצוגות האלה מאפשרות לחקור עליות חדות או אירועים שהתרחשו בשעה עד 6 השעות האחרונות.
  • תצוגות ברמה 1 (*_coarse_1_view): מרווחים מצטברים של 5 דקות ל-2,000 השאילתות המובילות. אתם יכולים להשתמש בתצוגות האלה כדי לנתח מגמות בביצועים בטווח של 6 עד 24 שעות.
  • צפיות ברמה 2 (*_coarse_2_view): מרווחי זמן מצטברים של 30 דקות עבור 2,000 השאילתות המובילות. אתם יכולים להשתמש בתצוגות האלה כדי לנתח מגמות של כמה ימים, עד למגבלת השמירה של 30 יום.

בתצוגות ההיסטוריות של נתוני הניטור, כל העמודות של זמני ההרצה, ההמתנה והקלט/פלט מאוחסנות במיקרו-שניות, כולל total_execution_time,‏ total_wait_time,‏ total_read_time,‏ total_write_time ו-time_spent.

מדדי ביצועים היסטוריים של שאילתות

מתחברים למסד הנתונים alloydbadmin כדי להריץ שאילתות אבחון בתצוגות ההיסטוריות של יכולת התצפית. מידע נוסף זמין במאמר הפעלה והתחברות ל-AlloyDB Omni.

הצהרות ה-SQL בקטע הזה הן דוגמאות לשאילתות לתרחישי פתרון בעיות נפוצים במאפיינים. אתם יכולים להתאים אישית את הדוגמאות האלה, למשל לשנות את recorded_on חלון הזמן, לסנן לפי מסדי נתונים או תפקידים ספציפיים, או לשלוח שאילתות ל-*_coarse_1_view ול-*_coarse_2_view לניתוח רב-יומי, כדי להתאים אותן לעומס העבודה שלכם.

זיהוי שאילתות עם זמן אחזור גבוה

כדי למצוא את 10 השאילתות המנורמלות המובילות עם זמן הביצוע הכולל הכי גבוה בשעה האחרונה, מריצים את שאילתת הדוגמה הבאה מול google_insights_v2.observability_service_query_view:

SELECT
  query_id,
  database,
  username,
  left(query, 100) AS normalized_query,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us,
  sum(total_rows) AS total_rows,
  sum(total_shared_blocks_hit) AS shared_blocks_hit,
  sum(total_shared_blocks_read) AS shared_blocks_read
FROM google_insights_v2.observability_service_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY query_id, database, username, left(query, 100)
ORDER BY total_execution_time_us DESC
LIMIT 10;

ניתוח אירועי המתנה לפי שאילתה

כדי לזהות אילו קטגוריות של אירועי המתנה (wait_class) ואירועי המתנה המפורטים (wait_event) תורמים הכי הרבה זמן המתנה ל-query_id ספציפי, מריצים את שאילתת הדוגמה הבאה מול google_insights_v2.observability_service_wait_event_stats_by_query_view:

SELECT
  query_id,
  database,
  username,
  wait_class,
  wait_event,
  sum(count) AS wait_occurrences,
  sum(time_spent) AS total_wait_time_us
FROM google_insights_v2.observability_service_wait_event_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
  AND query_id = QUERY_ID
GROUP BY query_id, database, username, wait_class, wait_event
ORDER BY total_wait_time_us DESC;

מחליפים את QUERY_ID בערך query_id שמוחזר על ידי observability_service_query_view.

ניתוח העומס על מסד הנתונים, המשתמשים וכתובות ה-IP של הלקוחות

כדי להשוות בין זמן הביצוע הכולל, זמן ההמתנה ונפח השאילתות במסדי נתונים לוגיים ובתפקידים במסדי נתונים בשעה האחרונה, מריצים את השאילתה לדוגמה הבאה ב-google_insights_v2.observability_service_db_load_conn_view:

SELECT
  database,
  username,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  sum(total_wait_time) AS total_wait_time_us
FROM google_insights_v2.observability_service_db_load_conn_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY database, username
ORDER BY total_execution_time_us DESC;

אם מפעילים את google_insights_v2.qi_track_client_address, אפשר גם לזהות אילו כתובות ה-IP של הלקוחות המתחברים יוצרות את זמן השאילתה הארוך ביותר, באמצעות השאילתה לדוגמה הבאה מול google_insights_v2.observability_service_client_address_stats_by_query_view:

SELECT
  client_address,
  username,
  database,
  query_id,
  sum(count) AS total_executions,
  sum(time_spent) AS total_time_spent_us
FROM google_insights_v2.observability_service_client_address_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY client_address, username, database, query_id
ORDER BY total_time_spent_us DESC
LIMIT 10;

מעקב אחרי ביצועי השאילתות לפי תגים

אם הערך של google_insights_v2.qi_track_tag הוא on והשאילתות כוללות הערות של SQLCommenter, מריצים את השאילתה לדוגמה הבאה כדי לצבור את זמן הביצוע לפי מטא-נתונים של תג האפליקציה באמצעות google_insights_v2.observability_service_tag_view:

SELECT
  application,
  framework_name,
  framework_controller,
  framework_action,
  framework_route,
  database,
  username,
  sum(count) AS total_executions,
  sum(total_execution_time) AS total_execution_time_us,
  round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us
FROM google_insights_v2.observability_service_tag_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY
  application,
  framework_name,
  framework_controller,
  framework_action,
  framework_route,
  database,
  username
ORDER BY total_execution_time_us DESC
LIMIT 10;

מעקב אחרי שאילתות פעילות

כשמגדירים את google_insights_v2.qi_track_active_queries לערך on, אפשר לעקוב אחרי שאילתות שפועלות ולפתוח טרנזקציות בזמן אמת על ידי שליחת שאילתות ל-google_insights_v2.stat_activity ול-google_insights_v2.stat_activity_v3 במסד הנתונים alloydbadmin.

התצוגות האלה חושפות חיבורים פעילים של לקוחות, משכי זמן של סשנים ועסקאות ואירועי המתנה נוכחיים, תוך החרגה של עובדי רקע וחיבורי alloydbadmin.

שאילתות לגבי סשנים פעילים ומשכי עסקאות

כדי לזהות אילו שאילתות פועלות כרגע במכונה ואילו טרנזקציות פועלות הכי הרבה זמן, מריצים את השאילתה לדוגמה הבאה ב-alloydbadmin:

SELECT
  pid AS "Process ID",
  left(normalized_query, 40) AS "Query",
  state AS "Status",
  round(EXTRACT(EPOCH FROM (clock_timestamp() - backend_start))::numeric, 2) AS "Session duration (secs)",
  CASE
    WHEN xact_start IS NOT NULL
    THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - xact_start))::numeric, 2)
    ELSE NULL
  END AS "Transaction duration (secs)",
  CASE
    WHEN query_start IS NOT NULL
    THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - query_start))::numeric, 2)
    ELSE NULL
  END AS "Query duration (secs)",
  COALESCE(wait_event_type, '') AS "Wait event type",
  COALESCE(wait_event, '') AS "Wait event",
  database AS "Database",
  COALESCE(application_name, '') AS "Application name",
  username AS "Username",
  COALESCE(client_addr::text, '') AS "Client address"
FROM google_insights_v2.stat_activity_v3
WHERE state = 'active'
ORDER BY query_start ASC;

עצירת שאילתה או טרנזקציה שפועלת במשך זמן רב

כדי לעצור שאילתה שפועלת זמן רב או טרנזקציה חסומה שזוהתה ב-google_insights_v2.stat_activity_v3, מעבירים את מזהה התהליך שלה אל pg_terminate_backend:

SELECT pg_terminate_backend(PROCESS_ID);

מחליפים את PROCESS_ID בערך של Process ID (pid) שמוחזר על ידי google_insights_v2.stat_activity_v3.

השבתת תובנות מתקדמות לגבי שאילתות

כדי להפסיק את איסוף נתוני הטלמטריה בלי להפעיל מחדש את המכונה של AlloyDB Omni, מגדירים את google_insights_v2.enabled לערך off וטוענים מחדש את ההגדרות:

ALTER SYSTEM SET google_insights_v2.enabled = off;
SELECT pg_reload_conf();

כדי להסיר את אובייקטי התוסף ואת הנתונים ההיסטוריים ששמורים במסד הנתונים של alloydbadmin, מתחברים אל alloydbadmin ומסירים את התוסף:

DROP EXTENSION IF EXISTS google_insights_v2 CASCADE;

המאמרים הבאים