User Tools

Site Tools


linux-kernel-dev:capitole:capitol-11

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
linux-kernel-dev:capitole:capitol-11 [2015/09/11 10:20]
razvan [Subiecte abordate]
linux-kernel-dev:capitole:capitol-11 [2015/09/11 11:46] (current)
razvan [perf + tracepoints]
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 ====
  
linux-kernel-dev/capitole/capitol-11.1441956046.txt.gz · Last modified: 2015/09/11 10:20 by razvan