Aceasta este comanda trace-cmd-record care poate fi rulată în furnizorul de găzduire gratuit OnWorks folosind una dintre multiplele noastre stații de lucru online gratuite, cum ar fi Ubuntu Online, Fedora Online, emulator online Windows sau emulator online MAC OS
PROGRAM:
NUME
trace-cmd-record - înregistrați o urmă din trasatorul intern Ftrace Linux
REZUMAT
urmă-cmd record [OPŢIUNI] [comandă]
DESCRIERE
urmă-cmd(1) Comanda de înregistrare va configura instrumentul de urmărire a nucleului Ftrace Linux pentru a înregistra
plugin-uri sau evenimente specificate care au loc în timp ce comandă execută. Dacă nicio comandă nu este
dat, apoi va înregistra până când utilizatorul apasă Ctrl-C.
Comanda de înregistrare a trace-cmd va configura trasarea Ftrace pentru a începe urmărirea diferitelor
evenimente sau pluginuri care sunt date pe linia de comandă. Va crea apoi un număr de
procesele de urmărire (unul per CPU) care vor începe înregistrarea din buffer-ul inelului kernelului
direct în fișiere temporare. Când comanda este completă (sau este apăsat Ctrl-C) toate
fișierele vor fi combinate într-un fișier trace.dat care poate fi citit ulterior (vezi
trace-cmd-report(1)).
OPŢIUNI
-p conecteaza
Specificați un plugin de urmărire. Pluginurile sunt trasoare speciale Ftrace care de obicei fac mai mult decât
doar urmăriți un eveniment. Pluginurile comune sunt funcţie, function_graph, preemptirqsoff,
irqsoff, preemptoff și trezește-te. Un plugin trebuie să fie suportat de nucleul care rulează. La
vezi o listă de pluginuri disponibile, vezi trace-cmd-list(1).
-e eveniment
Specificați un eveniment de urmărit. Diverse puncte de urmărire statice au fost adăugate la Linux
nucleu. Ele sunt grupate pe subsistem unde puteți activa toate evenimentele unui anumit
subsistem sau specificați evenimente specifice care urmează să fie activate. The eveniment este de format
„subsistem:nume-eveniment”. De asemenea, puteți specifica doar subsistemul fără
:numele evenimentului sau numele evenimentului fără „subsistemul:”. Folosind „-e sched_switch” va
activați evenimentul „sched_switch”, în cazul în care „-e sched” va activa toate evenimentele din
subsistem „programat”.
„Evenimentul” poate conține și expresii glob. Adică „*stat*” va
selectați toate evenimentele (sau subsistemele) care au caracterele „stat” în ele
nume.
Cuvântul cheie „toate” poate fi folosit pentru a activa toate evenimentele.
-a
Fiecare eveniment care este înregistrat are fișierul în format de ieșire salvat în fișierul de ieșire
pentru a-l putea afișa mai târziu. Dar dacă alte evenimente sunt activate în urmă fără
cunoștințele trace-cmd, formatele acelor evenimente nu vor fi înregistrate și trace-cmd
raportul nu le va putea afișa. Dacă acesta este cazul, atunci specificați -a
opțiunea și formatul pentru toate evenimentele din sistem vor fi salvate.
-T
Activați un stacktrace pentru fiecare eveniment. De exemplu:
-0 [003] 58549.289091: sched_switch: kworker/0:1:0 [120] R ==> trace-cmd:2603 [120]
-0 [003] 58549.289092: kernel_stack:
=> program (ffffffff814b260e)
=> cpu_idle (ffffffff8100a38c)
=> start_secundar (ffffffff814ab828)
--func-stack
Activați o urmărire a stivei pentru toate funcțiile. Rețineți că acest lucru este valabil numai pentru „funcție”
plugin tracer și va avea efect numai dacă opțiunea -l este utilizată și reușește
funcții de limitare. Dacă funcția de urmărire nu este filtrată, iar urmărirea stivei este
activat, puteți bloca automat mașina.
-f filtru
Specificați un filtru pentru evenimentul anterior. Aceasta trebuie să vină după o -e. Aceasta se va filtra
ce evenimente sunt înregistrate pe baza conținutului evenimentului. Filtrarea este transmisă la
nucleul direct, astfel încât ce filtrare este permisă poate depinde de ce versiune a nucleului
aveți. Practic, vă va permite să utilizați notația C pentru a verifica dacă un eveniment ar trebui să fie
prelucrate sau nu.
==, >=, <=, >, <, &, |, && și ||
Cele de mai sus sunt de obicei sigure de utilizat pentru a compara câmpuri.
-R declanşa
Specificați un declanșator pentru evenimentul anterior. Aceasta trebuie să vină după o -e. Aceasta va adăuga un
declanșator dat pentru evenimentul dat. Pentru a activa doar declanșatorul și nu evenimentul în sine,
apoi plasați evenimentul după -v opțiune.
Consultați Documentation/trace/events.txt în sursa kernel-ului Linux pentru mai multe
informații despre declanșatoare.
-v
Acest lucru va face ca toate evenimentele specificate după el pe linia de comandă să nu fie urmărite.
Acest lucru este util pentru selectarea unui subsistem de urmărit, dar pentru a omite diverse evenimente.
De exemplu: "-e sched -v -e "*stat\*"" va activa toate evenimentele din subsistemul sched
cu excepția celor care au „stat” în nume.
Notă: opțiunea *-v* a fost luată din drum grep(1) inversează următoarele
chibrituri.
-F
Aceasta va filtra numai executabilul care este dat pe linia de comandă. Dacă nu există comandă
este dat, apoi se va filtra singur (destul de inutil). Folosind -F vă va lăsa să urmăriți
numai evenimentele care sunt cauzate de comanda dată.
-P pid
similar -F dar vă permite să specificați un ID de proces de urmărit.
-c
Folosit cu oricare -F pentru a urmări și copiii procesului.
-C ceas
Setați ceasul de urmărire la „ceas”.
Utilizare urmă-cmd(1) lista -C pentru a vedea ce ceasuri sunt disponibile.
-o fisier de iesire
În mod implicit, raportul trace-cmd va crea un urma.dat fişier. Puteți specifica un alt
fișier în care să scrieți cu -o opțiune.
-l nume-funcție
Acest lucru va limita funcţie și function_graph trasoare pentru a urmări doar date
numele funcției. Mai mult de o -l poate fi specificat pe linia de comandă pentru a urmări mai multe
decât o singură funcție. Este permisă și utilizarea limitată a expresiilor glob. Acestea sunt
Meci* pentru a filtra numai funcțiile care încep cu Meci. *Meci doar pentru a filtra
funcții care se termină cu Meci. *Meci\* pentru a filtra numai funcțiile care conțin
Meci.
-g nume-funcție
Această opțiune este pentru pluginul function_graph. Va reprezenta grafic funcția dată. Acea
adică, va urmări doar funcția și toate funcțiile pe care le apelează. Poți avea mai mult
decât unul -g pe linia de comandă.
-n nume-funcție
Aceasta are efectul opus al -l. Funcția dată cu -n opțiunea nu va fi
trasate. Aceasta are prioritate, adică dacă includeți aceeași funcție pentru ambele -n
și -l, nu va fi urmărit.
-d
Unele pluginuri de urmărire activează în mod implicit funcția de urmărire. Ca și trasoarele de latență.
Această opțiune împiedică activarea funcției de urmărire la pornire.
-D
Optiunea -d va încerca să utilizeze opțiunea de urmărire a funcției pentru a dezactiva funcția de urmărire
(dacă este disponibil), altfel este implicit fișierul proc:
/proc/sys/kernel/ftrace_enabled, dar nu îl va atinge dacă opțiunea de urmărire a funcției este
disponibil. -D opțiunea va dezactiva atât fișierul proc ftrace_enabled, cât și
opțiunea de urmărire a funcției dacă există.
Rețineți că această dezactivare a urmăririi funcției pentru toți utilizatorii, inclusiv utilizatorii
în afara trasoarelor ftrace (stack_tracer, perf etc).
-O opțiune
Ftrace are diverse opțiuni care pot fi activate sau dezactivate. Acest lucru vă permite să setați
lor. Adăugarea textului Nu. la o opțiune o dezactivează. De exemplu: „-O nograph-time”
va dezactiva opțiunea Ftrace „graph-time”.
-s interval
Procesele pe care trace-cmd le creează pentru a înregistra din tamponul inel trebuie să se trezească
faceți înregistrarea. Setarea interval la zero va face ca procesele să se trezească
de fiecare dată când date noi sunt scrise în buffer. Dar din moment ce Ftrace înregistrează nucleul
activitate, actul acestor procese de întoarcere la somn poate provoca noi evenimente în
tampon de inel care va reactiva procesul. Acest lucru va adăuga inutil date suplimentare
în tamponul inel.
Valoarea „interval” este de microsecunde. Valoarea implicită este setată la 1000 (1 ms).
Acesta este timpul în care fiecare proces de înregistrare va dormi înainte de a se trezi
înregistrați orice date noi care au fost scrise în tamponul inel.
-r prioritate
Prioritatea la care rulează firele de captură. Într-un sistem aglomerat, captarea urmei
firele pot fi blocate și evenimentele pot fi pierdute. Acest lucru crește prioritatea acestora
fire la prioritatea în timp real (FIFO). Dar utilizați această opțiune cu grijă, se poate și
modifica comportamentul sistemului urmărit.
-b mărimea
Aceasta setează dimensiunea tamponului inel la mărimea kiloocteți. Deoarece tamponul inel Ftrace este
per CPU, această dimensiune este dimensiunea fiecărui buffer inel pe CPU din interiorul nucleului. Folosind
„-b 10000” pe o mașină cu 4 procesoare va face ca Ftrace să aibă o dimensiune totală a memoriei tampon de 40
Megs.
-B nume-tampon
Dacă nucleul acceptă mai multe buffere, aceasta va adăuga un buffer cu numele dat.
Dacă numele tamponului există deja, acel tampon este doar resetat și nu va fi șters
la sfârșitul execuției înregistrării. Dacă tamponul este creat, acesta va fi eliminat la
sfârșitul execuției (cu excepția cazului în care -k este setat sau Începe a fost folosită comanda).
După ce este declarat un nume de buffer, toate evenimentele adăugate după aceea vor fi
asociat cu acel tampon. Dacă nu este specificat niciun buffer sau un eveniment
este specificat înaintea unui nume de buffer, acesta va fi asociat cu
tampon principal (nivel superior).
trace-cmd record -e sched -B block -e block -B time -e timer sleep 1
Cele de mai sus vor activa toate evenimentele programate din bufferul principal. Se va
apoi creați o instanță tampon „blocare” și activați toate evenimentele de blocare din interior
acel tampon. Este creată o instanță tampon „timp” și toate evenimentele timer
va fi activat pentru acel eveniment.
-m mărimea
Dimensiunea maximă în kiloocteți pe care ar trebui să o aibă un buffer per cpu. Notă, datorită rotunjirii la
dimensiunea paginii, este posibil ca numărul să nu fie complet corect. De asemenea, acest lucru se realizează prin comutare
între două buffer-uri care au jumătate din dimensiunea dată, astfel încât rezultatul poate să nu fie de la
dimensiune dată chiar dacă s-a scris mult mai mult.
Utilizați acest lucru pentru a preveni epuizarea spațiului pe disc pentru rulări lungi.
-M cpumask
Setați cpumask pentru a urmări. Afectează doar ultima instanță tampon dată. Dacă
furnizat înaintea oricărei instanțe tampon, apoi afectează tamponul principal. Valoarea
furnizat trebuie să fie un număr hexadecimal.
trace-cmd record -p function -M c -B events13 -e all -M 5
Dacă -M este omis, atunci masca rămâne aceeași. Pentru a le activa pe toate
CPU-uri, transmiteți o valoare de „-1”.
-k
În mod implicit, când trace-cmd s-a terminat de urmărit, va reseta buffer-urile și va dezactiva
toate urmărirea pe care le-a permis. Această opțiune împiedică trace-cmd să dezactiveze trasarea
și resetarea tamponului. Această opțiune este utilă pentru depanarea trace-cmd.
Notă: de obicei, trace-cmd va seta fișierul „tracing_on” înapoi la ceea ce este
a fost înainte de a fi numit. Această opțiune va lăsa fișierul setat la zero.
-i
În mod implicit, dacă este listat un eveniment pe care trace-cmd nu îl găsește, acesta va ieși cu un
eroare. Această opțiune va ignora doar evenimentele care sunt listate pe linia de comandă, dar care sunt
nu se găsește în sistem.
-N gazdă:port
Dacă o altă mașină rulează „trace-cmd listen”, această opțiune este folosită pentru a avea datele
trimis la acea mașină cu pachete UDP. În loc să scrieți într-un fișier de ieșire, datele
este trimis la o cutie de la distanță. Acesta este ideal pentru mașinile încorporate cu spațiu de stocare redus,
sau având o singură mașină care va păstra toate datele într-un singur depozit.
Notă: această opțiune nu este acceptată cu pluginurile de urmărire a latenței:
wakeup, wakeup_rt, irqsoff, preemptoff și preemptirqsoff
-t
Această opțiune este folosită cu -N, când este nevoie să trimiteți datele live cu TCP
pachete în loc de UDP. Deși TCP nu este la fel de rapid ca trimiterea pachetelor UDP,
dar poate fi necesar dacă rețeaua nu este atât de fiabilă, cantitatea de date nu este
atât de intensiv și este necesară o garanție că toate informațiile urmărite sunt transferate
cu succes.
--Data
Cu --Data opțiunea, „trace-cmd” va scrie marcajele de timp în buffer-ul de urmărire după
a terminat înregistrarea. Acesta va mapa apoi marca temporală la gettimeofday, ceea ce va face
permiteți ieșirea timpului de perete din marcajele de timp care citesc cele create urma.dat fișier.
--profil
Cu --profil opțiunea, „trace-cmd” va activa urmărirea care poate fi utilizată cu
trace-cmd-report(1) --opțiune de profil. Dacă un trasor -p nu este setat și graficul funcției
adâncimea este suportată de nucleu, apoi funcția de urmărire a graficului va fi activată cu
o adâncime de unu (afișează doar unde spațiul utilizatorului intră în nucleu). De asemenea, va activa
diverse puncte de urmărire cu urmărirea stivei, astfel încât raportul să arate unde au sarcinile
a fost blocat cel mai mult timp.
Vedea trace-cmd-profile(1) pentru mai multe detalii și exemple.
-H cârlige de evenimente
Adăugați potrivire personalizată a evenimentelor pentru a conecta oricare două evenimente împreună. Când nu este folosit cu
--profil, va salva parametrul și acesta va fi folosit de raportul trace-cmd
--profil, de asemenea. Acesta este:
înregistrare trace-cmd -H hrtimer_expire_entry,hrtimer/hrtimer_expire_exit,hrtimer,sp
raport trace-cmd --profil
Va profila hrtimer_expire_entry și hrtimer_expire_ext ori.
Vedea trace-cmd-profile(1) pentru format.
--stderr
Au ieșirea să treacă la stderr în loc de stdout, dar ieșirea comenzii a fost executată
nu va fi schimbat. Acest lucru este util dacă doriți să monitorizați rezultatul comenzii
în curs de executare, dar nu se vede rezultatul de la trace-cmd.
EXEMPLE
Modul de bază de a urmări toate evenimentele:
# trace-cmd record -e all ls > /dev/null
# raport trace-cmd
trace-cmd-13541 [003] 106260.693809: filemap_fault: adresa=0x128122 offset=0xce
trace-cmd-13543 [001] 106260.693809: kmalloc: call_site=81128dd4 ptr=0xffff88003dd83800 bytes_req=768 bytes_alloc=1024 gfp_flags=GFP_KERERO|
ls-13545 [002] 106260.693809: kfree: call_site=810a7abb ptr=0x0
ls-13545 [002] 106260.693818: sys_exit_write: 0x1
Pentru a utiliza funcția de urmărire cu urmărirea comutatorului programat:
# trace-cmd record -p function -e sched_switch ls > /dev/null
# raport trace-cmd
ls-13587 [002] 106467.860310: funcția: hrtick_start_fair <-- pick_next_task_fair
ls-13587 [002] 106467.860313: sched_switch: prev_comm=trace-cmd prev_pid=13587 prev_prio=120 prev_state=R ==> next_comm=trace-cmd next_pid=13583_prio=120
trace-cmd-13585 [001] 106467.860314: function: native_set_pte_at <-- __do_fault
trace-cmd-13586 [003] 106467.860314: function: up_read <-- do_page_fault
ls-13587 [002] 106467.860317: funcția: __phys_addr <-- program
trace-cmd-13585 [001] 106467.860318: funcția: _raw_spin_unlock <-- __do_fault
ls-13587 [002] 106467.860320: funcția: native_load_sp0 <-- __switch_to
trace-cmd-13586 [003] 106467.860322: funcția: down_read_trylock <-- do_page_fault
Iată o modalitate bună de a găsi ce întreruperi au cea mai mare latență:
# trace-cmd record -p function_graph -e irq_handler_entry -l do_IRQ sleep 10
# raport trace-cmd
-0 [000] 157412.933969: funcgraph_entry: | 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: funcgraph_entry: | 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: funcgraph_entry: | 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: funcgraph_entry: | 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: funcgraph_entry: | do_IRQ() {
-0 [000] 157417.888381: irq_handler_entry: irq=48 name=eth0
-0 [000] 157417.888398: funcgraph_exit: + 25.943 us | }
Un exemplu de profil:
# trace-cmd record --profile sleep 1
# trace-cmd report --profile --comm sleep
sarcină: somn-21611
Eveniment: sched_switch:R (1) Total: 99442 Medie: 99442 Max: 99442 Min:99442
1 total:99442 min:99442 max:99442 avg=99442
=> ftrace_raw_event_sched_switch (0xffffffff8105f812)
=> __schedule (0xffffffff8150810a)
=> preempt_schedule (0xffffffff8150842e)
=> ___preempt_schedule (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)
Eveniment: sched_switch:S (1) Total: 1000506680 Medie: 1000506680 Max: 1000506680 Min:1000506680
1 total:1000506680 min:1000506680 max:1000506680 avg=1000506680
=> ftrace_raw_event_sched_switch (0xffffffff8105f812)
=> __schedule (0xffffffff8150810a)
=> program (0xffffffff815084b8)
=> do_nanosleep (0xffffffff8150b22c)
=> htimer_nanosleep (0xffffffff8108d647)
=> SyS_nanosleep (0xffffffff8108d72c)
=> return_to_handler (0xffffffff8150e3c8)
=> tracesys_phase2 (0xffffffff8150c304)
Eveniment: sched_wakeup:21611 (1) Total: 30326 Medie: 30326 Max: 30326 Min:30326
1 total:30326 min:30326 max:30326 avg=30326
=> ftrace_raw_event_sched_wakeup_template (0xffffffff8105f653)
=> ttwu_do_wakeup (0xffffffff810606eb)
=> ttwu_do_activate.constprop.124 (0xffffffff810607c8)
=> încercați_să_treziți (0xffffffff8106340a)
Utilizați trace-cmd-record online folosind serviciile onworks.net