21
21
22
22
#define STAT_LAT_NR_DEF 10
23
23
#define STAT_LAT_RANGE_MAX 1000
24
+ #define STAT_NAME_LEN 20
24
25
25
26
struct fio_sem * stat_sem ;
26
27
@@ -804,11 +805,25 @@ static void show_ddir_status(struct group_run_stats *rs, struct thread_stat *ts,
804
805
}
805
806
}
806
807
807
- static bool show_lat (double * io_u_lat , int nr , const char * * ranges ,
808
- const char * msg , struct buf_output * out )
808
+ static int stat_get_range (int i )
809
+ {
810
+ int range = STAT_LAT_RANGE_MAX ;
811
+
812
+ if (i + 1 >= stat_lat_nr )
813
+ range *= i + 2 - stat_lat_nr ;
814
+ else
815
+ range = stat_lat_ranges [i + 1 ];
816
+
817
+ return range ;
818
+ }
819
+
820
+ static bool show_lat (double * io_u_lat , int nr , const char * msg ,
821
+ struct buf_output * out )
809
822
{
810
823
bool new_line = true, shown = false;
811
824
int i , line = 0 ;
825
+ int range ;
826
+ int range_max = STAT_LAT_RANGE_MAX * 2 ;
812
827
813
828
for (i = 0 ; i < nr ; i ++ ) {
814
829
if (io_u_lat [i ] <= 0.0 )
@@ -823,7 +838,9 @@ static bool show_lat(double *io_u_lat, int nr, const char **ranges,
823
838
}
824
839
if (line )
825
840
log_buf (out , ", " );
826
- log_buf (out , "%s%3.2f%%" , ranges [i ], io_u_lat [i ]);
841
+ range = stat_get_range (i );
842
+ log_buf (out , "%s%d=%3.2f%%" , range > range_max ? ">=" : "" ,
843
+ range > range_max ? range_max : range , io_u_lat [i ]);
827
844
line ++ ;
828
845
if (line == 5 )
829
846
new_line = true;
@@ -837,27 +854,17 @@ static bool show_lat(double *io_u_lat, int nr, const char **ranges,
837
854
838
855
static void show_lat_n (double * io_u_lat_n , struct buf_output * out )
839
856
{
840
- const char * ranges [] = { "2=" , "4=" , "10=" , "20=" , "50=" , "100=" ,
841
- "250=" , "500=" , "750=" , "1000=" , };
842
-
843
- show_lat (io_u_lat_n , FIO_IO_U_LAT_N_NR , ranges , "nsec" , out );
857
+ show_lat (io_u_lat_n , FIO_IO_U_LAT_N_NR , "nsec" , out );
844
858
}
845
859
846
860
static void show_lat_u (double * io_u_lat_u , struct buf_output * out )
847
861
{
848
- const char * ranges [] = { "2=" , "4=" , "10=" , "20=" , "50=" , "100=" ,
849
- "250=" , "500=" , "750=" , "1000=" , };
850
-
851
- show_lat (io_u_lat_u , FIO_IO_U_LAT_U_NR , ranges , "usec" , out );
862
+ show_lat (io_u_lat_u , FIO_IO_U_LAT_U_NR , "usec" , out );
852
863
}
853
864
854
865
static void show_lat_m (double * io_u_lat_m , struct buf_output * out )
855
866
{
856
- const char * ranges [] = { "2=" , "4=" , "10=" , "20=" , "50=" , "100=" ,
857
- "250=" , "500=" , "750=" , "1000=" , "2000=" ,
858
- ">=2000=" , };
859
-
860
- show_lat (io_u_lat_m , FIO_IO_U_LAT_M_NR , ranges , "msec" , out );
867
+ show_lat (io_u_lat_m , FIO_IO_U_LAT_M_NR , "msec" , out );
861
868
}
862
869
863
870
static void show_latencies (struct thread_stat * ts , struct buf_output * out )
@@ -1811,6 +1818,9 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
1811
1818
double usr_cpu , sys_cpu ;
1812
1819
int i ;
1813
1820
size_t size ;
1821
+ char name [STAT_NAME_LEN ];
1822
+ int range ;
1823
+ int range_max = STAT_LAT_RANGE_MAX * 2 ;
1814
1824
1815
1825
root = json_create_object ();
1816
1826
json_object_add_value_string (root , "jobname" , ts -> name );
@@ -1858,11 +1868,10 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
1858
1868
json_object_add_value_object (root , "iodepth_level" , tmp );
1859
1869
/* Only show fixed 7 I/O depth levels*/
1860
1870
for (i = 0 ; i < 7 ; i ++ ) {
1861
- char name [20 ];
1862
1871
if (i < 6 )
1863
- snprintf (name , 20 , "%d" , 1 << i );
1872
+ snprintf (name , STAT_NAME_LEN , "%d" , 1 << i );
1864
1873
else
1865
- snprintf (name , 20 , ">=%d" , 1 << i );
1874
+ snprintf (name , STAT_NAME_LEN , ">=%d" , 1 << i );
1866
1875
json_object_add_value_float (tmp , (const char * )name , io_u_dist [i ]);
1867
1876
}
1868
1877
@@ -1872,13 +1881,12 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
1872
1881
json_object_add_value_object (root , "iodepth_submit" , tmp );
1873
1882
/* Only show fixed 7 I/O depth levels*/
1874
1883
for (i = 0 ; i < 7 ; i ++ ) {
1875
- char name [20 ];
1876
1884
if (i == 0 )
1877
- snprintf (name , 20 , "0" );
1885
+ snprintf (name , STAT_NAME_LEN , "0" );
1878
1886
else if (i < 6 )
1879
- snprintf (name , 20 , "%d" , 1 << (i + 1 ));
1887
+ snprintf (name , STAT_NAME_LEN , "%d" , 1 << (i + 1 ));
1880
1888
else
1881
- snprintf (name , 20 , ">=%d" , 1 << i );
1889
+ snprintf (name , STAT_NAME_LEN , ">=%d" , 1 << i );
1882
1890
json_object_add_value_float (tmp , (const char * )name , io_u_dist [i ]);
1883
1891
}
1884
1892
@@ -1888,13 +1896,12 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
1888
1896
json_object_add_value_object (root , "iodepth_complete" , tmp );
1889
1897
/* Only show fixed 7 I/O depth levels*/
1890
1898
for (i = 0 ; i < 7 ; i ++ ) {
1891
- char name [20 ];
1892
1899
if (i == 0 )
1893
- snprintf (name , 20 , "0" );
1900
+ snprintf (name , STAT_NAME_LEN , "0" );
1894
1901
else if (i < 6 )
1895
- snprintf (name , 20 , "%d" , 1 << (i + 1 ));
1902
+ snprintf (name , STAT_NAME_LEN , "%d" , 1 << (i + 1 ));
1896
1903
else
1897
- snprintf (name , 20 , ">=%d" , 1 << i );
1904
+ snprintf (name , STAT_NAME_LEN , ">=%d" , 1 << i );
1898
1905
json_object_add_value_float (tmp , (const char * )name , io_u_dist [i ]);
1899
1906
}
1900
1907
@@ -1908,26 +1915,25 @@ static struct json_object *show_thread_status_json(struct thread_stat *ts,
1908
1915
tmp = json_create_object ();
1909
1916
json_object_add_value_object (root , "latency_ns" , tmp );
1910
1917
for (i = 0 ; i < FIO_IO_U_LAT_N_NR ; i ++ ) {
1911
- const char * ranges [] = { "2" , "4" , "10" , "20" , "50" , "100" ,
1912
- "250" , "500" , "750" , "1000" , };
1913
- json_object_add_value_float (tmp , ranges [i ], io_u_lat_n [i ]);
1918
+ snprintf (name , STAT_NAME_LEN , "%d" , stat_get_range (i ));
1919
+ json_object_add_value_float (tmp , name , io_u_lat_n [i ]);
1914
1920
}
1915
1921
/* Microsecond latency */
1916
1922
tmp = json_create_object ();
1917
1923
json_object_add_value_object (root , "latency_us" , tmp );
1918
1924
for (i = 0 ; i < FIO_IO_U_LAT_U_NR ; i ++ ) {
1919
- const char * ranges [] = { "2" , "4" , "10" , "20" , "50" , "100" ,
1920
- "250" , "500" , "750" , "1000" , };
1921
- json_object_add_value_float (tmp , ranges [i ], io_u_lat_u [i ]);
1925
+ snprintf (name , STAT_NAME_LEN , "%d" , stat_get_range (i ));
1926
+ json_object_add_value_float (tmp , name , io_u_lat_u [i ]);
1922
1927
}
1923
1928
/* Millisecond latency */
1924
1929
tmp = json_create_object ();
1925
1930
json_object_add_value_object (root , "latency_ms" , tmp );
1926
1931
for (i = 0 ; i < FIO_IO_U_LAT_M_NR ; i ++ ) {
1927
- const char * ranges [] = { "2" , "4" , "10" , "20" , "50" , "100" ,
1928
- "250" , "500" , "750" , "1000" , "2000" ,
1929
- ">=2000" , };
1930
- json_object_add_value_float (tmp , ranges [i ], io_u_lat_m [i ]);
1932
+ range = stat_get_range (i );
1933
+ snprintf (name , STAT_NAME_LEN , "%s%d" ,
1934
+ range > range_max ? ">=" : "" ,
1935
+ range > range_max ? range_max : range );
1936
+ json_object_add_value_float (tmp , name , io_u_lat_m [i ]);
1931
1937
}
1932
1938
1933
1939
/* Additional output if continue_on_error set - default off*/
@@ -3480,16 +3486,13 @@ void stat_alloc_lat_ranges(void)
3480
3486
int width_nr = sizeof (widths ) / sizeof (widths [0 ]);
3481
3487
int idx = width_nr - 1 ;
3482
3488
3483
- if (stat_lat_ranges )
3484
- return ;
3485
-
3486
3489
for (i = 0 ; i < width_nr ; i ++ ) {
3487
3490
widths [i ] = widths [i ] * STAT_LAT_NR_DEF / stat_lat_nr ;
3488
3491
if (!widths [i ])
3489
3492
widths [i ]++ ;
3490
3493
}
3491
3494
3492
- stat_lat_ranges = calloc (stat_lat_nr , sizeof (int ));
3495
+ stat_lat_ranges = scalloc (stat_lat_nr , sizeof (int ));
3493
3496
3494
3497
for (i = stat_lat_nr ; i ; i -- ) {
3495
3498
if (range > widths [idx ])
@@ -3508,23 +3511,25 @@ void stat_alloc_lat_ranges(void)
3508
3511
}
3509
3512
3510
3513
for (i = 0 ; i < stat_lat_nr ; i ++ )
3511
- dprint (FD_STAT , "range [%d]: %d\n" , i , stat_lat_ranges [i ]);
3514
+ dprint (FD_STAT , "lat_range [%d]: %d\n" , i , stat_lat_ranges [i ]);
3512
3515
}
3513
3516
3514
3517
void stat_alloc_lat (struct thread_stat * ts )
3515
3518
{
3516
- ts -> io_u_lat_n = calloc (FIO_IO_U_LAT_N_NR , sizeof (uint64_t ));
3517
- ts -> io_u_lat_u = calloc (FIO_IO_U_LAT_U_NR , sizeof (uint64_t ));
3518
- ts -> io_u_lat_m = calloc (FIO_IO_U_LAT_M_NR , sizeof (uint64_t ));
3519
- stat_alloc_lat_ranges ();
3519
+ ts -> io_u_lat_n = scalloc (FIO_IO_U_LAT_N_NR , sizeof (uint64_t ));
3520
+ ts -> io_u_lat_u = scalloc (FIO_IO_U_LAT_U_NR , sizeof (uint64_t ));
3521
+ ts -> io_u_lat_m = scalloc (FIO_IO_U_LAT_M_NR , sizeof (uint64_t ));
3522
+
3523
+ if (!stat_lat_ranges )
3524
+ stat_alloc_lat_ranges ();
3520
3525
}
3521
3526
3522
3527
void stat_free_lat (struct thread_stat * ts )
3523
3528
{
3524
- free (ts -> io_u_lat_n );
3525
- free (ts -> io_u_lat_u );
3526
- free (ts -> io_u_lat_m );
3527
- free (stat_lat_ranges );
3529
+ sfree (ts -> io_u_lat_n );
3530
+ sfree (ts -> io_u_lat_u );
3531
+ sfree (ts -> io_u_lat_m );
3532
+ sfree (stat_lat_ranges );
3528
3533
stat_lat_ranges = NULL ;
3529
3534
}
3530
3535
0 commit comments