55import concurrent
66import glob
77import os
8- import shutil
98from pathlib import Path
109
1110import pytest
@@ -45,7 +44,7 @@ def prepare_microvm_for_test(microvm):
4544 check_output ("echo 3 > /proc/sys/vm/drop_caches" )
4645
4746
48- def run_fio (microvm , mode , block_size , fio_engine = "libaio" ):
47+ def run_fio (microvm , mode , block_size , test_output_dir , fio_engine = "libaio" ):
4948 """Run a fio test in the specified mode with block size bs."""
5049 cmd = (
5150 CmdBuilder ("fio" )
@@ -71,16 +70,10 @@ def run_fio(microvm, mode, block_size, fio_engine="libaio"):
7170 .with_arg (f"--write_bw_log={ mode } " )
7271 .with_arg (f"--write_lat_log={ mode } " )
7372 .with_arg ("--log_avg_msec=1000" )
73+ .with_arg ("--output-format=json+" )
7474 .build ()
7575 )
7676
77- logs_path = Path (microvm .jailer .chroot_base_with_id ()) / "fio_output"
78-
79- if logs_path .is_dir ():
80- shutil .rmtree (logs_path )
81-
82- logs_path .mkdir ()
83-
8477 prepare_microvm_for_test (microvm )
8578
8679 # Start the CPU load monitor.
@@ -93,21 +86,25 @@ def run_fio(microvm, mode, block_size, fio_engine="libaio"):
9386 )
9487
9588 # Print the fio command in the log and run it
96- rc , _ , stderr = microvm .ssh .run (f"cd /tmp; { cmd } " )
89+ rc , stdout , stderr = microvm .ssh .run (f"cd /tmp; { cmd } " )
9790 assert rc == 0 , stderr
9891 assert stderr == ""
9992
100- microvm .ssh .scp_get ("/tmp/*.log" , logs_path )
93+ fio_json_path = Path (test_output_dir / "fio.json" )
94+ with open (fio_json_path , "w" , encoding = "utf-8" ) as f :
95+ f .write (stdout )
96+
97+ microvm .ssh .scp_get ("/tmp/*.log" , test_output_dir )
10198 microvm .ssh .check_output ("rm /tmp/*.log" )
10299
103- return logs_path , cpu_load_future .result ()
100+ return cpu_load_future .result ()
104101
105102
106- def process_fio_log_files (logs_glob ):
103+ def process_fio_log_files (root_dir , logs_glob ):
107104 """Parses all fio log files matching the given glob and yields tuples of same-timestamp read and write metrics"""
108105 data = [
109- Path (pathname ).read_text ("UTF-8" ).splitlines ()
110- for pathname in glob .glob (logs_glob )
106+ Path (root_dir / pathname ).read_text ("UTF-8" ).splitlines ()
107+ for pathname in glob .glob (logs_glob , root_dir = root_dir )
111108 ]
112109
113110 assert data , "no log files found!"
@@ -134,13 +131,13 @@ def process_fio_log_files(logs_glob):
134131
135132def emit_fio_metrics (logs_dir , metrics ):
136133 """Parses the fio logs in `{logs_dir}/*_[clat|bw].*.log and emits their contents as CloudWatch metrics"""
137- for bw_read , bw_write in process_fio_log_files (f" { logs_dir } / *_bw.*.log" ):
134+ for bw_read , bw_write in process_fio_log_files (logs_dir , " *_bw.*.log" ):
138135 if bw_read :
139136 metrics .put_metric ("bw_read" , sum (bw_read ), "Kilobytes/Second" )
140137 if bw_write :
141138 metrics .put_metric ("bw_write" , sum (bw_write ), "Kilobytes/Second" )
142139
143- for lat_read , lat_write in process_fio_log_files (f" { logs_dir } / *_clat.*.log" ):
140+ for lat_read , lat_write in process_fio_log_files (logs_dir , " *_clat.*.log" ):
144141 # latency values in fio logs are in nanoseconds, but cloudwatch only supports
145142 # microseconds as the more granular unit, so need to divide by 1000.
146143 for value in lat_read :
@@ -164,6 +161,7 @@ def test_block_performance(
164161 fio_engine ,
165162 io_engine ,
166163 metrics ,
164+ test_output_dir ,
167165):
168166 """
169167 Execute block device emulation benchmarking scenarios.
@@ -192,9 +190,9 @@ def test_block_performance(
192190
193191 vm .pin_threads (0 )
194192
195- logs_dir , cpu_util = run_fio (vm , fio_mode , fio_block_size , fio_engine )
193+ cpu_util = run_fio (vm , fio_mode , fio_block_size , test_output_dir , fio_engine )
196194
197- emit_fio_metrics (logs_dir , metrics )
195+ emit_fio_metrics (test_output_dir , metrics )
198196
199197 for thread_name , values in cpu_util .items ():
200198 for value in values :
@@ -213,6 +211,7 @@ def test_block_vhost_user_performance(
213211 fio_mode ,
214212 fio_block_size ,
215213 metrics ,
214+ test_output_dir ,
216215):
217216 """
218217 Execute block device emulation benchmarking scenarios.
@@ -242,9 +241,9 @@ def test_block_vhost_user_performance(
242241 next_cpu = vm .pin_threads (0 )
243242 vm .disks_vhost_user ["scratch" ].pin (next_cpu )
244243
245- logs_dir , cpu_util = run_fio (vm , fio_mode , fio_block_size )
244+ cpu_util = run_fio (vm , fio_mode , fio_block_size , test_output_dir )
246245
247- emit_fio_metrics (logs_dir , metrics )
246+ emit_fio_metrics (test_output_dir , metrics )
248247
249248 for thread_name , values in cpu_util .items ():
250249 for value in values :
0 commit comments