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,11 @@ 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
+ .with_arg ("--output=/tmp/fio.json" )
74
75
.build ()
75
76
)
76
77
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
78
prepare_microvm_for_test (microvm )
85
79
86
80
# Start the CPU load monitor.
@@ -97,17 +91,23 @@ def run_fio(microvm, mode, block_size, fio_engine="libaio"):
97
91
assert rc == 0 , stderr
98
92
assert stderr == ""
99
93
100
- microvm .ssh .scp_get ("/tmp/*.log " , logs_path )
101
- microvm .ssh .check_output ( "rm /tmp/*.log" )
94
+ microvm .ssh .scp_get ("/tmp/fio.json " , test_output_dir )
95
+ microvm .ssh .scp_get ( " /tmp/*.log", test_output_dir )
102
96
103
- return logs_path , cpu_load_future .result ()
97
+ return cpu_load_future .result ()
104
98
105
99
106
- def process_fio_log_files (logs_glob ):
107
- """Parses all fio log files matching the given glob and yields tuples of same-timestamp read and write metrics"""
100
+ def process_fio_log_files (root_dir , logs_glob ):
101
+ """
102
+ Parses all fio log files in the root_dir matching the given glob and
103
+ yields tuples of same-timestamp read and write metrics
104
+ """
105
+ # We specify `root_dir` for `glob.glob` because otherwise it will
106
+ # struggle with directory with names like:
107
+ # test_block_performance[vmlinux-5.10.233-Sync-bs4096-randread-1vcpu]
108
108
data = [
109
- Path (pathname ).read_text ("UTF-8" ).splitlines ()
110
- for pathname in glob .glob (logs_glob )
109
+ Path (root_dir / pathname ).read_text ("UTF-8" ).splitlines ()
110
+ for pathname in glob .glob (logs_glob , root_dir = root_dir )
111
111
]
112
112
113
113
assert data , "no log files found!"
@@ -134,13 +134,13 @@ def process_fio_log_files(logs_glob):
134
134
135
135
def emit_fio_metrics (logs_dir , metrics ):
136
136
"""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" ):
137
+ for bw_read , bw_write in process_fio_log_files (logs_dir , " *_bw.*.log" ):
138
138
if bw_read :
139
139
metrics .put_metric ("bw_read" , sum (bw_read ), "Kilobytes/Second" )
140
140
if bw_write :
141
141
metrics .put_metric ("bw_write" , sum (bw_write ), "Kilobytes/Second" )
142
142
143
- for lat_read , lat_write in process_fio_log_files (f" { logs_dir } / *_clat.*.log" ):
143
+ for lat_read , lat_write in process_fio_log_files (logs_dir , " *_clat.*.log" ):
144
144
# latency values in fio logs are in nanoseconds, but cloudwatch only supports
145
145
# microseconds as the more granular unit, so need to divide by 1000.
146
146
for value in lat_read :
@@ -164,6 +164,7 @@ def test_block_performance(
164
164
fio_engine ,
165
165
io_engine ,
166
166
metrics ,
167
+ results_dir ,
167
168
):
168
169
"""
169
170
Execute block device emulation benchmarking scenarios.
@@ -192,9 +193,9 @@ def test_block_performance(
192
193
193
194
vm .pin_threads (0 )
194
195
195
- logs_dir , cpu_util = run_fio (vm , fio_mode , fio_block_size , fio_engine )
196
+ cpu_util = run_fio (vm , fio_mode , fio_block_size , results_dir , fio_engine )
196
197
197
- emit_fio_metrics (logs_dir , metrics )
198
+ emit_fio_metrics (results_dir , metrics )
198
199
199
200
for thread_name , values in cpu_util .items ():
200
201
for value in values :
@@ -213,6 +214,7 @@ def test_block_vhost_user_performance(
213
214
fio_mode ,
214
215
fio_block_size ,
215
216
metrics ,
217
+ results_dir ,
216
218
):
217
219
"""
218
220
Execute block device emulation benchmarking scenarios.
@@ -242,9 +244,9 @@ def test_block_vhost_user_performance(
242
244
next_cpu = vm .pin_threads (0 )
243
245
vm .disks_vhost_user ["scratch" ].pin (next_cpu )
244
246
245
- logs_dir , cpu_util = run_fio (vm , fio_mode , fio_block_size )
247
+ cpu_util = run_fio (vm , fio_mode , fio_block_size , results_dir )
246
248
247
- emit_fio_metrics (logs_dir , metrics )
249
+ emit_fio_metrics (results_dir , metrics )
248
250
249
251
for thread_name , values in cpu_util .items ():
250
252
for value in values :
0 commit comments