זוהי הפקודה trace-cmd-record שניתן להריץ בספק האירוח החינמי של OnWorks באמצעות אחת מתחנות העבודה המקוונות החינמיות שלנו, כגון Ubuntu Online, Fedora Online, אמולטור מקוון של Windows או אמולטור מקוון של MAC OS.
תָכְנִית:
שֵׁם
trace-cmd-record - רישום מעקב מהמעקב הפנימי של Ftrace לינוקס
תַקצִיר
trace-cmd שיא [אפשרויות] [הפקודה]
תיאור
השמיים trace-cmd(1) פקודת record תגדיר את מעקב הליבה של Ftrace לינוקס כדי להקליט את
תוספים או אירועים ספציפיים שקורים בזמן הפקודה מבוצע. אם לא ניתנת פקודה
נתון, אז הוא יקליט עד שהמשתמש ילחץ על Ctrl-C.
פקודת ה-record של trace-cmd תגדיר את מעקב ה-Ftrace להתחיל לעקוב אחר ה- השונות
אירועים או תוספים שניתנים בשורת הפקודה. לאחר מכן זה ייצור מספר של
תהליכי מעקב (אחד לכל מעבד) שיתחילו להקליט ממאגר טבעת הליבה
ישירות לתוך קבצים זמניים. לאחר השלמת הפקודה (או לחיצה על Ctrl-C) כל הקבצים
הקבצים ישולבו לקובץ trace.dat שניתן יהיה לקרוא אותו מאוחר יותר (ראה
trace-cmd-report(1)).
אפשרויות
-p חיבור
ציין תוסף מעקב. תוספים הם מעקבי Ftrace מיוחדים שבדרך כלל עושים יותר מ...
פשוט עקוב אחר אירוע. תוספים נפוצים הם פונקציה, גרף_פונקציה, preemptirqsoff,
אירקסוף, מקדימה, ו תתעוררתוסף חייב להיות נתמך על ידי הליבה הפועלת.
ראה רשימה של תוספים זמינים, ראה trace-cmd-list(1).
-e אירוע
ציין אירוע למעקב. נקודות מעקב סטטיות שונות נוספו למערכת ההפעלה לינוקס.
ליבה. הם מקובצים לפי תת-מערכת שבה ניתן להפעיל את כל האירועים של מערכת נתונה
תת-מערכת או לציין אירועים ספציפיים שיופעלו. אירוע הוא מהפורמט
"subsystem:event-name". ניתן גם פשוט לציין את תת-המערכת ללא ה-
שם-אירוע או שם האירוע ללא "subsystem:". שימוש ב-"-e sched_switch" יגרום
הפעל את האירוע "sched_switch" כאשר, "-e sched" יאפשר את כל האירועים תחת
תת-מערכת "לוח זמנים".
ה-'event' יכול להכיל גם ביטויים גלובליים. כלומר, "*stat*" יעשה זאת.
בחר את כל האירועים (או תת-המערכות) שיש בהם את התווים "stat"
שמות.
ניתן להשתמש במילת המפתח 'all' כדי להפעיל את כל האירועים.
-a
לכל אירוע שמוקלט יש קובץ פורמט פלט שנשמר בקובץ הפלט.
כדי שיוכל להציג אותו מאוחר יותר. אבל אם אירועים אחרים מופעלים במעקב ללא
הידע של trace-cmd, הפורמטים של אירועים אלה לא יירשמו ו- trace-cmd
הדוח לא יוכל להציג אותם. אם זהו המקרה, ציין את -a
האפשרות והפורמט של כל האירועים במערכת יישמרו.
-T
הפעל מעקב מחסנית (stacktrace) בכל אירוע. לדוגמה:
-0 [003] 58549.289091: sched_switch: kworker/0:1:0 [120] R ==> trace-cmd:2603 [120]
-0 [003] 58549.289092: מחסנית_הגרעין:
=> לוח זמנים (ffffffff814b260e)
=> cpu_idle (ffffffff8100a38c)
=> התחלה_משנית (ffffffff814ab828)
--func-stack
הפעל מעקב מחסנית בכל הפונקציות. שים לב שזה חל רק על ה"פונקציה"
מעקב אחר תוסף, וייכנס לתוקף רק אם נעשה שימוש באפשרות -l ותצליח
פונקציות מגבילות. אם מעקב הפונקציות אינו מסונן, ומעקב המחסנית הוא
מופעל, ניתן לנעול את המכונה בזמן אמת.
-f לסנן
ציין מסנן עבור האירוע הקודם. זה חייב לבוא אחרי -eפעולה זו תסנן
אילו אירועים מוקלטים בהתבסס על תוכן האירוע. הסינון מועבר ל
ישירות מהגרעין, כך איזה סינון מותר עשוי להיות תלוי בגירסת הגרעין
יש לך. בעיקרון, זה יאפשר לך להשתמש בסימון C כדי לבדוק אם אירוע צריך להיות
מעובד או לא.
==, >=, <=, >, <, &, |, && ו- ||
בדרך כלל בטוח להשתמש באמור לעיל כדי להשוות שדות.
-R להפעיל
ציין טריגר לאירוע הקודם. זה חייב להתרחש לאחר -eזה יוסיף
טריגר נתון לאירוע הנתון. כדי להפעיל רק את הטריגר ולא את האירוע עצמו,
לאחר מכן מקם את האירוע לאחר ה- -v אוֹפְּצִיָה.
ראה Documentation/trace/events.txt בקוד המקור של ליבת לינוקס למידע נוסף.
מידע על טריגרים.
-v
פעולה זו יגרום לכך שכל האירועים שצוינו לאחר מכן בשורת הפקודה לא יהיו עקבים.
זה שימושי לבחירת תת-מערכת למעקב אך להשמיט אירועים שונים.
לדוגמה: "-e sched -v -e "*stat\*"" יאפשר את כל האירועים בתת-המערכת sched.
חוץ מאלה שיש להם "stat" בשמם.
הערה: האפשרות *-v* נלקחה מהדרך grep(1) הופך את הדברים הבאים
גפרורים.
-F
פעולה זו תסנן רק את קובץ ההפעלה שניתן בשורת הפקודה. אם אין פקודה
ניתן, אז הוא יסנן את עצמו (די חסר טעם). שימוש -F יאפשר לך לעקוב
רק אירועים שנגרמו על ידי הפקודה הנתונה.
-P PID
דומה -F אבל מאפשר לך לציין מזהה תהליך למעקב.
-c
בשימוש עם אחד מהם -F כדי לעקוב אחר התהליך גם אחרי ילדיו.
-C שָׁעוֹן
הגדר את שעון המעקב ל"שעון".
השתמש trace-cmd(1) הקלידו -C כדי לראות אילו שעונים זמינים.
-o קובץ פלט
כברירת מחדל, דוח trace-cmd ייצור trace.dat קובץ. ניתן לציין קובץ אחר
קובץ לכתוב אליו עם -o אוֹפְּצִיָה.
-l שם פונקציה
זה יגביל את פונקציה ו גרף_פונקציה נותבי מעקב רק אחר הנתון
שם פונקציה. יותר מאחד -l ניתן לציין בשורת הפקודה כדי לעקוב אחר עוד
יותר מפונקציה אחת. מותר גם שימוש מוגבל בביטויי גלובל. אלה הם
לְהַתְאִים* לסנן רק פונקציות שמתחילות ב- להתאים. *לְהַתְאִים רק לסנן
פונקציות המסתיימות ב- להתאים. *לְהַתְאִים\* לסנן רק פונקציות שמכילות
להתאים.
-g שם פונקציה
אפשרות זו מיועדת לתוסף function_graph. היא תציג גרף של הפונקציה הנתונה.
כלומר, הוא יעקוב רק אחר הפונקציה וכל הפונקציות שהוא קורא להן. אתה יכול לקבל עוד
מאחד -g בשורת הפקודה.
-n שם פונקציה
יש לכך השפעה הפוכה של -lהפונקציה הנתונה עם ה- -n האפשרות לא תהיה
עקבות. זה מקבל עדיפות, כלומר, אם אתה כולל את אותה פונקציה עבור שניהם -n
ו -l, זה לא יהיה ניתן לאתר.
-d
חלק מתוספי המעקב מפעילים את הפונקציה מעקב כברירת מחדל. כמו מעקבי ההשהיה.
אפשרות זו מונעת את הפעלת מעקב הפונקציות בעת ההפעלה.
-D
האפשרות -d אנסה להשתמש באפשרות function-trace כדי להשבית את מעקב הפונקציות
(אם זמין), אחרת ברירת המחדל היא קובץ proc:
/proc/sys/kernel/ftrace_enabled, אבל לא ייגע בו אם אפשרות ה-function-trace היא
זמין. ה -D האפשרות תבטל גם את קובץ ה-proc ftrace_enabled וגם את ה-
אפשרות function-trace אם היא קיימת.
שימו לב, מעקב אחר פונקציות זה מבטל עבור כל המשתמשים, כולל משתמשים
מחוץ למעקבי ftrace (stack_tracer, perf וכו').
-O אוֹפְּצִיָה
ל-Ftrace יש מגוון אפשרויות שניתן להפעיל או להשבית. זה מאפשר לך להגדיר
אותם. הוספת הטקסט לא אפשרות מבטלת אותה. לדוגמה: "-O nograph-time"
יבטל את אפשרות ה-Ftrace של "זמן גרף".
-s הפסקה
התהליכים ש-trace-cmd יוצר כדי להקליט ממאגר הטבעת צריכים להתעורר ל-
בצע את ההקלטה. הגדרת ה הפסקה לאפס יגרום לתהליכים להתעורר
בכל פעם שנכתבים נתונים חדשים לתוך המאגר. אבל מכיוון ש-Ftrace מקליט את הליבה
פעילות, פעולת תהליכים אלה, חזרה לשינה, עלולה לגרום לאירועים חדשים ב
מאגר טבעתי אשר יעיר את התהליך מחדש. פעולה זו תוסיף נתונים נוספים שלא לצורך
לתוך חיץ הטבעת.
מדד ה'מרווח' הוא מיקרו-שניות. ברירת המחדל היא 1000 (1 אלפיות שנייה).
זהו הזמן שבו כל תהליך הקלטה יישן לפני שהוא מתעורר
להקליט כל נתונים חדשים שנכתבו למאגר הטבעת.
-r עדיפות
העדיפות להפעלת הליכי הלכידה. במערכת עמוסה, לכידת העקבות
ייתכן ששרשורים יעברו עצירה ואירועים יאבדו. זה מעלה את העדיפות של אלה.
הליכים לעדיפות בזמן אמת (FIFO). אבל השתמשו באפשרות זו בזהירות, היא יכולה גם
לשנות את התנהגות המערכת הנבדקת.
-b גודל
פעולה זו מגדירה את גודל מאגר הטבעת ל גודל קילובייט. מכיוון שמאגר הטבעת Ftrace הוא
לכל מעבד, גודל זה הוא גודל כל מאגר טבעת לכל מעבד בתוך הליבה.
"-b 10000" במחשב עם 4 מעבדים יגרום ל-Ftrace להיות בעל גודל מאגר כולל של 40
מגס.
-B שם חיץ
אם הליבה תומכת במספר מאגרים, פעולה זו תוסיף מאגר בשם הנתון.
אם שם המאגר כבר קיים, המאגר פשוט מאופס ולא יימחק
בסוף ביצוע הרשומה. אם נוצר המאגר, הוא יוסר ב
סוף הביצוע (אלא אם כן -k מוגדר, או התחלה נעשה שימוש בפקודה).
לאחר קביעת שם למאגר, כל האירועים שנוספו לאחר מכן ייחשבו
משויך למאגר זה. אם לא צוין מאגר, או אירוע
מצוין לפני שם מאגר, הוא ישויך ל-
מאגר ראשי (ברמה העליונה).
trace-cmd record -e sched -B block -e block -B time -e timer sleep 1
האמור לעיל יאפשר את כל אירועי התכנון במאגר הראשי. זה יאפשר
לאחר מכן צור מופע של מאגר 'בלוק' והפעל את כל אירועי הבלוק בתוכו
מאגר זה. נוצר מופע מאגר 'זמן' וכל אירועי הטיימר
יופעל עבור אירוע זה.
-m גודל
הגודל המרבי בקילובייטים שצריך להיות למאגר לכל מעבד. שימו לב, עקב עיגול ל
גודל העמוד, ייתכן שהמספר אינו מדויק לחלוטין. כמו כן, הדבר מבוצע על ידי החלפת
בין שני מאגרים שהם חצי מהגודל הנתון, כך שהפלט לא בהכרח יהיה של ה-
גודל נתון גם אם נכתב הרבה יותר.
השתמש בזה כדי למנוע חוסר שטח דיסק לצורך ריצות ארוכות.
-M cpumask
הגדר את cpumask עבור כדי לעקוב. זה משפיע רק על מופע המאגר האחרון שניתן אם.
המסופק לפני כל מופע של מאגר, אז זה משפיע על המאגר הראשי. הערך
המספר המסופק חייב להיות מספר הקסדצימלי.
trace-cmd record -p function -M c -B events13 -e all -M 5
אם ה-M- לא מופיע, המסכה נשארת זהה. כדי להפעיל את כל
מעבדים, מעבירים ערך של '-1'.
-k
כברירת מחדל, כאשר trace-cmd מסיים את המעקב, הוא יאפס את המאגרים ויבטל
כל המעקב שהוא הפעיל. אפשרות זו מונעת מ-trace-cmd להשבית את המעקב
ואיפוס המאגר. אפשרות זו שימושית לאיתור באגים ב- trace-cmd.
הערה: בדרך כלל trace-cmd יחזיר את קובץ ה-"tracing_on" למצבו המקורי.
היה לפני שהוא נקרא. אפשרות זו תשאיר את הקובץ הזה כאפס.
-i
כברירת מחדל, אם מופיע אירוע ש-trace-cmd לא מוצא, הוא ייסגר עם
שגיאה. אפשרות זו פשוט תתעלם מאירועים המופיעים בשורת הפקודה אך הם
לא נמצא במערכת.
-N מארח: נמל
אם מכונה אחרת מפעילה את "trace-cmd listen", אפשרות זו משמשת לאיסוף הנתונים.
נשלחים למכונה זו עם חבילות UDP. במקום לכתוב לקובץ פלט, הנתונים
נשלח לקופסה מרוחקת. זה אידיאלי עבור מכונות משובצות עם מעט אחסון,
או שיהיה לך מכונה אחת שתשמור את כל הנתונים במאגר אחד.
הערה: אפשרות זו אינה נתמכת עם תוספים של מעקב אחר השהייה:
התעוררות, התעוררות_rt, irqsoff, preemptoff ו- preemptirqsoff
-t
אפשרות זו משמשת עם -N, כאשר יש צורך לשלוח את הנתונים בזמן אמת באמצעות TCP
חבילות במקום UDP. למרות ש-TCP אינו מהיר כמעט כמו שליחת חבילות UDP,
אבל זה עשוי להיות נחוץ אם הרשת אינה אמינה כל כך, כמות הנתונים אינה
אינטנסיבי כל כך, ונדרשת ערובה שכל המידע שעקבו אחריו יועבר
בְּהַצלָחָה.
--תַאֲרִיך
עם --תַאֲרִיך האפשרות "trace-cmd" תכתוב חותמות זמן לתוך מאגר המעקב לאחר
הוא סיים להקליט. לאחר מכן הוא ימפה את חותמת הזמן ל-gettimeofday, מה שיעשה
לאפשר פלט זמן קיר מחותמות הזמן שקוראות את שנוצר trace.dat קובץ.
--פּרוֹפִיל
עם --פּרוֹפִיל האפשרות "trace-cmd" תאפשר מעקב שניתן להשתמש בו עם
trace-cmd-report(1) אפשרות --profile. אם מעקב -p אינו מוגדר, וגרף הפונקציה
אם depth נתמך על ידי הליבה, אז מעקב הפונקציה function_graph יופעל עם
עומק של אחד (הצג רק היכן מרחב המשתמשים נכנס לגרעין). זה גם יאפשר
נקודות מעקב שונות עם מעקב אחר מחסניות כך שהדוח יכול להראות היכן משימות בוצעו
נחסם למשך זמן רב ביותר.
לִרְאוֹת פרופיל-cmd-trace(1) לפרטים נוספים ודוגמאות.
-H ווים לאירועים
הוסף התאמת אירועים מותאמת אישית כדי לחבר שני אירועים יחד. כאשר לא בשימוש עם
--פּרוֹפִיל, זה ישמור את הפרמטר וזה ישמש את trace-cmd report
--גם פרופיל. כלומר:
רשומת trace-cmd -H hrtimer_expire_entry,hrtimer/hrtimer_expire_exit,hrtimer,sp
דוח מעקב-cmd --פרופיל
יציג פרופיל של זמני hrtimer_expire_entry ו-hrtimer_expire_ext.
לִרְאוֹת פרופיל-cmd-trace(1) לפורמט.
--סטדרר
הפלט יעבור ל-stderr במקום ל-stdout, אך הפלט של הפקודה יבוצע
לא ישתנה. זה שימושי אם ברצונך לנטר את הפלט של הפקודה
מבוצע, אך לא רואה את הפלט מ- trace-cmd.
דוגמאות
הדרך הבסיסית לעקוב אחר כל האירועים:
# trace-cmd record -e all ls > /dev/null
# דוח trace-cmd
trace-cmd-13541 [003] 106260.693809: filemap_fault: כתובת=0x128122 קיזוז=0xce
trace-cmd-13543 [001] 106260.693809: kmalloc: call_site=81128dd4 ptr=0xffff88003dd83800 bytes_req=768 bytes_alloc=1024 gfp_flags=GFP_KERNEL|GFP_ZERO
ls-13545 [002] 106260.693809: kfree: call_site=810a7abb ptr=0x0
ls-13545 [002] 106260.693818: sys_exit_write: 0x1
כדי להשתמש במעקב הפונקציות עם מעקב אחר מתגים לפי לוח זמנים:
# trace-cmd record -p function -e sched_switch ls > /dev/null
# דוח trace-cmd
ls-13587 [002] 106467.860310: פונקציה: hrtick_start_fair <-- pick_next_task_fair
ls-13587 [002] 106467.860313: sched_switch: prev_comm=מעקב-cmd prev_pid=13587 prev_prio=120 prev_state=R ==> next_comm=מעקב-cmd next_pid=13583 next_prio=120
trace-cmd-13585 [001] 106467.860314: פונקציה: native_set_pte_at <-- __do_fault
trace-cmd-13586 [003] 106467.860314: פונקציה: up_read <-- do_page_fault
ls-13587 [002] 106467.860317: פונקציה: __phys_addr <-- לוח זמנים
trace-cmd-13585 [001] 106467.860318: פונקציה: _raw_spin_unlock <-- __do_fault
ls-13587 [002] 106467.860320: פונקציה: native_load_sp0 <-- __switch_to
trace-cmd-13586 [003] 106467.860322: פונקציה: down_read_trylock <-- do_page_fault
הנה דרך נחמדה למצוא אילו פסיקות בעלות ההשהיה הגבוהה ביותר:
# trace-cmd record -p function_graph -e irq_handler_entry -l do_IRQ sleep 10
# דוח trace-cmd
-0 [000] 157412.933969: פונקציה_הערה_של_IRQ: | do_IRQ() {
-0 [000] 157412.933974: irq_handler_entry: irq=48 name=eth0
-0 [000] 157412.934004: funcgraph_exit: + 36.358 us | }
-0 [000] 157413.895004: פונקציה_הערה_של_IRQ: | do_IRQ() {
-0 [000] 157413.895011: irq_handler_entry: irq=48 name=eth0
-0 [000] 157413.895026: funcgraph_exit: + 24.014 us | }
-0 [000] 157415.891762: פונקציה_הערה_של_IRQ: | do_IRQ() {
-0 [000] 157415.891769: irq_handler_entry: irq=48 name=eth0
-0 [000] 157415.891784: funcgraph_exit: + 22.928 us | }
-0 [000] 157415.934869: פונקציה_הערה_של_IRQ: | do_IRQ() {
-0 [000] 157415.934874: irq_handler_entry: irq=48 name=eth0
-0 [000] 157415.934906: funcgraph_exit: + 37.512 us | }
-0 [000] 157417.888373: פונקציה_הערה_של_IRQ: | do_IRQ() {
-0 [000] 157417.888381: irq_handler_entry: irq=48 name=eth0
-0 [000] 157417.888398: funcgraph_exit: + 25.943 us | }
דוגמה לפרופיל:
# trace-cmd record --profile sleep 1
# דוח trace-cmd --profile --comm שינה
משימה: שינה-21611
אירוע: sched_switch:R (1) סה"כ: 99442 ממוצע: 99442 מקסימום: 99442 מינימום: 99442
1 סך הכל:99442 דקות:99442 מקסימום:99442 ממוצע=99442
=> ftrace_raw_event_sched_switch (0xffffffff8105f812)
=> __לוח זמנים (0xffffffff8150810a)
=> preempt_schedule (0xffffffff8150842e)
=> ___לוח_זמנים_לאחר_הקדמה (0xffffffff81273354)
=> cpu_stop_queue_work (0xffffffff810b03c5)
=> stop_one_cpu (0xffffffff810b063b)
=> sched_exec (0xffffffff8106136d)
=> do_execve_common.isra.27 (0xffffffff81148c89)
=> do_execve (0xffffffff811490b0)
=> SyS_execve (0xffffffff811492c4)
=> return_to_handler (0xffffffff8150e3c8)
=> stub_execve (0xffffffff8150c699)
אירוע: sched_switch:S (1) סה"כ: 1000506680 ממוצע: 1000506680 מקסימום: 1000506680 מינימום: 1000506680
1 סך הכל:1000506680 דקות:1000506680 מקסימום:1000506680 ממוצע=1000506680
=> ftrace_raw_event_sched_switch (0xffffffff8105f812)
=> __לוח זמנים (0xffffffff8150810a)
=> לוח זמנים (0xffffffff815084b8)
=> do_nanosleep (0xffffffff8150b22c)
=> hrtimer_nanosleep (0xffffffff8108d647)
=> SyS_nanosleep (0xffffffff8108d72c)
=> return_to_handler (0xffffffff8150e3c8)
=> tracesys_phase2 (0xffffffff8150c304)
אירוע: sched_wakeup:21611 (1) סה"כ: 30326 ממוצע: 30326 מקסימום: 30326 מינימום: 30326
1 סך הכל:30326 דקות:30326 מקסימום:30326 ממוצע=30326
=> תבנית_התעוררות_משוער_ל_אירוע_משוער_(0xffffffff8105f653)
=> ttwu_do_wakeup (0xffffffff810606eb)
=> ttwu_do_activate.constprop.124 (0xffffffff810607c8)
=> נסה_להעיר_את_העיר (0xffffffff8106340a)
השתמש ב-trace-cmd-record באופן מקוון באמצעות שירותי onworks.net