בדוגמאות שבקטע הזה מוצגות פקודות נפוצות שמומלץ להשתמש בהן כדי להעריך את הביצועים באמצעות הכלי IOR benchmark (github).
לפני שמתקינים את IOR, צריך להתקין את MPI כדי לבצע סנכרון בין תהליכי השוואה. מומלץ להשתמש בקובץ האימג' של HPC למכונות וירטואליות של לקוחות, שכולל כלים להתקנת Intel MPI 2021. ללקוחות Ubuntu, מומלץ להשתמש ב-openmpi.
בדיקת ביצועי הרשת
לפני שמריצים את IOR, כדאי לוודא שקצב העברת הנתונים ברשת הוא כמו שציפיתם. אם יש לכם שתי מכונות וירטואליות של לקוח, אתם יכולים להשתמש בכלי שנקרא iperf כדי לבדוק את הרשת ביניהן.
מתקינים את iperf בשתי המכונות הווירטואליות:
HPC Rocky 8
sudo dnf -y install iperf
Ubuntu
sudo apt install -y iperf
מפעילים שרת iperf באחת מהמכונות הווירטואליות:
iperf -s -w 100m -P 30
מפעילים לקוח iperf במכונה הווירטואלית השנייה:
iperf -c <IP ADDRESS OF iperf server VM> -w 100m -t 30s -P 30
בודקים את מספר התפוקה של הרשת בין המכונות הווירטואליות. כדי להשיג את הביצועים הכי טובים בלקוח יחיד, חשוב להשתמש ברשת ברמה 1.
ביצועים של מכונה וירטואלית יחידה
בהוראות הבאות מפורטים השלבים והמדדים למדידת הביצועים של מכונה וירטואלית יחידה. הבדיקות מריצות כמה תהליכי קלט/פלט אל Parallelstore וממנו, במטרה להגיע לניצול מלא של כרטיס רשת (NIC).
התקנת Intel MPI
HPC Rocky 8
sudo google_install_intelmpi --impi_2021
כדי לציין את מחסנית הרשת הנכונה של libfabric, מגדירים את המשתנה הבא בסביבה:
export I_MPI_OFI_LIBRARY_INTERNAL=0
לאחר מכן:
source /opt/intel/setvars.sh
Ubuntu
sudo apt install -y autoconf
sudo apt install -y pkg-config
sudo apt install -y libopenmpi-dev
sudo apt install -y make
התקנה של IOR
כדי להתקין את IOR:
git clone https://github.com/hpc/ior.git
cd ior
./bootstrap
./configure
make
sudo make install
מריצים את פקודות ה-IOR
מריצים את הפקודות הבאות של IOR. כדי לראות את מספרי הביצועים הצפויים, אפשר לעיין בסקירה הכללית של Parallelstore.
מיקסום הביצועים מתוך מכונה וירטואלית אחת של לקוח
HPC Rocky 8
mpirun -genv LD_PRELOAD="/usr/lib64/libioil.so" -ppn 1 \
--bind-to socket ior \
-o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
-w -r -e -F -t "1m" -b "8g"
Ubuntu
mpirun --oversubscribe -x LD_PRELOAD="/usr/lib64/libioil.so" -n 1 \
ior -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
-w -r -e -F -t "1m" -b "8g"
כאשר:
-
ior: נתונים בפועל להשוואה לשוק. צריך לוודא שהקובץ זמין בנתיב או לספק את הנתיב המלא. -
-ppn: מספר התהליכים (העבודות) להרצה. מומלץ להתחיל עם1ואז להגדיל את המספר עד למספר המעבדים הווירטואליים כדי להשיג את הביצועים המצטברים המקסימליים. -
-O useO_DIRECT=1: כופה שימוש בקלט/פלט ישיר כדי לעקוף את מטמון הדפים ולמנוע קריאה של נתונים במטמון. -
-genv LD_PRELOAD="/usr/lib64/libioil.so": שימוש בספריית היירוט של DAOS. האפשרות הזו מספקת את הביצועים הכי טובים, אבל היא לא משתמשת במטמון הדפים של Linux כדי לאחסן נתונים. המטא-נתונים עדיין נשמרים במטמון. -
-w: ביצוע פעולות כתיבה לקבצים בודדים. -
-r: ביצוע קריאות. -
-e: ביצוע fsync בסיום פעולות הכתיבה. -
-F: שימוש בקבצים בודדים. -
-t "1m": קריאה וכתיבה של נתונים בחלקים בגודל שצוין. גודלי מקטעים גדולים יותר מובילים לביצועים טובים יותר של קלט/פלט (I/O) בסטרימינג של thread יחיד. -
-b "8g"– הגודל של כל קובץ
מספר ה-IOps המקסימלי ממכונה וירטואלית (VM) של לקוח יחיד
HPC Rocky 8
mpirun -genv LD_PRELOAD="/usr/lib64/libioil.so" -ppn 80 \
--bind-to socket ior \
-o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
-w -r -e -F -t "4k" -b "1g"
Ubuntu
mpirun --oversubscribe -x LD_PRELOAD="/usr/lib64/libioil.so" -n 80 \
ior -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
-w -r -e -F -t "4k" -b "1g"
ביצועים מקסימליים משרשור יחיד של אפליקציה
HPC Rocky 8
mpirun -genv LD_PRELOAD="/usr/lib64/libioil.so" -ppn 1 \
--bind-to socket ior \
-o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
-w -r -e -F -t "32m" -b "64g"
Ubuntu
mpirun -x LD_PRELOAD="/usr/lib64/libioil.so" -n 1 \
ior -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
-w -r -e -F -t "32m" -b "64g"
זמן אחזור קצר של קלט/פלט משרשור של אפליקציה אחת
HPC Rocky 8
mpirun -genv LD_PRELOAD="/usr/lib64/libioil.so" -ppn 1 \
--bind-to socket ior \
-o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
-z -w -r -e -F -t "4k" -b "100m"
Ubuntu
mpirun -x LD_PRELOAD="/usr/lib64/libioil.so" -n 1 \
ior -o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
-z -w -r -e -F -t "4k" -b "100m"
בדיקות ביצועים של כמה מכונות וירטואליות
כדי להגיע למגבלות של מופעי Parallelstore, חשוב לבדוק את מצטבר קלט/פלט שאפשר להשיג באמצעות קלט/פלט מקביל ממכונות וירטואליות מרובות. בקטע הזה מוסבר איך לעשות את זה באמצעות mpirun ו-ior.
במדריך IOR מפורטות כל האפשרויות שיכולות לעזור לכם לבצע בדיקות על קבוצה גדולה יותר של צמתים. שימו לב שיש מגוון דרכים להפעיל מכונות וירטואליות של לקוחות לבדיקות מרובות לקוחות, למשל באמצעות מתזמנים כמו Batch, Slurm או באמצעות פקודות בכמות גדולה של Compute Engine. בנוסף, HPC Toolkit יכול לעזור ליצור תבניות לפריסת צמתי מחשוב.
במדריך הזה נשתמש בשלבים הבאים כדי לפרוס כמה מופעי לקוח שהוגדרו לשימוש ב-Parallelstore:
- יוצרים מפתח SSH כדי להגדיר משתמש בכל מכונה וירטואלית של לקוח. אם הפעלתם את הדרישה ל-OS Login בפרויקט, אתם צריכים להשבית אותה.
- מקבלים את נקודות הגישה של מופע Parallelstore.
- יוצרים סקריפט לטעינה בזמן ההפעלה כדי לפרוס אותו בכל מכונות הלקוח.
- יוצרים את מכונות ה-VM ב-Compute Engine בכמות גדולה באמצעות סקריפט לטעינה בזמן ההפעלה והמפתח.
- מעתיקים את המפתחות ואת קובצי המארח שנדרשים להרצת הבדיקות.
פרטים על כל שלב מופיעים בקטעים הבאים.
הגדרה של משתני סביבה
בפקודות לדוגמה במסמך הזה נעשה שימוש במשתני הסביבה הבאים:
export SSH_USER="daos-user"
export CLIENT_PREFIX="daos-client-vm"
export NUM_CLIENTS=10
מעדכנים את הערכים האלה לערכים הרצויים.
יצירת מפתח SSH
יוצרים מפתח SSH ושומרים אותו באופן מקומי כדי להפיץ אותו למכונות הווירטואליות של הלקוח. המפתח משויך למשתמש ה-SSH שצוין במשתני הסביבה, וייווצר בכל מכונה וירטואלית:
# Generate an SSH key for the specified user
ssh-keygen -t rsa -b 4096 -C "${SSH_USER}" -N '' -f "./id_rsa"
chmod 600 "./id_rsa"
#Create a new file in the format [user]:[public key] user
echo "${SSH_USER}:$(cat "./id_rsa.pub") ${SSH_USER}" > "./keys.txt"
קבלת פרטי הרשת של Parallelstore
מקבלים את כתובות ה-IP של שרת Parallelstore בפורמט שניתן לשימוש על ידי סוכן daos:
export ACCESS_POINTS=$(gcloud beta parallelstore instances describe INSTANCE_NAME \
--location LOCATION \
--format "value[delimiter=', '](format("{0}", accessPoints))")
מקבלים את שם הרשת שמשויך למופע Parallelstore:
export NETWORK=$(gcloud beta parallelstore instances describe INSTANCE_NAME \
--location LOCATION \
--format "value[delimiter=', '](format('{0}', network))" | awk -F '/' '{print $NF}')
יצירת סקריפט לטעינה בזמן ההפעלה
סקריפט לטעינה בזמן ההפעלה מצורף למכונה הווירטואלית ויופעל בכל פעם שהמערכת תופעל. סקריפט לטעינה בזמן ההפעלה עושה את הפעולות הבאות:
- הגדרת סוכן ה-DAO
- התקנה של הספריות הנדרשות
- מבצעת הרכבה של מופע Parallelstore אל
/tmp/parallelstore/בכל מכונה וירטואלית - התקנת כלי בדיקה של הביצועים
אפשר להשתמש בסקריפט הזה כדי לפרוס את האפליקציות המותאמות אישית שלכם בכמה מכונות. עורכים את הקטע שקשור לקוד ספציפי לאפליקציה בסקריפט.
הסקריפט הבא פועל במכונות וירטואליות שמריצות HPC Rocky 8.
# Create a startup script that configures the VM
cat > ./startup-script << EOF
sudo tee /etc/yum.repos.d/parallelstore-v2-6-el8.repo << INNEREOF
[parallelstore-v2-6-el8]
name=Parallelstore EL8 v2.6
baseurl=https://us-central1-yum.pkg.dev/projects/parallelstore-packages/v2-6-el8
enabled=1
repo_gpgcheck=0
gpgcheck=0
INNEREOF
sudo dnf makecache
# 2) Install daos-client
dnf install -y epel-release # needed for capstone
dnf install -y daos-client
# 3) Upgrade libfabric
dnf upgrade -y libfabric
systemctl stop daos_agent
mkdir -p /etc/daos
cat > /etc/daos/daos_agent.yml << INNEREOF
access_points: ${ACCESS_POINTS}
transport_config:
allow_insecure: true
fabric_ifaces:
- numa_node: 0
devices:
- iface: eth0
domain: eth0
INNEREOF
echo -e "Host *\n\tStrictHostKeyChecking no\n\tUserKnownHostsFile /dev/null" > /home/${SSH_USER}/.ssh/config
chmod 600 /home/${SSH_USER}/.ssh/config
usermod -u 2000 ${SSH_USER}
groupmod -g 2000 ${SSH_USER}
chown -R ${SSH_USER}:${SSH_USER} /home/${SSH_USER}
chown -R daos_agent:daos_agent /etc/daos/
systemctl enable daos_agent
systemctl start daos_agent
mkdir -p /tmp/parallelstore
dfuse -m /tmp/parallelstore --pool default-pool --container default-container --disable-wb-cache --thread-count=16 --eq-count=8 --multi-user
chmod 777 /tmp/parallelstore
#Application specific code
#Install Intel MPI:
sudo google_install_intelmpi --impi_2021
export I_MPI_OFI_LIBRARY_INTERNAL=0
source /opt/intel/setvars.sh
#Install IOR
git clone https://github.com/hpc/ior.git
cd ior
./bootstrap
./configure
make
make install
EOF
יצירת מכונות וירטואליות של לקוחות
הביצועים הכוללים של עומסי העבודה תלויים בסוגי המכונות של הלקוח.
בדוגמה הבאה נעשה שימוש במכונות וירטואליות מסוג c2-standard-30. כדי לשפר את הביצועים באמצעות כרטיסי רשת מהירים יותר, צריך לשנות את הערך machine-type. פרטים על סוגי המכונות הזמינים מופיעים במאמר השוואה בין משפחות של מכונות ומשאבים.
כדי ליצור כמות גדולה של מכונות וירטואליות, משתמשים בפקודה gcloud compute instances create:
gcloud compute instances bulk create \
--name-pattern="${CLIENT_PREFIX}-####" \
--zone="LOCATION" \
--machine-type="c2-standard-30" \
--network-interface=subnet=${NETWORK},nic-type=GVNIC \
--network-performance-configs=total-egress-bandwidth-tier=TIER_1 \
--create-disk=auto-delete=yes,boot=yes,device-name=client-vm1,image=projects/cloud-hpc-image-public/global/images/hpc-rocky-linux-8-v20240126,mode=rw,size=100,type=pd-balanced \
--metadata=enable-oslogin=FALSE \
--metadata-from-file=ssh-keys=./keys.txt,startup-script=./startup-script \
--count ${NUM_CLIENTS}
העתקת מפתחות וקבצים
מאחזרים ושומרים את כתובות ה-IP הפרטיות והציבוריות של כל המכונות הווירטואליות.
כתובות IP פרטיות:
gcloud compute instances list --filter="name ~ '^${CLIENT_PREFIX}*'" --format="csv[no-heading](INTERNAL_IP)" > hosts.txtכתובות IP ציבוריות:
gcloud compute instances list --filter="name ~ '^${CLIENT_PREFIX}*'" --format="csv[no-heading](EXTERNAL_IP)" > external_ips.txtמעתיקים את המפתח הפרטי כדי לאפשר SSH בין צמתים ללא סיסמה. הפעולה הזו נדרשת לבדיקת IOR באמצעות SSH כדי לתזמן מכונות.
while IFS= read -r IP do echo "Copying id_rsa to ${SSH_USER}@$IP" scp -i ./id_rsa -o StrictHostKeyChecking=no ./id_rsa ${SSH_USER}@$IP:~/.ssh/ done < "./external_ips.txt"מאחזרים את כתובת ה-IP של הצומת הראשון ומעתיקים את רשימת כתובות ה-IP הפנימיות לצומת הזה. זה יהיה צומת הראש של הרצת הבדיקה.
export HEAD_NODE=$(head -n 1 ./external_ips.txt) scp -i ./id_rsa -o "StrictHostKeyChecking=no" -o UserKnownHostsFile=/dev/null ./hosts.txt ${SSH_USER}@${HEAD_NODE}:~
הרצת פקודות IOR בכמה מכונות וירטואליות
מתחברים לצומת הראשי עם המשתמש שצוין:
ssh -i ./id_rsa -o "StrictHostKeyChecking=no" -o UserKnownHostsFile=/dev/null ${SSH_USER}@${HEAD_NODE}
לאחר מכן:
source /opt/intel/setvars.sh
export I_MPI_OFI_LIBRARY_INTERNAL=0
export D_LOG_MASK=INFO
export D_LOG_FILE_APPEND_PID=1
rm -f /tmp/client.log.*
export D_LOG_FILE=/tmp/client.log
ביצועים מקסימליים ממכונות וירטואליות מרובות של לקוחות
בדיקת הביצועים בתרחיש של ריבוי תהליכים וקצב העברת נתונים מקסימלי.
mpirun -f hosts.txt -genv LD_PRELOAD="/usr/lib64/libioil.so" -ppn 30 \
--bind-to socket ior \
-o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
-w -r -e -F -t "1m" -b "8g"
מקסימום פעולות קלט/פלט בשנייה ממכונות וירטואליות מרובות של לקוחות
בדיקת הביצועים בתרחיש של ריבוי תהליכים ומקסימום IOPs.
mpirun -f hosts.txt -genv LD_PRELOAD="/usr/lib64/libioil.so" -ppn 30 \
--bind-to socket ior \
-o "/tmp/parallelstore/test" -O useO_DIRECT=1 \
-w -r -e -F -t "4k" -b "1g"
הסרת המשאבים
מבטלים את הטעינה של קונטיינר DAOS:
sudo umount /tmp/parallelstore/מוחקים את מכונת Parallelstore:
CLI של gcloud
gcloud beta parallelstore instances delete INSTANCE_NAME --location=LOCATIONREST
curl -X DELETE -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://parallelstore.googleapis.com/v1beta/projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_NAMEמחיקת המכונות הווירטואליות ב-Compute Engine: