성능 테스트

이 섹션의 예에서는 IOR 벤치마크(github) 도구를 사용하여 성능을 평가하는 데 권장되는 일반적인 명령어를 보여줍니다.

IOR를 설치하기 전에 벤치마킹 프로세스 간의 동기화를 위해 MPI를 설치해야 합니다. 클라이언트 VM에는 Intel MPI 2021을 설치하는 도구가 포함된 HPC 이미지를 사용하는 것이 좋습니다. Ubuntu 클라이언트의 경우 openmpi를 사용하는 것이 좋습니다.

네트워크 성능 확인하기

IOR를 실행하기 전에 네트워크에 예상 처리량이 있는지 확인하는 것이 좋습니다. 클라이언트 VM이 두 대인 경우 iperf라는 도구를 사용하여 두 VM 간의 네트워크를 테스트할 수 있습니다.

두 VM 모두에 iperf를 설치합니다.

HPC Rocky 8

sudo dnf -y install iperf

Ubuntu

sudo apt install -y iperf

VM 중 하나에서 iperf 서버를 시작합니다.

iperf -s -w 100m -P 30

다른 VM에서 iperf 클라이언트를 시작합니다.

iperf -c <IP ADDRESS OF iperf server VM> -w 100m -t 30s -P 30

VM 간의 네트워크 처리량 수를 확인합니다. 단일 클라이언트 성능을 최대화하려면 Tier_1 네트워킹을 사용하세요.

단일 VM 성능

다음 안내는 단일 VM 성능을 측정하는 단계와 벤치마크를 제공합니다. 이 테스트는 네트워크 인터페이스 카드 (NIC)를 포화시키기 위해 Parallelstore에서 여러 I/O 프로세스를 실행합니다.

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 개요를 참고하세요.

단일 클라이언트 VM의 최대 성능

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로 시작한 다음 vCPU 수까지 늘리는 것이 좋습니다.
  • -O useO_DIRECT=1: 직접 I/O를 사용하여 페이지 캐시를 우회하고 캐시된 데이터를 읽지 않습니다.
  • -genv LD_PRELOAD="/usr/lib64/libioil.so": DAOS 가로채기 라이브러리를 사용합니다. 이 옵션은 가장 높은 원시 성능을 제공하지만 데이터의 Linux 페이지 캐시를 우회합니다. 메타데이터는 여전히 캐시됩니다.
  • -w: 개별 파일에 쓰기를 실행합니다.
  • -r: 읽기를 실행합니다.
  • -e: 쓰기가 완료되면 fsync를 실행합니다.
  • -F: 개별 파일을 사용합니다.
  • -t "1m": 지정된 크기의 청크로 데이터를 읽고 씁니다. 청크 크기가 클수록 단일 스레드 스트리밍 I/O 성능이 향상됩니다.
  • -b "8g" - 각 파일의 크기

단일 클라이언트 VM의 최대 IOPS

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"

단일 애플리케이션 스레드의 짧은 I/O 지연 시간

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"

다중 VM 성능 테스트

Parallelstore 인스턴스의 한도에 도달하려면 여러 VM의 병렬 I/O로 달성할 수 있는 총괄 I/O를 테스트하는 것이 중요합니다. 이 섹션의 안내는 mpirunior를 사용하여 이를 수행하는 방법에 관한 세부정보와 명령어를 제공합니다.

더 많은 노드에서 테스트하는 데 유용한 전체 옵션은 IOR 가이드를 참고하세요. 멀티클라이언트 테스트를 위해 클라이언트 VM을 실행하는 방법에는 Batch, Slurm과 같은 스케줄러를 사용하거나 Compute Engine 일괄 명령어를 사용하는 등 다양한 방법이 있습니다. 또한 HPC Toolkit을 사용하여 컴퓨팅 노드를 배포하는 템플릿을 빌드할 수 있습니다.

이 가이드에서는 다음 단계에 따라 Parallelstore를 사용하도록 구성된 여러 클라이언트 인스턴스를 배포합니다.

  1. 각 클라이언트 VM에서 사용자를 설정하는 데 사용할 SSH 키를 만듭니다. 프로젝트에서 OS 로그인이 사용 설정된 경우 OS 로그인 요구사항을 사용 중지해야 합니다.
  2. Parallelstore 인스턴스의 액세스 포인트를 가져옵니다.
  3. 모든 클라이언트 인스턴스에 배포할 시작 스크립트를 만듭니다.
  4. 시작 스크립트와 키를 사용하여 Compute Engine VM을 일괄 만들기
  5. 테스트를 실행하는 데 필요한 키와 호스트 파일을 복사합니다.

각 단계에 대한 세부정보는 다음 섹션을 참고하세요.

환경 변수 설정하기

이 문서의 예시 명령어에는 다음 환경 변수가 사용됩니다.

export SSH_USER="daos-user"
export CLIENT_PREFIX="daos-client-vm"
export NUM_CLIENTS=10

원하는 값으로 업데이트합니다.

SSH 키 만들기

SSH 키를 만들고 로컬에 저장하여 클라이언트 VM에 배포합니다. 키는 환경 변수에 지정된 SSH 사용자와 연결되며 각 VM에서 생성됩니다.

# 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 네트워크 세부정보 가져오기

daos 에이전트에서 사용할 수 있는 형식으로 Parallelstore 서버 IP 주소를 가져옵니다.

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}')

시작 스크립트 만들기

시작 스크립트는 VM에 연결되며 시스템이 시작될 때마다 실행됩니다. 시작 스크립트는 다음을 실행합니다.

  • daos 에이전트를 구성합니다.
  • 필수 라이브러리 설치
  • 각 VM의 /tmp/parallelstore/에 Parallelstore 인스턴스를 마운트합니다.
  • 성능 테스트 도구 설치

이 스크립트는 맞춤 애플리케이션을 여러 머신에 배포하는 데 사용할 수 있습니다. 스크립트에서 애플리케이션별 코드와 관련된 섹션을 수정합니다.

다음 스크립트는 HPC Rocky 8을 실행하는 VM에서 작동합니다.

# 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

클라이언트 VM 만들기

워크로드의 전반적인 성능은 클라이언트 머신 유형에 따라 다릅니다. 다음 예에서는 c2-standard-30 VM을 사용합니다. machine-type 값을 수정하여 더 빠른 NIC로 성능을 높입니다. 사용 가능한 머신 유형에 관한 자세한 내용은 머신 계열 리소스 및 비교 가이드를 참고하세요.

VM 인스턴스를 일괄 생성하려면 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}

키 및 파일 복사

  1. 모든 VM의 비공개 및 공개 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
    
  2. 비공개 키를 복사하여 노드 간 비밀번호 없는 SSH를 허용합니다. SSH를 사용하여 머신을 조정하는 IOR 테스트에 필요합니다.

    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"
    
  3. 첫 번째 노드의 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}:~
    

여러 VM에서 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

여러 클라이언트 VM의 최대 성능

다중 프로세스, 최대 처리량 시나리오에서 성능을 테스트합니다.

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"

여러 클라이언트 VM의 최대 IOPS

다중 프로세스, 최대 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"

삭제

  1. DAOS 컨테이너를 마운트 해제합니다.

    sudo umount /tmp/parallelstore/
    
  2. Parallelstore 인스턴스를 삭제합니다.

    gcloud CLI

    gcloud beta parallelstore instances delete INSTANCE_NAME --location=LOCATION
    

    REST

    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
    
  3. Compute Engine VM을 삭제합니다.