Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions cloudbuild/backup.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
gcloud compute instances create
py-sdk-micro-benchmarks-ci-test-2
--project=gcs-aiml-clients-testing-101
--zone=us-central1-a
--machine-type=c4-standard-192
--network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=default
--metadata=enable-osconfig=TRUE,enable-oslogin=TRUE
--maintenance-policy=MIGRATE
--provisioning-model=STANDARD
--service-account=gcsfs-perf-ci-runner@gcs-aiml-clients-testing-101.iam.gserviceaccount.com
--scopes=https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/devstorage.read_write
--tags=allow-ssh,http-server,https-server,lb-health-check
--create-disk=auto-delete=yes,boot=yes,device-name=py-sdk-micro-benchmarks-ci-test,disk-resource-policy=projects/gcs-aiml-clients-testing-101/regions/us-central1/resourcePolicies/default-schedule-1,image=projects/ubuntu-os-cloud/global/images/ubuntu-2204-jammy-v20251120,mode=rw,provisioned-iops=3600,provisioned-throughput=290,size=100,type=hyperdisk-balanced
--no-shielded-secure-boot
--shielded-vtpm
--shielded-integrity-monitoring
--labels=goog-ops-agent-policy=v2-x86-template-1-4-0,goog-ec-src=vm_add-gcloud
--reservation-affinity=any
--network-performance-configs=total-egress-bandwidth-tier=TIER_1
111 changes: 111 additions & 0 deletions cloudbuild/micro_benchmarks.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
substitutions:
_REGION: "us-central1"
_ZONE: "us-central1-a"
_SHORT_BUILD_ID: ${BUILD_ID:0:8}
_VM_NAME: "py-sdk-micro-benchmarks-ci-${_SHORT_BUILD_ID}"
_ULIMIT: "10000" # 10k, for gRPC bidi streams
_BENCHMARK_SCRIPT: "run_micro_benchmarks.sh"



steps:
# Step 0: Generate a persistent SSH key for this build run.
# This prevents gcloud from adding a new key to the OS Login profile on every ssh/scp command.
- name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
id: "generate-ssh-key"
entrypoint: "bash"
args:
- "-c"
- |
mkdir -p /workspace/.ssh
# Generate the SSH key
ssh-keygen -t rsa -f /workspace/.ssh/google_compute_engine -N '' -C gcb
# Save the public key content to a file for the cleanup step
cat /workspace/.ssh/google_compute_engine.pub > /workspace/gcb_ssh_key.pub
waitFor: ["-"]

# Step 1 Create a GCE VM to run the tests.
# The VM is created in the same zone as the buckets to test rapid storage features.
# It's given the 'cloud-platform' scope to allow it to access GCS and other services.
- name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
id: "create-vm"
entrypoint: "gcloud"
args:
- "compute"
- "instances"
- "create"
- "${_VM_NAME}"
- "--project=${PROJECT_ID}"
- "--zone=${_ZONE}"
- "--machine-type=c4-standard-192"
- "--network-interface=network-tier=PREMIUM,nic-type=GVNIC,stack-type=IPV4_ONLY,subnet=default"
- "--metadata=enable-osconfig=TRUE,enable-oslogin=TRUE"
- "--maintenance-policy=MIGRATE"
- "--provisioning-model=STANDARD"
- "--service-account=${_ZONAL_VM_SERVICE_ACCOUNT}"
- "--scopes=https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/devstorage.read_write"
- "--tags=allow-ssh,http-server,https-server,lb-health-check"
- "--create-disk=auto-delete=yes,boot=yes,device-name=${_VM_NAME},disk-resource-policy=projects/${PROJECT_ID}/regions/${_REGION}/resourcePolicies/default-schedule-1,image=projects/ubuntu-os-cloud/global/images/ubuntu-2204-jammy-v20251120,mode=rw,provisioned-iops=3600,provisioned-throughput=290,size=100,type=hyperdisk-balanced"
- "--no-shielded-secure-boot"
- "--shielded-vtpm"
- "--shielded-integrity-monitoring"
- "--labels=goog-ops-agent-policy=v2-x86-template-1-4-0,goog-ec-src=vm_add-gcloud"
- "--reservation-affinity=any"
- "--network-performance-configs=total-egress-bandwidth-tier=TIER_1"
waitFor: ["-"]

# Step 2: Run the integration tests inside the newly created VM and cleanup.
# This step uses 'gcloud compute ssh' to execute a remote script.
# The VM is deleted after tests are run, regardless of success.
- name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
id: "run-tests-and-delete-vm"
entrypoint: "bash"
args:
- "-c"
- |
set -e
# Wait for the VM to be fully initialized and SSH to be ready.
for i in {1..10}; do
if gcloud compute ssh ${_VM_NAME} --zone=${_ZONE} --internal-ip --ssh-key-file=/workspace/.ssh/google_compute_engine --command="echo VM is ready"; then
break
fi
echo "Waiting for VM to become available... (attempt $i/10)"
sleep 15
done
# copy the script to the VM
gcloud compute scp cloudbuild/${_BENCHMARK_SCRIPT} ${_VM_NAME}:~ --zone=${_ZONE} --internal-ip --ssh-key-file=/workspace/.ssh/google_compute_engine

# Execute the script on the VM via SSH.
# Capture the exit code to ensure cleanup happens before the build fails.
set +e
gcloud compute ssh ${_VM_NAME} --zone=${_ZONE} --internal-ip --ssh-key-file=/workspace/.ssh/google_compute_engine --command="ulimit -n {_ULIMIT}; COMMIT_SHA=${COMMIT_SHA} _ZONAL_BUCKET=${_ZONAL_BUCKET} _PR_NUMBER=${_PR_NUMBER} bash ${_BENCHMARK_SCRIPT}"
EXIT_CODE=$?
set -e

echo "--- Deleting GCE VM ---"
gcloud compute instances delete "${_VM_NAME}" --zone=${_ZONE} --quiet

# Exit with the original exit code from the test script.
exit $$EXIT_CODE
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The expression $$EXIT_CODE is incorrect. $$ expands to the process ID of the current shell, so this command will effectively try to exit with a code like 123$?. You should use $EXIT_CODE to correctly use the captured exit code from the test script.

        exit $EXIT_CODE

waitFor:
- "create-vm"
- "generate-ssh-key"

- name: "gcr.io/google.com/cloudsdktool/cloud-sdk"
id: "cleanup-ssh-key"
entrypoint: "bash"
args:
- "-c"
- |
echo "--- Removing SSH key from OS Login profile to prevent accumulation ---"
gcloud compute os-login ssh-keys remove \
--key-file=/workspace/gcb_ssh_key.pub || true
waitFor:
- "run-tests-and-delete-vm"

timeout: "3600s" # 60 minutes

options:
logging: CLOUD_LOGGING_ONLY
pool:
name: "projects/${PROJECT_ID}/locations/us-central1/workerPools/cloud-build-worker-pool"
32 changes: 32 additions & 0 deletions cloudbuild/run_micro_benchmarks.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@

set -euxo pipefail
echo '--- Installing git and cloning repository on VM ---'
sudo apt-get update && sudo apt-get install -y git python3-pip python3-venv

# Clone the repository and checkout the specific commit from the build trigger.
git clone https://github.com/googleapis/python-storage.git
cd python-storage
git fetch origin "refs/pull/${_PR_NUMBER}/head"
git checkout ${COMMIT_SHA}


echo '--- Installing Python and dependencies on VM ---'
python3 -m venv env
source env/bin/activate

echo 'Install testing libraries explicitly, as they are not in setup.py'
pip install --upgrade pip
pip install pytest pytest-timeout pytest-subtests pytest-asyncio
pip install google-cloud-testutils google-cloud-kms
pip install -e ".[grpc,testing]"

echo '--- Setting up environment variables on VM ---'
export ZONAL_BUCKET=${_ZONAL_BUCKET}
export RUN_ZONAL_SYSTEM_TESTS=True
CURRENT_ULIMIT=$(ulimit -n)
echo '--- Running Zonal tests on VM with ulimit set to ---' $CURRENT_ULIMIT
pytest -vv -s \
--log-format='%(asctime)s %(levelname)s %(message)s' \
--log-date-format='%H:%M:%S' \
--benchmark-json=output.json \
-vv -s tests/perf/microbenchmarks/reads/test_reads.py::test_downloads_single_proc_single_coro
Comment on lines +28 to +32
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The pytest command has duplicated flags (-vv and -s). While this doesn't cause an error, it's redundant. Additionally, only a single test function is being run. Given that the benchmark configuration in config.yaml has been scaled down, it would be beneficial to run all tests in test_reads.py to get broader benchmark coverage in CI.

Suggested change
pytest -vv -s \
--log-format='%(asctime)s %(levelname)s %(message)s' \
--log-date-format='%H:%M:%S' \
--benchmark-json=output.json \
-vv -s tests/perf/microbenchmarks/reads/test_reads.py::test_downloads_single_proc_single_coro
pytest -vv -s \
--log-format='%(asctime)s %(levelname)s %(message)s' \
--log-date-format='%H:%M:%S' \
--benchmark-json=output.json \
tests/perf/microbenchmarks/reads/test_reads.py

8 changes: 4 additions & 4 deletions tests/perf/microbenchmarks/reads/config.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
common:
bucket_types:
- "regional"
# - "regional"
- "zonal"
file_sizes_mib:
- 1024 # 1GiB
chunk_sizes_mib: [100]
rounds: 10
- 100 # 1GiB
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The comment # 1GiB is no longer accurate since the file size has been changed to 100 MiB. Please update the comment to reflect the new value to avoid confusion.

    - 100 # 100MiB

chunk_sizes_mib: [10]
rounds: 3

workload:

Expand Down