This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
linux-kernel-dev:capitole:capitol-11 [2015/09/11 10:19] razvan |
linux-kernel-dev:capitole:capitol-11 [2015/09/11 11:46] (current) razvan [perf + tracepoints] |
||
---|---|---|---|
Line 4: | Line 4: | ||
* Resurse urmărite pentru profiling și benchmarking | * Resurse urmărite pentru profiling și benchmarking | ||
- | * Utilitare pentru profiling: perf, time, /proc, lmbench, ftrace, kprobes, cyclic test | + | * Utilitare pentru profiling: perf, tracepoints, kprobes, ftrace, măsurători de timp |
* Scenarii pentru profiling la nivelul nucleului | * Scenarii pentru profiling la nivelul nucleului | ||
Line 59: | Line 59: | ||
''perf'' poate fi folosit în conjuncție funcționalitatea de ''tracepoints'' a kernel-ului pentru a afișa informații statistice despre apeluri de funcții de la nivelul nucleului. De exemplu, dacă ne interesează câte apeluri ''kmalloc()'' se întâmplă pe parcursul a ''10'' secunde de rulare a sistemului vom folosi, pe mașina virtuală VirtualBox comanda<code> | ''perf'' poate fi folosit în conjuncție funcționalitatea de ''tracepoints'' a kernel-ului pentru a afișa informații statistice despre apeluri de funcții de la nivelul nucleului. De exemplu, dacă ne interesează câte apeluri ''kmalloc()'' se întâmplă pe parcursul a ''10'' secunde de rulare a sistemului vom folosi, pe mașina virtuală VirtualBox comanda<code> | ||
- | sudo perf stat -a -e kmem:malloc sleep 10 | + | sudo perf stat -a -e kmem:kmalloc sleep 10 |
</code> | </code> | ||
Line 78: | Line 78: | ||
În directorul ''user-measure-time/'' se găsește implementarea unui program care măsoară granularitatea la nivel de milisecundă a unui apel ''nanosleep()''. Urmăriți programul și rulați-l pe mașina virtuală VirtualBox. Dacă doriți puteți să-l rulați și pe mașina virtuală QEMU. | În directorul ''user-measure-time/'' se găsește implementarea unui program care măsoară granularitatea la nivel de milisecundă a unui apel ''nanosleep()''. Urmăriți programul și rulați-l pe mașina virtuală VirtualBox. Dacă doriți puteți să-l rulați și pe mașina virtuală QEMU. | ||
+ | <note tip> | ||
+ | Programul are rolul de a ne arăta dacă sistemul ne permite operații de tip sleep cu granularitate la nivel de milisecundă. | ||
+ | |||
+ | Putem valida funcționarea corectă urmărind numărul de schimbări de context voluntare:<code> | ||
+ | /usr/bin/time -v ./measure_time | ||
+ | Sleep time (ns): 1114314228 | ||
+ | Command being timed: "./measure_time" | ||
+ | User time (seconds): 0.00 | ||
+ | System time (seconds): 0.03 | ||
+ | Percent of CPU this job got: 2% | ||
+ | Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.11 | ||
+ | Average shared text size (kbytes): 0 | ||
+ | Average unshared data size (kbytes): 0 | ||
+ | Average stack size (kbytes): 0 | ||
+ | Average total size (kbytes): 0 | ||
+ | Maximum resident set size (kbytes): 1344 | ||
+ | Average resident set size (kbytes): 0 | ||
+ | Major (requiring I/O) page faults: 0 | ||
+ | Minor (reclaiming a frame) page faults: 76 | ||
+ | Voluntary context switches: 1001 | ||
+ | Involuntary context switches: 1 | ||
+ | Swaps: 0 | ||
+ | File system inputs: 0 | ||
+ | File system outputs: 0 | ||
+ | Socket messages sent: 0 | ||
+ | Socket messages received: 0 | ||
+ | Signals delivered: 0 | ||
+ | Page size (bytes): 4096 | ||
+ | Exit status: 0 | ||
+ | </code> | ||
+ | Întrucât sunt ''1000'' de schimbări voluntare înseamnă că sistemul are suport pentru acest nivel de granularitate de sleep. | ||
+ | |||
+ | Acest lucru se poate detecta urmărind intrările cu șirul ''resolution'' în fișierul ''/proc/timers'':<code> | ||
+ | $ cat /proc/timer_list | grep resolution | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | .resolution: 1 nsecs | ||
+ | </code> | ||
+ | Granularitatea (rezoluția) este de 1 nanosecundă, deci putem avea granularitate la nivel de milisecundă pentru sleep. | ||
+ | </note> | ||
==== Măsurare timp în user space și kernel space ==== | ==== Măsurare timp în user space și kernel space ==== | ||