Untuk menguji performa baca dan tulis workload Google Kubernetes Engine (GKE) dari beberapa klien GKE, gunakan alat benchmark IOR. Petunjuk berikut menunjukkan cara mengotomatiskan penyiapan klien dan menggunakan IOR dengan mpirun melalui SSH tanpa sandi antara Pod Kubernetes untuk menguji I/O gabungan.
Prasyarat
Instance Managed Lustre sudah disediakan.
Lingkungan Docker lokal dikonfigurasi dan diautentikasi untuk mengirim ke Google Artifact Registry atau Container Registry (lihat Metode autentikasi).
Pastikan nilai
mtujaringan Anda ditetapkan ke8896.
Membuat cluster GKE
Untuk menguji performa, Anda memerlukan cluster GKE dengan driver CSI Managed Lustre diaktifkan. Untuk workload penyimpanan berperforma tinggi, konfigurasi node pool GKE Anda dengan kelompok mesin yang dioptimalkan untuk komputasi (misalnya, c2 atau c3) dan jaringan TIER_1.
Jalankan perintah berikut untuk membuat cluster GKE Standar yang dioptimalkan untuk pengujian performa:
gcloud container clusters create CLUSTER_NAME \
--zone=ZONE \
--machine-type=MACHINE_TYPE \
--addons=LustreCsiDriver \
--network-performance-configs=total-egress-bandwidth-tier=TIER_1 \
--network=NETWORK \
--num-nodes=NUM_NODES
Ganti ZONE dan NETWORK dengan nilai deployment spesifik Anda. Cluster harus berada di jaringan VPC yang sama dengan instance Managed Lustre Anda.
Pilih MACHINE_TYPE. Lihat Pertimbangan performa untuk mengetahui informasi tentang memilih jenis mesin guna mendapatkan throughput terbaik.
Jika jenis mesin Anda tidak mendukung jaringan TIER_1, hapus baris
--network-performance-configsdari perintah.Tentukan NUM_NODES. Untuk memenuhi sistem file Anda, kapasitas jaringan gabungan cluster Anda harus melebihi throughput yang disediakan sistem file Anda sebesar ~20%.
Untuk mesin dengan jaringan Tingkat 1 diaktifkan, satu node dapat mengirim antara 25 Gbps–200 Gbps (~3.000–25.000 MBps), bergantung pada kelompok VM dan jumlah CPU. Untuk instance standar, traffic keluar biasanya dibatasi sekitar 2 Gbps per vCPU.
Misalnya, jika kapasitas instance Managed Lustre Anda menghasilkan throughput teoretis sebesar 100.000 MBps, Anda memerlukan traffic keluar klien gabungan sebesar 120.000 MBps (
100,000 * 1.2) untuk memenuhinya:- Dengan instance standar: Jika setiap node memiliki traffic keluar yang dipublikasikan sebesar
2.000 MBps, Anda harus menyediakan setidaknya 60 node (
120,000 / 2,000). - Dengan jaringan Tingkat 1: Jika setiap node memiliki traffic keluar yang dipublikasikan sebesar
10.000 MBps (~80 Gbps), Anda harus menyediakan setidaknya 12 node
(
120,000 / 10,000).
- Dengan instance standar: Jika setiap node memiliki traffic keluar yang dipublikasikan sebesar
2.000 MBps, Anda harus menyediakan setidaknya 60 node (
Membuat Image Docker IOR
Buat image container dengan OpenMPI dan IOR terinstal. Kompilasi IOR dengan dukungan I/O Asinkron (AIO) untuk performa yang lebih baik.
Buat file bernama
Dockerfilesecara lokal:FROM ubuntu:22.04 # Prevent interactive prompts during installation ENV DEBIAN_FRONTEND=noninteractive # Install dependencies, SSH, and required Autotools packages RUN apt-get update && apt-get install -y \ openssh-server \ openmpi-bin \ libopenmpi-dev \ wget \ git \ make \ gcc \ g++ \ automake \ autoconf \ libtool \ pkg-config \ libaio-dev \ sudo \ && rm -rf /var/lib/apt/lists/* # Build IOR from source (version 4.0.0) with Asynchronous I/O (AIO) support RUN git clone -b 4.0.0 https://github.com/hpc/ior /tmp/ior \ && cd /tmp/ior \ && ./bootstrap \ && ./configure --disable-dependency-tracking --with-aio \ && make -j"$(nproc)" \ && make install \ && rm -rf /tmp/ior # Configure SSH for OpenMPI passwordless communication RUN mkdir /var/run/sshd RUN echo 'root:root' | chpasswd RUN sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config RUN sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config # SSH login fix so user isn't kicked out after container initialization RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]Bangun dan kirim image ini ke container registry pilihan Anda. Petunjuk dalam dokumen ini menggunakan Artifact Registry.
export IMAGE_TAG="gcr.io/PROJECT_ID/lustre-ior-benchmark:latest" docker build -t $IMAGE_TAG . docker push $IMAGE_TAG
Membuat Kunci SSH Tanpa Sandi untuk MPI
OpenMPI memerlukan komunikasi antar-node menggunakan SSH tanpa sandi. Buat kunci SSH dan simpan di Secret Kubernetes.
Buat kunci RSA:
ssh-keygen -t rsa -b 4096 -C "mpi-user" -N '' -f "./id_rsa"Buat Secret Kubernetes:
kubectl create secret generic mpi-ssh-secret \ --from-file=id_rsa=./id_rsa \ --from-file=id_rsa.pub=./id_rsa.pub \ --from-file=authorized_keys=./id_rsa.pub
Membuat Volume dan Klaim Persisten
Hubungkan pod GKE Anda ke instance Managed Lustre menggunakan penyediaan statis.
Buat file bernama
lustre-pv.yaml. Ganti kode berikut:- CAPACITY dengan kapasitas penyimpanan instance Anda dalam GiB.
- EXTENDED_LUSTRE_ID dengan ID Managed Lustre
Anda, dalam format PROJECT_ID/ZONE/INSTANCE_NAME.
Misalnya,
project-123/us-west1-a/my-lustre-instance. - LUSTRE_IP dengan alamat IP pemasangan instance Anda.
- FS_NAME dengan nama sistem file instance.
Nilai ini dapat diambil dengan perintah
gcloud lustre instances describe.apiVersion: v1 kind: PersistentVolume metadata: name: my-lustre-pv spec: storageClassName: "" claimRef: name: my-lustre-pvc namespace: default accessModes: - ReadWriteMany capacity: storage: CAPACITYGi # retain `Gi` suffix persistentVolumeReclaimPolicy: Retain volumeMode: Filesystem csi: driver: lustre.csi.storage.gke.io volumeHandle: EXTENDED_LUSTRE_ID # project-name/zone/instance-name volumeAttributes: ip: LUSTRE_IP filesystem: FS_NAME --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-lustre-pvc spec: storageClassName: "" volumeName: my-lustre-pv accessModes: - ReadWriteMany resources: requests: storage: CAPACITYGiTerapkan manifes:
kubectl apply -f lustre-pv.yaml
Men-deploy Pekerja MPI
Untuk menskalakan tugas IOR di beberapa node, deploy a
StatefulSet dengan
image benchmark Anda.
Buat file bernama
mpi-workers.yaml. Tentukan PROJECT_ID, dan tetapkan NUM_NODES ke jumlah node di cluster Anda.apiVersion: v1 kind: Service metadata: name: mpi-workers labels: app: mpi-worker spec: clusterIP: None selector: app: mpi-worker ports: - port: 22 name: ssh --- apiVersion: apps/v1 kind: StatefulSet metadata: name: mpi-worker spec: serviceName: "mpi-workers" replicas: NUM_NODES selector: matchLabels: app: mpi-worker template: metadata: labels