33
33
exit 1
34
34
fi
35
35
36
+ # Install common dependencies before adding starterscriptuser
36
37
if [[ " $OS_FAMILY " == " debian_ubuntu" ]]; then
37
38
sudo apt-get update
38
- sudo apt-get install -y wget git fio libaio-dev gcc make mdadm build-essential python3-setuptools python3-crcmod python3-pip fuse jq bc procps gawk
39
+ sudo apt-get install -y wget git fio libaio-dev gcc make mdadm build-essential python3-setuptools python3-crcmod python3-pip python3-venv fuse jq bc procps gawk
39
40
elif [[ " $OS_FAMILY " == " rhel_centos" ]]; then
40
41
sudo yum makecache
41
42
sudo yum -y install git fio fuse libaio libaio-devel gcc make mdadm redhat-rpm-config python3-devel python3-setuptools python3-pip jq bc procps-ng wget gawk
@@ -60,6 +61,8 @@ sudo -u starterscriptuser OS_FAMILY="$OS_FAMILY" bash <<'EOF'
60
61
set -x
61
62
set -e
62
63
64
+ UPLOAD_FAILED=false
65
+
63
66
# Function to monitor GCSFuse CPU and memory usage
64
67
monitor_gcsfuse_usage() {
65
68
local log_file="$1"
@@ -122,6 +125,7 @@ monitor_gcsfuse_usage() {
122
125
}
123
126
124
127
BENCHMARK_LOG_FILE="/tmp/benchmark_run.log"
128
+ # Redirect stdout and stderr to BENCHMARK_LOG_FILE and also to original stdout/stderr
125
129
exec > >(tee -a "$BENCHMARK_LOG_FILE") 2>&1
126
130
127
131
cleanup() {
@@ -144,6 +148,7 @@ cd ~/
144
148
echo "Current directory: $(pwd)"
145
149
echo "User: $(whoami)"
146
150
151
+ # Fetch metadata parameters
147
152
GCSFUSE_VERSION=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/GCSFUSE_VERSION" -H "Metadata-Flavor: Google")
148
153
GCS_BUCKET_WITH_FIO_TEST_DATA=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/GCS_BUCKET_WITH_FIO_TEST_DATA" -H "Metadata-Flavor: Google")
149
154
RESULT_PATH=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/RESULT_PATH" -H "Metadata-Flavor: Google")
@@ -153,6 +158,7 @@ VM_NAME=$(hostname)
153
158
UNIQUE_ID=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/UNIQUE_ID" -H "Metadata-Flavor: Google")
154
159
GCSFUSE_MOUNT_OPTIONS_STR="implicit-dirs"
155
160
161
+ # Determine system architecture
156
162
ARCHITECTURE=""
157
163
if [[ "$OS_FAMILY" == "debian_ubuntu" ]]; then
158
164
ARCHITECTURE=$(dpkg --print-architecture)
@@ -167,9 +173,13 @@ elif [[ "$OS_FAMILY" == "rhel_centos" ]]; then
167
173
exit 1
168
174
fi
169
175
fi
176
+
177
+ # Install Go
170
178
wget -nv --tries=3 --waitretry=5 -O go_tar.tar.gz "https://go.dev/dl/go1.24.0.linux-${ARCHITECTURE}.tar.gz"
171
179
sudo tar -C /usr/local -xzf go_tar.tar.gz
172
180
export PATH=$PATH:/usr/local/go/bin
181
+
182
+ # Clone and build gcsfuse
173
183
git clone https://github.com/GoogleCloudPlatform/gcsfuse.git
174
184
cd gcsfuse
175
185
git checkout "$GCSFUSE_VERSION"
@@ -182,15 +192,19 @@ GCSFUSE_BIN="$CURR_DIR/gcsfuse/gcsfuse"
182
192
MNT="$CURR_DIR/$MOUNT_POINT"
183
193
SSD_MOUNT_DIR="/mnt/disks/local_ssd"
184
194
FIO_JOB_DIR="/tmp/fio_jobs"
195
+
196
+ # Download all FIO job spec files
185
197
mkdir -p "$FIO_JOB_DIR"
186
- gcloud storage cp "${RESULT_PATH}/fio_job_files /*.fio" "$FIO_JOB_DIR/"
198
+ gcloud storage cp "${RESULT_PATH}/fio-job-files /*.fio" "$FIO_JOB_DIR/"
187
199
200
+ # Capture versions
188
201
{
189
202
echo "GCSFuse version: $GCSFUSE_VERSION"
190
203
echo "Go version : $(go version)"
191
204
echo "FIO version : $(fio --version)"
192
205
} >> details.txt
193
206
207
+ # Create LSSD if enabled
194
208
if [[ "$LSSD_ENABLED" == "true" ]]; then
195
209
LSSD_DEVICES=()
196
210
for i in {0..15}; do
@@ -213,7 +227,12 @@ if [[ "$LSSD_ENABLED" == "true" ]]; then
213
227
fi
214
228
215
229
git clone --single-branch --branch fio-to-bigquery https://github.com/GoogleCloudPlatform/gcsfuse-tools.git
216
- python3 -m pip install --user -r gcsfuse-tools/perf_benchmarking_for_releases/requirements.txt
230
+ cd gcsfuse-tools
231
+
232
+ python3 -m venv py_venv
233
+ source py_venv/bin/activate
234
+ python3 -m pip install -r perf-benchmarking-for-releases/requirements.txt
235
+
217
236
IFS=',' read -r -a GCSFUSE_FLAGS_ARRAY <<< "$GCSFUSE_MOUNT_OPTIONS_STR"
218
237
GCSFUSE_FLAGS=()
219
238
for flag in "${GCSFUSE_FLAGS_ARRAY[@]}"; do
@@ -255,6 +274,7 @@ for master_fio_file in "$FIO_JOB_DIR"/*.fio; do
255
274
[[ "$LSSD_ENABLED" == "true" ]] && reformat_and_remount_lssd
256
275
sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
257
276
277
+ # Mount GCS bucket using gcsfuse
258
278
mkdir -p "$MNT"
259
279
"$GCSFUSE_BIN" "${GCSFUSE_FLAGS[@]}" "$GCS_BUCKET_WITH_FIO_TEST_DATA" "$MNT"
260
280
@@ -281,26 +301,40 @@ for master_fio_file in "$FIO_JOB_DIR"/*.fio; do
281
301
read -r LOWEST_CPU HIGHEST_CPU <<< $(gawk 'BEGIN{min="inf";max="-inf"} {if($2<min)min=$2; if($2>max)max=$2} END{if(min=="inf")print "0.0 0.0"; else print min, max}' "$monitor_log")
282
302
read -r LOWEST_MEM HIGHEST_MEM <<< $(gawk 'BEGIN{min="inf";max="-inf"} {if($3<min)min=$3; if($3>max)max=$3} END{if(min=="inf")print "0 0"; else print min, max}' "$monitor_log")
283
303
284
- python3 gcsfuse-tools/perf_benchmarking_for_releases /upload_fio_output_to_bigquery.py \
304
+ if python3 perf-benchmarking-for-releases /upload_fio_output_to_bigquery.py \
285
305
--result-file "$RESULT_FILE" \
286
306
--fio-job-file "$single_fio_file" \
287
307
--master-fio-file "$master_fio_file" \
288
308
--lowest-cpu "$LOWEST_CPU" \
289
309
--highest-cpu "$HIGHEST_CPU" \
290
310
--lowest-mem "$LOWEST_MEM" \
291
311
--highest-mem "$HIGHEST_MEM" \
292
- --gcsfuse-mount-options "$GCSFUSE_MOUNT_OPTIONS_STR"
293
-
294
- rm -f "$RESULT_FILE" "$monitor_log"
312
+ --gcsfuse-mount-options "$GCSFUSE_MOUNT_OPTIONS_STR"; then
313
+ echo "Successfully uploaded results to BigQuery for job: $job_file_basename"
314
+ rm -f "$RESULT_FILE" "$monitor_log"
315
+ else
316
+ echo "Warning: Failed to upload results to BigQuery for job: $job_file_basename. Uploading monitor log to GCS for debugging."
317
+ gcloud storage cp "$monitor_log" "${RESULTS_SUBDIR_PATH}/" || echo "Warning: Failed to upload monitor log for ${job_file_basename}"
318
+ UPLOAD_FAILED=true
319
+ fi
295
320
done
296
321
297
322
rm -rf "$SPLIT_DIR"
298
323
done
299
324
300
- touch success.txt
301
- gcloud storage cp success.txt "$RESULT_PATH"
302
- rm success.txt
325
+ cd ..
326
+
327
+ if [[ "$UPLOAD_FAILED" == "false" ]]; then
328
+ # All tests ran successfully; create a success.txt file in GCS
329
+ touch success.txt
330
+ gcloud storage cp success.txt "$RESULT_PATH"
331
+ rm success.txt
332
+ else
333
+ echo "One or more BigQuery uploads failed. Not creating success.txt to indicate benchmark failure."
334
+ fi
303
335
304
336
EOF
305
337
306
338
echo " Starter script finished execution on VM."
339
+
340
+ # The trap command will handle the cleanup on script exit.
0 commit comments