יצירת פרופיל של אפליקציות Java
בדף הזה מוסבר איך לשנות את אפליקציית Java כדי לתעד נתוני פרופיל ולשלוח את הנתונים האלה ל Google Cloudפרויקט. מידע כללי על פרופילים זמין במאמר מושגים שקשורים לפרופילים.
.סוגי פרופילים ל-Java:
- זמן CPU (מעבד)
- Heap (נדרשת Java 11 או סביבה רגילה של App Engine, מושבת כברירת מחדל)
- זמן בפועל (לא זמין בסביבה רגילה של App Engine Java 8)
גרסאות נתמכות של שפת Java:
- מכונות וירטואליות של Java (JVM) שמבוססות על HotSpot (כולל Oracle JDK וחלק מהגרסאות של OpenJDK) ל-Java 8, 11 או גרסאות מתקדמות יותר.
גרסאות נתמכות של סוכן הפרופילים:
- הגרסה העדכנית ביותר של הסוכן נתמכת. באופן כללי, אין תמיכה בגרסאות בנות יותר משנה. מומלץ להשתמש בגרסה העדכנית ביותר של הסוכן.
מערכות הפעלה נתמכות:
- Linux. פרופיל של אפליקציות Java נתמך בקרנלים של Linux שספריית ה-C הרגילה שלהם מיושמת באמצעות
glibcאו באמצעותmusl. למידע על הגדרות שספציפיות לליבות של Linux Alpine, אפשר לעיין במאמר הפעלה ב-Linux Alpine.
סביבות נתמכות:
- Compute Engine
- Google Kubernetes Engine (GKE)
- סביבה גמישה של App Engine
- סביבה רגילה של App Engine (נדרשת גרסה 1.9.64 ואילך של App Engine SDK)
- Managed Service for Apache Spark (מידע נוסף זמין במאמר בנושא הגדרת Cloud Profiler למשימות Spark ו-Hadoop ב-Managed Service for Apache Spark).
- מחוץ ל- Google Cloud (מידע על דרישות ההגדרה הנוספות זמין במאמר יצירת פרופילים של אפליקציות שפועלות מחוץ ל- Google Cloud).
הפעלת Profiler API
לפני שמשתמשים בסוכן הפרופילים, צריך לוודא שממשק ה-Profiler API הבסיסי מופעל. אתם יכולים לבדוק את הסטטוס של ה-API ולהפעיל אותו אם צריך באמצעות Google Cloud CLI או Google Cloud המסוף:
CLI של gcloud
אם עדיין לא התקנתם את Google Cloud CLI בתחנת העבודה, תוכלו לעיין במסמכי Google Cloud CLI.
מריצים את הפקודה הבאה:
gcloud services enable cloudprofiler.googleapis.com
מידע נוסף זמין במאמר gcloud services.
מסוף Google Cloud
-
מפעילים את Cloud Profiler API.
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידים אם מוצג הכיתוב API enabled, סימן שממשק ה-API כבר מופעל. אם לא, לוחצים על הכפתור הפעלה.
הקצאת תפקיד IAM לחשבון שירות
אם אתם פורסים את האפליקציה במשאבים ב- Google Cloud ואתם משתמשים בחשבון השירות שמוגדר כברירת מחדל ולא שיניתם את ההרשאות שניתנו לחשבון השירות הזה, אתם יכולים לדלג על הקטע הזה.
אם אתם מבצעים אחת מהפעולות הבאות, אתם צריכים להקצות לחשבון השירות את תפקיד ה-IAM Cloud Profiler Agent (roles/cloudprofiler.agent):
- אתם משתמשים בחשבון השירות שמוגדר כברירת מחדל, אבל שיניתם את הרשאות התפקיד שלו.
- אתם משתמשים בחשבון שירות שנוצר על ידי משתמש.
- אם אתם משתמשים ב-Workload Identity, צריך להקצות את התפקיד Cloud Profiler Agent לחשבון השירות של Kubernetes.
אפשר להקצות תפקיד IAM לחשבון שירות באמצעות מסוףGoogle Cloud או Google Cloud CLI. לדוגמה, אפשר להשתמש בפקודה gcloud projects add-iam-policy-binding:
gcloud projects add-iam-policy-binding GCP_PROJECT_ID \
--member serviceAccount:MY_SVC_ACCT_ID@GCP_PROJECT_ID.iam.gserviceaccount.com \
--role roles/cloudprofiler.agent
לפני שמשתמשים בפקודה הקודמת, מחליפים את הערכים הבאים:
- GCP_PROJECT_ID: מזהה הפרויקט.
- MY_SVC_ACCT_ID: השם של חשבון השירות.
מידע מפורט זמין במאמר ניהול הגישה לפרויקטים, לתיקיות ולארגון.
התקנת סוכן Profiler
Compute Engine
יוצרים ספריית התקנה, למשל
/opt/cprof, בשביל הסוכן של Profiler:sudo mkdir -p /opt/cprofמורידים את הארכיון של הסוכן ממאגר
storage.googleapis.comומחלצים אותו לספריית ההתקנה:wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \ | sudo tar xzv -C /opt/cprof
GKE
משנים את Dockerfile כדי ליצור ספריית התקנה לסוכן Profiler, מורידים את קובץ הארכיון של הסוכן ומחלצים את קובץ הארכיון לספריית ההתקנה.
Linux (ספריית C שמבוססת על glibc):
משתמשים בפקודת ההתקנה הבאה:
RUN mkdir -p /opt/cprof && \
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
| tar xzv -C /opt/cprofLinux Alpine (ספריית C מבוססת musl):
משתמשים בפקודת ההתקנה הבאה:
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent_alpine.tar.gz \ | tar xzv -C /opt/cprof
סביבה גמישה
כשמשתמשים בתמונת הבסיס של זמן הריצה של Java 8 או בתמונת הבסיס של זמן הריצה של Java 9 / Jetty 9, סוכן Profiler מותקן מראש, כך שלא צריך לבצע שלבים נוספים כדי להתקין את הסוכן.
לכל שאר תמונות הבסיס, צריך להתקין את הסוכן. לדוגמה, הקובץ Dockerfile הבא מכיל את ההוראות לשימוש בתמונה openjdk:11-slim, להתקנת סוכן Profiler, והוא מגדיר את פרמטרים ברירת המחדל שישמשו להפעלת האפליקציה:
FROM openjdk:11-slim
COPY . .
RUN apt-get update \
&& apt-get install wget \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /opt/cprof && \
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \
| tar xzv -C /opt/cprof
CMD ["java", "-agentpath:/opt/cprof/profiler_java_agent.so=OPTION1,OPTION2", "-jar", "PATH_TO_YOUR_JAR_FILE"]
כדי להשתמש ב-Dockerfile בסביבה גמישה של App Engine, צריך לבצע את הפעולות הבאות:
- מחליפים את
OPTION1ואתOPTION2בערכים של הגדרת הסוכן שנדרשים לאפליקציה, ומחליפים אתPATH_TO_YOUR_JAR_FILEבנתיב לקובץ ה-JAR. - ממקמים את
Dockerfileבאותה ספריה שבה נמצא קובץapp.yaml. - משנים את הקובץ
app.yamlכדי לציין זמן ריצה בהתאמה אישית. מידע נוסף זמין במאמר בנושא יצירת סביבות זמן ריצה בהתאמה אישית.
סביבה רגילה
כשמשתמשים בסביבת זמן הריצה של Java, סוכן Profiler מותקן מראש, כך שלא צריך לבצע שלבים נוספים כדי להתקין את הסוכן.
ב-Java בגרסה 11 ואילך, הוא מותקן מראש ב-/opt/cprof.
מחוץ לארגון Google Cloud
יוצרים ספריית התקנה, למשל
/opt/cprof, עבור סוכן הפרופיל:sudo mkdir -p /opt/cprofמורידים את הארכיון של הסוכן ממאגר
storage.googleapis.comומחלצים אותו לספריית ההתקנה:wget -q -O- https://storage.googleapis.com/cloud-profiler/java/latest/profiler_java_agent.tar.gz \ | sudo tar xzv -C /opt/cprof
כדי להציג את כל הגרסאות של הסוכן שזמינות להורדה, מריצים את הפקודה הבאה:
gcloud storage ls gs://cloud-profiler/java/cloud-profiler-*
התגובה לפקודה אמורה להיראות כך:
gs://cloud-profiler/java/cloud-profiler-java-agent_20191014_RC00.tar.gz gs://cloud-profiler/java/cloud-profiler-java-agent_20191021_RC00.tar.gz gs://cloud-profiler/java/cloud-profiler-java-agent_20191028_RC00.tar.gz
כדי להוריד גרסה ספציפית של הסוכן, מעבירים את כתובת ה-URL שלה לפקודת ההורדה. לדוגמה, כדי להוריד את הסוכן שנבנה ב-28 באוקטובר 2019, משתמשים בהצהרה הבאה:
wget -q -O- https://storage.googleapis.com/cloud-profiler/java/cloud-profiler-java-agent_20191028_RC00.tar.gz \
| sudo tar xzv -C /opt/cprofהגרסה של הסוכן מתועדת במהלך האתחול שלו.
טעינת סוכן הפרופיל
כדי ליצור פרופיל של האפליקציה, מפעילים את Java כרגיל כדי להריץ את התוכנית, אבל מציינים את אפשרויות ההגדרה של הסוכן. מציינים את הנתיב לספריית הסוכן, ויכולים להעביר אפשרויות לספרייה.
בסביבה הרגילה של App Engine, הסוכן נטען ומוגדר באופן אוטומטי. כדי לקבל פרטים על הגדרת התוכנית והפעלתה, אפשר לדלג אל הפעלת התוכנית.
הגדרת הסוכן
כדי להגדיר את סוכן הפרופילים, צריך לכלול את הדגל -agentpath כשמפעילים את האפליקציה:
-agentpath:INSTALL_DIR/profiler_java_agent.so=OPTION1,OPTION2,OPTION3
בביטוי הזה, INSTALL_DIR הוא הנתיב לסוכן הפרופילים, ואילו OPTION1, OPTION2 ו-OPTION3 הן אפשרויות להגדרת הסוכן. לדוגמה, אם מחליפים את OPTION1 ב--cprof_service=myapp בביטוי הקודם, שם השירות יהיה myapp. אין הגבלה על מספר האפשרויות או על הסדר שלהן. אפשרויות ההגדרה הנתמכות מפורטות בטבלה הבאה:
| אפשרות לסוכן | תיאור |
|---|---|
-cprof_service
|
אם האפליקציה שלכם לא פועלת ב-App Engine, אתם צריכים להשתמש באפשרות ההגדרה הזו כדי להגדיר את שם השירות.
הגבלות על שמות שירותים מפורטות במאמר ארגומנטים של שם השירות והגרסה.
|
-cprof_service_version
|
כדי לנתח נתוני פרופילים באמצעות ממשק המשתמש של הכלי ליצירת פרופילים לפי גרסת השירות, משתמשים באפשרות הזו כדי להגדיר את הגרסה. הגבלות לגבי גרסאות מפורטות במאמר ארגומנטים של שם השירות והגרסה. |
-cprof_project_id
|
כשמריצים מחוץ ל- Google Cloud, משתמשים באפשרות הזו כדי לציין את מזהה הפרויקט של Google Cloud . מידע נוסף זמין במאמר בנושא יצירת פרופילים של אפליקציות שפועלות מחוץ ל- Google Cloud. |
-cprof_zone_name
|
כשהאפליקציה פועלת ב- Google Cloud, סוכן הפרופילים קובע את האזור באמצעות תקשורת עם שירות המטא-נתונים של Compute Engine. אם סוכן הפרופילים לא יכול לתקשר עם שירות המטא-נתונים, צריך להשתמש באפשרות הזו. |
-cprof_gce_metadata_server_retry_count-cprof_gce_metadata_server_retry_sleep_sec
|
שתי האפשרויות האלה מגדירות יחד את מדיניות הניסיון החוזר שסוכן הפרופילר משתמש בה כשהוא מתקשר עם שירות המטא-נתונים של Compute Engine.
כדי לאסוף את Google Cloud מזהה הפרויקט ופרטי האזור.
מדיניות ברירת המחדל היא לנסות שוב עד 3 פעמים, עם המתנה של שנייה אחת בין הניסיונות. המדיניות הזו מספיקה לרוב ההגדרות. |
-cprof_cpu_use_per_thread_timers
|
כדי לקבל פרופילים מדויקים ביותר של זמן המעבד, צריך להגדיר את האפשרות הזו כ-true. השימוש באפשרות הזו גורם לתקורה מוגברת לכל שרשור.
ערך ברירת המחדל הוא False. |
-cprof_force_debug_non_safepoints
|
כברירת מחדל, סוכן הפרופילים מאלץ את JVM ליצור מידע על ניפוי באגים לכל הקוד שנוצר בזמן אמת (JIT), בנוסף ליצירת מידע על ניפוי באגים לכל נקודות העצירה. התוצאה היא מידע מדויק יותר על המיקום ברמת הפונקציה והשורה לגבי זמן השימוש במעבד ופרופילי הערימה, אבל על חשבון תקורה נוספת של הסוכן. אפשר להשבית את יצירת מידע על תוצאות ניפוי הבאגים עבור קוד JIT על ידי הגדרת האפשרות הזו כ-false. ערך ברירת המחדל הוא True. |
-cprof_wall_num_threads_cutoff
|
כברירת מחדל, פרופילים של קירות לא נאספים אם המספר הכולל של השרשורים באפליקציה עולה על 4,096. ההגבלה הזו מבטיחה שבמהלך איסוף הפרופילים, העלות של מעבר על ערימת השרשורים תהיה מינימלית.
אם בדרך כלל יש בשירות שלכם יותר מ-4,096 תהליכים ואתם רוצים לאסוף נתוני פרופילים על חשבון תקורה נוספת, אתם יכולים להשתמש בדגל הזה כדי להגדיל את המגבלה. מגבלת ברירת המחדל היא 4,096 שרשורים. |
-cprof_enable_heap_sampling
|
כדי להפעיל את פרופיל ה-Heap ב-Java 11 ומעלה, מגדירים את-cprof_enable_heap_sampling=true.
אין תמיכה בפרופיל של ה-Heap ב-Java 10 ובגרסאות קודמות.כברירת מחדל, פרופיל ה-Heap מושבת. כשמפעילים את פרופיל הערימה, מרווח הדגימה מוגדר כברירת מחדל ל-512KiB. המרווח הזה מספיק לרוב האפליקציות, והוא גורם לתקורה של פחות מ-0.5% באפליקציה. מרווחי הדגימה הנתמכים הם מ-256 KiB (262144) עד 1024 KiB (1048576). לדוגמה, כדי להגדיר את מרווח הדגימה ל-256KiB, מה שמכפיל את קצב הדגימה, מוסיפים את אפשרות הסוכן: |
ארגומנטים של שם השירות והגרסה
כשאתם טוענים את סוכן Profiler, אתם מציינים ארגומנט של שם שירות וארגומנט אופציונלי של גרסת שירות כדי להגדיר אותו.
שם השירות מאפשר ל-Profiler לאסוף נתוני פרופילים של כל העותקים של השירות הזה. שירות הפרופיל מבטיח קצב איסוף של פרופיל אחד לדקה, בממוצע, לכל שם שירות בכל שילוב של גרסאות שירות ואזורים.
לדוגמה, אם יש לכם שירות עם שתי גרסאות שפועלות על פני רפליקות בשלושה אזורים, כלי הפרופיל ייצור בממוצע 6 פרופילים לדקה עבור השירות הזה.
אם משתמשים בשמות שירות שונים עבור העותקים, השירות ינותח בתדירות גבוהה מהנדרש, עם תקורה גבוהה יותר בהתאם.
כשבוחרים שם שירות:
בוחרים שם שמייצג בבירור את השירות בארכיטקטורת האפליקציה. בחירת שם השירות פחות חשובה אם מריצים רק שירות או אפליקציה אחת. היא חשובה יותר אם האפליקציה שלכם פועלת כקבוצה של מיקרו-שירותים, למשל.
חשוב לוודא שלא משתמשים במחרוזת של שם השירות בערכים שספציפיים לתהליך, כמו מזהה תהליך.
מחרוזת service-name חייבת להתאים לביטוי הרגולרי הזה:
^[a-z0-9]([-a-z0-9_.]{0,253}[a-z0-9])?$
הנחיה טובה היא להשתמש במחרוזת סטטית כמו imageproc-service בתור שם השירות.
המאפיין גרסת השירות הוא אופציונלי. אם מציינים את גרסת השירות, Profiler יכול לצבור מידע על פרופילים מכמה מופעים ולהציג אותו בצורה נכונה. אפשר להשתמש בו כדי לסמן גרסאות שונות של השירותים שלכם בזמן הפריסה שלהן. בממשק המשתמש של Profiler אפשר לסנן את הנתונים לפי גרסת השירות, וכך להשוות את הביצועים של גרסאות קוד ישנות וחדשות.
הערך של הארגומנט service-version הוא מחרוזת חופשית, אבל הערכים של הארגומנט הזה בדרך כלל נראים כמו מספרי גרסאות, למשל, 1.0.0 או 2.1.2.
התחלת הצפייה בתוכנית
Compute Engine
מפעילים את Java כרגיל כדי להריץ את התוכנית, ומוסיפים את האפשרויות להגדרת הסוכן:
java \
-agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp,-cprof_service_version=1.0.0 \
JAVA_OPTIONS -jar PATH_TO_YOUR_JAR_FILE PROGRAM_OPTIONSGKE
משנים את קובץ ה-Dockerfile של מאגר השירות כדי להפעיל את Java כמו שמפעילים בדרך כלל את התוכנית, ומוסיפים את אפשרויות ההגדרה של הסוכן:
CMD ["java", \
"-agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp,-cprof_service_version=1.0.0", \
"-jar", "PATH_TO_YOUR_JAR_FILE" ]
סביבה גמישה
משנים את קובץ התצורה app.yaml כדי להגדיר את משתנה הסביבה PROFILER_ENABLE. לאחר מכן, מתחילים לצפות בתוכנית כרגיל:
env_variables:
PROFILER_ENABLE: trueמידע נוסף זמין במאמר הגדרת משתני סביבה.
סביבה רגילה
סביבת זמן ריצה של Java 21
אם אתם לא משתמשים בחבילות שירות מדור קודם, אתם יכולים להפעיל את איסוף נתוני הפרופיל על ידי שינוי הקובץ app.yaml כדי לציין את הדגל agentpath באחת מהשיטות הבאות:
-
מגדירים את משתנה הסביבה
JAVA_TOOL_OPTIONS:runtime: java21 env_variables: JAVA_TOOL_OPTIONS: "-agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true" -
מציינים את
agentpathבאמצעות הרכיבentrypoint:runtime: java21 entrypoint: java \ -agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true \ Main.java
אם אתם משתמשים בחבילות שירות מדור קודם, אתם יכולים להפעיל את איסוף הנתונים של פרופילר על ידי שינוי הקובץ appengine-web.xml כדי לציין את הדגל agentpath באחת מהשיטות הבאות:
-
מגדירים את משתנה הסביבה
JAVA_USER_OPTS:<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <env-variables> <env-var name="JAVA_USER_OPTS" value="-agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true" /> </env-variables> </appengine-web-app>
-
מגדירים את משתנה הסביבה
CPROF_ENABLE:<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <env-variables> <env-var name="CPROF_ENABLE" value="-agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true" /> </env-variables> </appengine-web-app>
-
מציינים את
agentpathבאמצעות הרכיבentrypoint:<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <entrypoint> java -agentpath:/opt/cprof/profiler_java_agent.so=-logtostderr,-cprof_enable_heap_sampling=true </entrypoint> </appengine-web-app>
אם מגדירים סוג פרופיל חדש לאיסוף, חשוב לציין גרסה חדשה של השירות כשפורסים את האפליקציה. מידע נוסף זמין במאמר למה אין לי נתונים לגבי סוג פרופיל ספציפי?
רישום ביומן של סוכנים
סוכן הפרופילים יכול לדווח על פרטי רישום ביומן עבור סביבה גמישה של App Engine, Compute Engine ו-GKE. הסוכן ליצירת פרופילים תומך ברמות הרישום הבאות ביומן:
-
0: רישום כל ההודעות ביומן. רמת רישום ביומן שמוגדרת כברירת מחדל. -
1: רישום אזהרות, שגיאות והודעות קריטיות ביומן. -
2: רישום שגיאות והודעות קריטיות ביומן. -
3: רישום רק של הודעות קריטיות והפסקת האפליקציה.
כדי להפעיל כתיבת יומנים לשגיאה רגילה עם רמת הרישום ביומן שמוגדרת כברירת מחדל, מוסיפים -logtostderr להגדרה -agentpath.
כדי להגדיר את רמת הרישום ביומן כך שיירשמו רק הודעות שגיאה והודעות קריטיות,
מוסיפים את -minloglevel=2 להגדרה של -agentpath.
לדוגמה, כדי להפעיל רישום ביומן של הודעות שגיאה והודעות קריטיות בשגיאה רגילה, מוסיפים את -logtostderr ואת ‑minloglevel=2 להגדרה -agentpath:
java -agentpath:/opt/cprof/profiler_java_agent.so=-cprof_service=myapp,-logtostderr,-minloglevel=2 \
-jar myApp.jar
פתרון בעיות
בקטע הזה מפורטות בעיות שספציפיות לפרופילים של אפליקציות Java. אפשר לקבל עזרה בפתרון בעיות נפוצות במאמר בנושא פתרון בעיות.
| התנהגות | מטרה | פתרון |
|---|---|---|
| הפעלתם כמה כלי פרופיל של ערימה ואין לכם נתוני פרופיל. | שימוש בו-זמני בכמה כלי פרופיל של ערימה משבית את כל התמיכה בפרופיל של ערימה ב-Java. זוהי מגבלה של JVM. | מפעילים כלי אחד לניתוח ביצועים. |
הפעלה עם Linux Alpine
הסוכן לניתוח פרופילים של Java ל-Linux Alpine נתמך רק בהגדרות של Google Kubernetes Engine.
כדי להתקין את סוכן פרופיל ה-Java העדכני ל-Linux Alpine, אפשר לעיין במאמר בנושא התקנת סוכן הפרופיל.שגיאת אימות
אם אתם משתמשים בתמונות Docker שפועלות עם Linux Alpine (כמו golang:alpine או רק alpine), יכול להיות שתופיע שגיאת האימות הבאה:
connection error: desc = "transport: authentication handshake failed: x509: failed to load system roots and no roots provided"
שימו לב: כדי לראות את השגיאה, צריך להפעיל את רישום הפעולות של הסוכן.
השגיאה מציינת שבתמונות Docker עם Linux Alpine לא מותקנים אישורי ה-SSL של הבסיס כברירת מחדל. האישורים האלה נחוצים כדי שהסוכן ליצירת פרופילים יוכל לתקשר עם ה-API של הכלי ליצירת פרופילים. כדי לפתור את השגיאה, מוסיפים את הפקודה apk הבאה לקובץ Dockerfile:
FROM alpine
...
RUN apk add --no-cache ca-certificates
לאחר מכן צריך לבנות מחדש את האפליקציה ולפרוס אותה מחדש.
המאמרים הבאים
- בחירת הפרופילים לניתוח
- איך משתמשים בתרשים להבות
- סינון תרשים הלהבות
- התמקדות בתרשים להבות
- השוואה בין פרופילים