Intel Hyper-Threading Technology 사용 안함
인프라 구성 및 애플리케이션 설정에 필요한 경우 게스트 가상 머신에서 Intel Hyper-Threading Technology(Intel HT Technology)를 사용 안함으로 설정할 수 있습니다.
게스트 VM에서 Intel Hyper-Threading Technology를 사용 안함으로 설정하는 이 주제에 대한 지시사항은 Intel 기반 프로세서를 사용하는 호스트에 프로비저닝된 가상 서버에만 적용됩니다.
Intel Hyper-Threading Technology를 사용하지 않는 이유 이해
Intel Hyper-Threading Technology는 동시 멀티스레딩(SMT)을 설명하는 용어입니다. Hyper-Threading Technology는 각 실제 코어를 두 개의 가상 프로세서로 분할합니다. Hyper-Threading Technology는 1차선인 넓은 도로를 상대적으로 좁은 2차선으로 만드는 것과 같습니다. 2차선 고속도로는 느리고 빠르게 움직이는 차량이 있는 경우 1차선 도로보다 더 나은 서비스를 제공합니다. Hyper-Threading Technology 기술은 파일 I/O, 네트워크 I/O 및 CPU 중심 오퍼레이션과 함께 사용되는 기타 느린 오퍼레이션이 있는 경우 더욱 나은 애플리케이션 성능을 제공합니다. Hyper-Threading Technology의 성능은 일반적으로 단일 스레드 모드보다 0 - 30% 뛰어납니다. 일부 애플리케이션에서는 성능 저하가 발생할 수도 있습니다.
Hyper-Threading Technology이 항상 적합한 것은 아닙니다. 해당 경우, Hyper-Threading Technology를 사용 안함으로 설정하고 단일 스레드 모드에서 코어를 실행하는 것을 선호합니다. Hyper-Threading Technology를 사용 안함으로 설정하도록 고려하는 세 가지 주요 이유는 다음과 같습니다. 첫 번째 이유는 소프트웨어 라이센스 부여와 관련이 있습니다. EDA(Electronic Design Automation) 도구 재공자와 같은 많은 레거시 소프트웨어 공급자는 Hyper-Threading Technology를 사용하는지 아니면 단일 스레드 모드를 사용하는지 여부에 관계 없이 CPU마다 라이센스를 요구합니다. 코어가 Hyper-Threading Technology 모드에 있는 경우에는 애플리케이션이 단일 스레드 모드보다 2배 이상 성능이 향상되지 않더라도 단일 스레드 모드에서 수행할 때보다 두 배 많은 라이센스가 필요합니다. 결과적으로 EDA 및 기타 실무자들은 Hyper-Threading Technology을 사용하지 않으며 단일 스레드 모드에서 소프트웨어를 실행하는 것을 선호합니다.
Hyper-Threading Technology를 사용 안함으로 설정하는 두 번째 이유는 Hyper-Threading Technology로 인해 발생하는 로드 밸런싱 문제 및 운영 체제 오버헤드를 방지하기 위함입니다. 고성능 컴퓨팅(HPC) 애플리케이션은 일반적으로 실제 코어 만큼의 메시지 전달 인터페이스(MPI) 태스크를 작성하고 운영 체제가 개별적인 실제 코어에서 각 MPI 태스크를 관리하도록 합니다. Hyper-Threading Technology를 사용으로 설정하면 운영 체제에는 두 배 많은 CPU가 발생합니다. 일반적으로 운영 체제는 코어의 두 스레드 중 하나에 MPI 태스크를 맵핑하는 작업을 성공적으로 수행하지만, OS는 때에 따라 실제 코어에 두 태스크를 모두 배치하고 다른 코어는 배치하지 않을 수 있습니다. 다른 코어를 사용하지 않고 실제 코어에 두 태스크를 배치하면 최적의 시스템 활용도 및 가변적인 애플리케이션 성능을 얻을 수 있습니다. 또한 OS 커널은 각각의 활성 CPU에 대한 데이터 구조를 할당한 후 Hyper-Threading 기술 모드에서 더 많은 커널 공간이 할당되고 관리 오버헤드가 완화되도록 해당 데이터 구조를 지속적으로 업데이트합니다. Hyper-Threading Technology를 사용 안함을 설정하여 운영 체제 오버헤드를 제거하면 많은 HPC 애플리케이션이 최적의 성능을 얻을 수 있습니다.
Hyper-Threading Technology를 사용 안함으로 설정하는 세 번째 이유는 보안입니다. 일부 사용자는 Hyper-Threading 기술 실행과 연관된 측면 채널 공격 가능성을 방지하기 위해 Hyper-Threading 기술을 사용 안함으로 설정하는 것을 선호합니다. IBM Cloud에서는 두 고객의 가상 머신 간에 물리적 코어를 공유하지 않으므로 이러한 종류의 공격은 불가능합니다.
Hyper-Threading Technology를 사용 안함으로 설정하는 것이 사용자의 구성에 적합하면 다음 방법 중 하나를 사용하여 IBM Cloud의 게스트 가상 머신(VM)에서 사용 안함으로 설정할 수 있습니다.
게스트 VM에서 Hyper-Threading Technology 상태 확인 및 변경: 기본사항
가상 머신이 시작되어 실행 중인 경우 Linux 운영 체제에서 lscpu
명령을 사용하여 Hyper-Threading Technology 상태를 확인할 수 있습니다. 다음과 유사한 출력이 표시됩니다.
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 2
Core(s) per socket: 4
...
이 예제에서는 코어당 스레드에 2가 표시되며 이는 Hyper-Threading Technology가 사용으로 설정됨을 나타냅니다. VM에는 4개의 실제 코어와 8개의 가상 CPU가 있습니다. 최신 버전의 Linux 커널을 사용하면 사용자는 코어 단위로 Hyper-Threading Technology를 사용 안함으로 설정할 수 있습니다. Hyper-Threading Technology가 사용으로 설정된 코어와 Hyper-Threading
Technology가 사용 안함으로 설정된 기타 코어를 실행할 수 있습니다. 이를 코어 단위로 보려면 lscpu --extended
명령을 사용할 수 있습니다. 다음과 유사한 출력이 표시됩니다.
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
0 0 0 0 0:0:0:0 yes
1 0 0 0 1:1:0:0 yes
2 0 0 1 2:2:1:0 yes
3 0 0 1 3:3:1:0 yes
4 0 0 2 4:4:2:0 yes
5 0 0 2 5:5:2:0 yes
6 0 0 3 6:6:3:0 yes
7 0 0 3 7:7:3:0 yes
위의 출력 예제에서는 각 코어에 2개의 CPU가 있고 두 CPU가 모두 온라인 상태라는 것을 보여줍니다. 코어 0에는 CPU 0 및 CPU 1 동위가 있습니다. 동위 목록을 가져오려면 다음 예제에 표시된 대로 디바이스 파일 시스템의 thread_sibling_list
에서 데이터를 찾을 수 있습니다.
cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
0-1
0-1
2-3
2-3
4-5
4-5
6-7
6-7
일부 커널 및 CPU 아키텍처는 스레드 동위 목록에 하이픈(-) 대신 쉼표(,)를 사용합니다.
해당 CPU의 장치 파일 시스템에 있는 온라인 필드 에 0을 입력하여 단일 코어에 대해 하이퍼 스레딩 기술을 비활성화할 수 있습니다. 예를 들어, 코어 2(이전 예제에서는 CPU 5)에서 Hyper-Threading Technology를 사용 안함으로 설정하려면 다음 명령을 실행하십시오.
echo 0 > /sys/devices/system/cpu/cpu5/online
이 명령을 실행하면 다음 예제에서 표시된 대로 lscpu --extended
명령을 실행할 때 CPU 5가 오프라인으로 전환되어 코어 2에서 Hyper-Threading Technology가 사용 안함으로 설정되지만 Hyper-Threading Technology 모드에 있는 다른 코어는 유지됩니다.
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
0 0 0 0 0:0:0:0 yes
1 0 0 0 1:1:0:0 yes
2 0 0 1 2:2:1:0 yes
3 0 0 1 3:3:1:0 yes
4 0 0 2 4:4:2:0 yes
5 - - - ::: no
6 0 0 3 6:6:3:0 yes
7 0 0 3 7:7:3:0 yes
각 코어에 대해 이전 프로세스를 반복하여 VM에 대한 Hyper-Threading Technology를 비활성화할 수 있습니다. VM에 많은 CPU가 있으면 어려워질 수 있습니다. 다음 스크립트는 각 코어에서 Hyper-Threading Technology를 사용하지 않는 매우 단순한 bash 스크립트입니다.
#!/bin/bash
for vcpu in `cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d- -f2 | cut -d- -f2 | uniq`; do
echo 0 > /sys/devices/system/cpu/cpu$vcpu/online
done
특정 코어 및 관련 CPU에 Hyper-Threading Technology 사용
Hyper-Threading Technology를 다시 사용으로 설정하려면 CPU마다 온라인 필드 1을 작성하여 이를 수행할 수 있습니다.
echo 1 > /sys/devices/system/cpu/cpu5/online
VM의 모든 코어에 Hyper-Threading Technology 사용
또는 다음과 같은 단순한 bash 스크립트를 사용하여 VM에서 Hyper-Threading Technology를 사용으로 설정할 수 있습니다.
#!/bin/bash
for vcpu in `lscpu --extended | grep "no" | awk '{print $1}'`; do
echo 1 > /sys/devices/system/cpu/cpu$vcpu/online
done
내 게스트 VM에서 Hyper-Threading Technology 사용 및 사용 안함: 스크립트
또한 와이어트 고먼 씨가 만든 이 스크립트를 사용해 하이퍼 스레딩 기술을 활성화하거나 비활성화할 수도 있습니다. 스크립트를 다운로드하여 실행하면 다음과 같은 옵션이 제공됩니다.
OPTIONS
-d | --disable Disable Hyper-Threaded vCPUs
-e | --enable Enable Hyper-Threaded vCPUs
-s | --show Show Hyper-Threading status
-h | --help Display this usage output
Hyper-Threading Technology 상태를 가져오고, VM의 모든 코어에서 Hyper-Threading Technology를 사용 안함으로 설정하고, Hyper-Threading Technology를 사용으로 설정할 수 있습니다. 그러나 코어의 서브세트에서 Hyper-Threading Technology를 사용 안함으로 설정해야 하는 경우에는 기본사항 절에 있는 단계를 수행하십시오.
부팅 시 내 게스트 VM에서 Hyper-Threading 사용 및 사용 안함: 사용자 데이터
IBM Cloud에서는 인스턴스가 프로비저닝될 때 인스턴스를 구성하거나 스크립트를 실행하기 위해 가상 서버 인스턴스를 작성하는 경우 선택적 데이터를 지정하는 방법을 제공합니다. 이를 사용자 데이터라고 합니다.
가상 서버 인스턴스 작성 프로세스 중에 IBM Cloud 콘솔의 사용자 데이터 섹션에서 다음 샘플 코드를 지정할 수 있습니다.
#cloud-config
bootcmd:
- for cpunum in $(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d- -f2- | tr ',' '\n' | sort -un); do echo 0 > /sys/devices/system/cpu/cpu$cpunum/online; done
사용자 데이터 필드에 제공하는 스크립트는 인스턴스 부트 프로세스 중에 Hyper-Threading Technology 기술을 사용할 수 없도록 합니다. CPU가 사용 안함으로 설정되었음을 나타내는 메시지가 표시됩니다.
dmesg |grep offline
[ 9.488364] smpboot: CPU 1 is now offline
[ 9.544370] smpboot: CPU 3 is now offline
[ 9.572823] smpboot: CPU 5 is now offline
[ 9.600633] smpboot: CPU 7 is now offline
유사한 방법을 사용하여 이 프로세스를 Terraform에 도입할 수 있습니다.