5
5
import concurrent
6
6
import glob
7
7
import os
8
- import shutil
9
8
from pathlib import Path
10
9
11
10
import pytest
@@ -45,7 +44,7 @@ def prepare_microvm_for_test(microvm):
45
44
check_output ("echo 3 > /proc/sys/vm/drop_caches" )
46
45
47
46
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" ):
49
48
"""Run a fio test in the specified mode with block size bs."""
50
49
cmd = (
51
50
CmdBuilder ("fio" )
@@ -71,16 +70,10 @@ def run_fio(microvm, mode, block_size, fio_engine="libaio"):
71
70
.with_arg (f"--write_bw_log={ mode } " )
72
71
.with_arg (f"--write_lat_log={ mode } " )
73
72
.with_arg ("--log_avg_msec=1000" )
73
+ .with_arg ("--output-format=json+" )
74
74
.build ()
75
75
)
76
76
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
-
84
77
prepare_microvm_for_test (microvm )
85
78
86
79
# Start the CPU load monitor.
@@ -93,21 +86,25 @@ def run_fio(microvm, mode, block_size, fio_engine="libaio"):
93
86
)
94
87
95
88
# 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 } " )
97
90
assert rc == 0 , stderr
98
91
assert stderr == ""
99
92
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 )
101
98
microvm .ssh .check_output ("rm /tmp/*.log" )
102
99
103
- return logs_path , cpu_load_future .result ()
100
+ return cpu_load_future .result ()
104
101
105
102
106
- def process_fio_log_files (logs_glob ):
103
+ def process_fio_log_files (root_dir , logs_glob ):
107
104
"""Parses all fio log files matching the given glob and yields tuples of same-timestamp read and write metrics"""
108
105
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 )
111
108
]
112
109
113
110
assert data , "no log files found!"
@@ -134,13 +131,13 @@ def process_fio_log_files(logs_glob):
134
131
135
132
def emit_fio_metrics (logs_dir , metrics ):
136
133
"""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" ):
138
135
if bw_read :
139
136
metrics .put_metric ("bw_read" , sum (bw_read ), "Kilobytes/Second" )
140
137
if bw_write :
141
138
metrics .put_metric ("bw_write" , sum (bw_write ), "Kilobytes/Second" )
142
139
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" ):
144
141
# latency values in fio logs are in nanoseconds, but cloudwatch only supports
145
142
# microseconds as the more granular unit, so need to divide by 1000.
146
143
for value in lat_read :
@@ -164,6 +161,7 @@ def test_block_performance(
164
161
fio_engine ,
165
162
io_engine ,
166
163
metrics ,
164
+ results_dir ,
167
165
):
168
166
"""
169
167
Execute block device emulation benchmarking scenarios.
@@ -192,9 +190,9 @@ def test_block_performance(
192
190
193
191
vm .pin_threads (0 )
194
192
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 , results_dir , fio_engine )
196
194
197
- emit_fio_metrics (logs_dir , metrics )
195
+ emit_fio_metrics (results_dir , metrics )
198
196
199
197
for thread_name , values in cpu_util .items ():
200
198
for value in values :
@@ -213,6 +211,7 @@ def test_block_vhost_user_performance(
213
211
fio_mode ,
214
212
fio_block_size ,
215
213
metrics ,
214
+ test_output_dir ,
216
215
):
217
216
"""
218
217
Execute block device emulation benchmarking scenarios.
@@ -242,9 +241,9 @@ def test_block_vhost_user_performance(
242
241
next_cpu = vm .pin_threads (0 )
243
242
vm .disks_vhost_user ["scratch" ].pin (next_cpu )
244
243
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 )
246
245
247
- emit_fio_metrics (logs_dir , metrics )
246
+ emit_fio_metrics (test_output_dir , metrics )
248
247
249
248
for thread_name , values in cpu_util .items ():
250
249
for value in values :
0 commit comments