2016-11-01 4 views
0

Ich versuche, die Ausführungszeit des FIO-Benchmarks zu messen. Ich bin derzeit, tut so die FIO Anruf zwischen gettimeofday Einwickeln():FIO-Laufzeit anders als gettimeofday()

gettimeofday(&startFioFix, NULL); 
FILE* process = popen("fio --name=randwrite --ioengine=posixaio rw=randwrite --size=100M --direct=1 --thread=1 --bs=4K", "r"); 
gettimeofday(&doneFioFix, NULL); 

und berechnen Sie die verstrichene Zeit als:

double tstart = startFioFix.tv_sec + startFioFix.tv_usec/1000000.; 
double tend = doneFioFix.tv_sec + doneFioFix.tv_usec/1000000.; 
double telapsed = (tend - tstart); 

Nun, die Frage (n) ist

  1. Die verstrichene Zeit ist anders ( größer) als die Runt von FIO-Ausgang. Kannst du mir bitte helfen zu verstehen Warum?

    randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=posixaio, iodepth=1 
    fio-2.2.8 
    Starting 1 thread 
    
    randwrite: (groupid=0, jobs=1): err= 0: pid=3862: Tue Nov 1 18:07:50 2016 
    write: io=102400KB, bw=91674KB/s, iops=22918, runt= 1117msec 
    ... 
    

    und das ist telapsed:

    telapsed: 1.76088 seconds 
    
  2. was die tatsächliche Zeit von FIO Ausführung genommen ist: die Tatsache kann in FIO Ausgang ersichtlich a) Runt durch FIO gegeben, oder b) die verstrichene Zeit von getttimeofday()

  3. Wie FIO messen seine runt? (Wahrscheinlich, diese Frage zu 1. verknüpft)

PS: Ich habe versucht, die gettimeofday zu ersetzen (mit std :: Chrono :: high_resolution_clock :: now()), aber es verhält sich auch das gleiche (mit den gleichen , Ich meine es gibt auch eine längere Zeit als runt)

Vielen Dank im Voraus, für Ihre Zeit und Unterstützung.

Antwort

0

Ein kurzer Punkt: gettimeofday() auf Linux eine Uhr verwendet, die nicht unbedingt in einem konstanten Abstand kreuzen sich und kann sogar nach hinten (siehe http://man7.org/linux/man-pages/man2/gettimeofday.2.html und https://stackoverflow.com/a/3527632/4513656) bewegen - diese telapsed unzuverlässig (oder sogar negativ) machen kann.

  1. Ihre gettimeofday/popen/gettimeofday Messung (telapsed) wird sein: die FIO-Prozess (dh fork + exec auf Linux) starten verstrichene + fio Initialisierung (zB Thread-Erzeugung, weil ich --thread, ioengine Initialisierung sehen) + fio-Job abgelaufen (runt) + fio stopping verstrichen + Prozess stop abgelaufen). Sie vergleichen dies mit nur runt, die eine Unterkomponente von ist. Es ist unwahrscheinlich, dass alle Komponenten sofort passieren (d. H. 0 usecs verbrauchen), so dass die Erwartung besteht, dass runt kleiner als telapsed sein wird. Versuchen Sie, fio mit --debug=all zu starten, nur um alle Dinge zu sehen, die es tut, zusätzlich, um tatsächlich I/O für den Job zu senden.
  2. Dies ist schwierig zu beantworten, weil es darauf ankommt, was Sie wollen, wenn Sie sagen "fio execution" und warum (d. H. Die Frage ist schwer in eindeutiger Weise zu interpretieren). Interessieren Sie sich dafür, wie lange fio tatsächlich damit verbracht hat, E/A für einen bestimmten Auftrag einzureichen (runt)? Sind Sie daran interessiert, wie lange Ihr System benötigt, um einen neuen Prozess zu starten/zu stoppen, der einfach versucht, E/A für einen bestimmten Zeitraum zu senden (telapsed)? Sind Sie daran interessiert, wie viel CPU-Zeit für das Eingeben von E/A benötigt wurde (keine der oben genannten)?Also, weil ich verwirrt bin, werde ich Ihnen stattdessen einige Fragen stellen: Wofür werden Sie das Ergebnis verwenden und warum?
  3. Warum nicht auf den Quellcode schauen? https://github.com/axboe/fio/blob/7a3b2fc3434985fa519db55e8f81734c24af274d/stat.c#L405 zeigt runt kommt von ts->runtime[ddir]. Sie können sehen, dass es durch einen Aufruf an set_epoch_time() (https://github.com/axboe/fio/blob/6be06c46544c19e513ff80e7b841b1de688ffc66/backend.c#L1664) initialisiert wird, wird von update_runtime() (https://github.com/axboe/fio/blob/6be06c46544c19e513ff80e7b841b1de688ffc66/backend.c#L371) aktualisiert, die von thread_main() aufgerufen wird.