9.3. 컨테이너 배치를 사용하여 CPU 성능 최적화
실시간 프로필을 사용하여 호스트를 튜닝한 후 특정 CPU에 컨테이너를 선택적으로 배치하고 컨테이너 런타임 동작을 조정하여 성능을 추가로 최적화할 수 있습니다. 이러한 전략을 사용하면 CPU 격리 및 cgroup 구성이 컨테이너화된 워크로드의 대기 시간에 미치는 영향을 확인할 수 있습니다.
9.3.1. 모든 CPU에서 podman 실행 링크 복사링크가 클립보드에 복사되었습니다!
rteval 컨테이너로 podman 을 실행하려면 tuned realtime 프로필 또는 사용자 지정 시스템 튜닝을 사용하여 시스템을 조정합니다. 측정 중인 시나리오에 대해 CPU 분리가 필요한지 확인합니다. 특정 시나리오에서 컨테이너를 실행할 때 문제를 방지하려면 CPU 격리를 올바르게 설정해야 합니다.
/proc/cmdline 에서 isolcpus= 인수를 확인합니다. isolcpus 가 설정되지 않은 경우 시스템은 CPU를 분리하지 않으며 모든 CPU에서 컨테이너를 실행할 수 있습니다.
사전 요구 사항
-
/proc/cmdline의isolcpus=인수는 모든 CPU에서 컨테이너를 실행하도록 설정되지 않습니다. - 호스트 시스템은 Red Hat Enterprise Linux 버전 9.6 이상에서 실행되고 있습니다.
-
podman서비스가 실행 중입니다. -
rteval컨테이너가 설치되어 실행 중입니다.
절차
podman레지스트리에 로그인합니다.$ podman login registry.redhat.iorteval컨테이너를 실행합니다. 컨테이너를 실행하는 다음 방법 중 하나를 선택합니다.단일 NUMA 노드 박스의 모든 CPU에서 다음을 수행합니다.
$ podman run -it --rm --privileged --pids-limit=0 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h’다중 NUMA 노드 시스템에서 다음을 수행합니다.
$ podman run -it --rm --privileged --pids-limit=0 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --loads-cpulist 0,1 --measurement-cpulist 2-47--pids-limit=0kcompile은 컨테이너 런타임의 기본 제한에 도달하지 않고 실행할 수 있습니다.kcompile은 전체 커널을 다시 빌드할 필요 없이 현재 실행 중인 커널의 커널 모듈을 컴파일하는 데 사용되는 명령줄 유틸리티입니다.--privileged-
컨테이너는 호스트 시스템의 모든 장치에 액세스할 수 있습니다.
rteval을 올바르게 실행하려면 이 작업이 필요합니다.
이러한 명령은 사용 가능한 모든 노드에서 단일 컨테이너를 실행합니다. tuned 서비스는 호스트 튜닝을 관리하여 단일 CPU만 사용할 때 베어 메탈 성능을 평가할 수 있습니다.
검증
새 터미널에서
rteval컨테이너를 포함한 모든 컨테이너를 나열하여 올바르게 실행되고 있는지 확인합니다.$ podman ps -a
9.3.2. 분할 CPU 할당으로 podman 실행 링크 복사링크가 클립보드에 복사되었습니다!
로드 분리 및 측정을 테스트하기 위해 다른 CPU 세트에 다른 컨테이너를 할당할 수 있습니다. 예를 들어 NUMA 노드가 하나만 있고 로드와 측정값을 컨테이너로 분리하려는 경우 두 개의 서로 다른 컨테이너를 실행할 수 있습니다. 이 경우 두 컨테이너는 모든 CPU에서 실행되고 튜닝에 파티션이 사용되지 않습니다.
명령 예:
컨테이너 로드:
$ podman run -it --rm --privileged --pids-limit=0 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --onlyload'측정 컨테이너:
$ podman run -it --rm --privileged --pids-limit=0 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --onlymeasure'
NUMA 노드가 두 개 이상 있거나 수동으로 분할된 시스템에서 박스를 분할하는 경우 예제 명령은 다음과 같습니다.
컨테이너 로드:
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 0,1 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 0,1'측정 컨테이너:
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 2-47 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --noload --measurement-cpulist 2-47'
이러한 명령을 실행한 후 load 컨테이너는 isol_cpu 세트에서 작동하는 동안 하우스키핑 코어에 부하를 생성합니다.
파티셔닝이 구성되지 않은 경우 하나의 컨테이너가 시스템의 모든 CPU에 부하를 생성하고 다른 컨테이너는 모든 노드에서 대기 시간을 측정합니다.
두 시나리오 모두에서 로드와 측정이 두 컨테이너 간에 성공적으로 구분됩니다.
9.3.3. 실시간 프로필에서 NUMA당 하우스키핑 조정 링크 복사링크가 클립보드에 복사되었습니다!
실시간 프로필에서 NUMA 노드당 하우스키핑 CPU 세트를 조정할 수 있습니다. 이렇게 하면 하우스키핑 작업이 NUMA 노드에 균등하게 분배되도록 하여 시스템의 성능이 최적화됩니다.
이 기능은 여러 NUMA 노드가 있는 시스템에 특히 유용합니다. 경합을 줄이고 전반적인 성능을 개선하는 데 도움이 되기 때문입니다.
기본 실시간 tuned 프로필은 NUMA 노드당 하나의 하우스키핑 CPU를 예약합니다(hk_per_numa=1). 컨테이너 워크로드에 사용 가능한 CPU가 더 필요한 경우 이 동작을 수정할 수 있습니다.
사전 요구 사항
- 호스트 시스템은 Red Hat Enterprise Linux 버전 9.6 이상에서 실행되고 있습니다.
-
tuned서비스가 실행 중입니다. -
rteval컨테이너가 설치되어 실행 중입니다. -
podman서비스가 실행 중입니다. -
tuned-profiles-realtime패키지가 설치됩니다.
절차
realtime-variables.conf파일을 수정하여 NUMA 노드별로 하우스키핑 CPU 세트를 조정합니다.텍스트 편집기에서
/etc/tuned에 있는realtime-variables.conf파일을 엽니다.$ sudo vi /etc/tuned/realtime-variables.confisolated_cores변수를 찾습니다. 기본적으로 이 값은1로 설정됩니다. 즉, NUMA 노드당 하나의 코어가 격리된 또는 비하우스키핑 사용을 위해 예약되어 있습니다. 이 값을 늘릴 수 있지만 NUMA 노드당 총 CPU 수보다 작아야 합니다.다음 예제에서는 NUMA 노드당 24개의 코어가 있는 시스템에서
isolated_cores를3으로 설정합니다.isolated_cores=${f:calc_isolated_cores:3}
- 변경 사항을 저장하고 파일을 닫습니다.
tuned실시간 프로필을 다시 적용합니다.$ sudo tuned-adm profile realtime
이로 인해 테스트 중에 총 6개의 CPU( NUMA 노드당)가 생성되는 반면, 시스템은 isolcpus 세트의 나머지 코어를 예약합니다. 이 구성은 측정에 사용됩니다. 혼합된 우선 순위 구성은 isolcpus 세트 대신 사용자 정의 토폴로지에 컨테이너를 배포할 수 있습니다.
또는 자동 노드 수를 사용하는 대신 사용자 지정 CPU 범위를 수동으로 지정할 수 있습니다. 이렇게 하면 분리된 코어를 완벽하게 제어할 수 있으므로 비균형 토폴로지 또는 특수 CPU 레이아웃으로 시스템을 미세 조정할 수 있습니다.
검증
-
realtime-variables.conf파일의 변경 사항을 확인합니다. - 시스템을 재부팅하여 변경 사항을 적용합니다.
/proc/cmdline파일을 보고isolcpus설정을 확인합니다.$ cat /proc/cmdline BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.XX.X-XX.X.X.el9_6.x86_64+rt root=/dev/mapper/rhel_rt--qe--11-root ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=UUID=00cbf36d-ffaa-4285-a381-5c1d868eb3e3 rd.lvm.lv=rhel_rt-qe-11/root rd.lvm.lv=rhel_rt-qe-11/swap console=ttyS0,115200n81 skew_tick=1 tsc=reliable rcupdate.rcu_normal_after_boot=1 isolcpus=managed_irq,domain,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 intel_pstate=disable nosoftlockup
9.3.4. 분리된 CPU에서 여러 컨테이너 분배 링크 복사링크가 클립보드에 복사되었습니다!
분리된 CPU에서 여러 컨테이너를 실행하려면 --cpuset-cpus 옵션을 사용하여 각 컨테이너에서 사용할 CPU를 지정할 수 있습니다. 이렇게 하면 여러 개의 격리된 CPU에 걸쳐 부하를 분할하여 성능을 개선하고 경합을 줄일 수 있습니다.
여러 컨테이너에 설정된 isolcpus 세트를 시뮬레이션하여 다음 작업을 시뮬레이션할 수 있습니다.
- 동시 대기 시간에 민감한 작업입니다.
- 분할된 시스템 전반에 걸쳐 여러 로드가 발생합니다.
9.3.4.1. 동시 대기 시간에 민감한 작업 시뮬레이션 링크 복사링크가 클립보드에 복사되었습니다!
동시 대기 시간에 민감한 작업을 시뮬레이션하기 위해 각 컨테이너에 특정 격리된 CPU를 할당할 수 있습니다. 다음 예제에서는 다른 CPU 세트에서 컨테이너를 구성하고 실행하는 방법을 보여줍니다.
CPU 0-6, 다른 하나는 CPU 7-28, CPU 29-47에서 세 번째 컨테이너를 실행합니다. 다음 명령을 사용합니다.
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 0-6 registry.redhat.io/rhel10/rteval \
/bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 0-6'
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 7-28 registry.redhat.io/rhel10/rteval \
/bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 7-28'
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 29-47 registry.redhat.io/rhel10/rteval \
/bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 29-47'
9.3.4.2. 분할된 시스템에서 여러 로드 시뮬레이션 링크 복사링크가 클립보드에 복사되었습니다!
격리되지 않은 CPU 세트에서 rteval 로드 생성기를 시작합니다. 다음으로 isolcpus 세트의 일부에서 고속 데이터베이스 컨테이너와 같은 처리량이 높은 애플리케이션을 시뮬레이션합니다. 이 예에서 CPU 7-28은 고속 데이터베이스 컨테이너를 나타내는 데 사용됩니다. 별도의 터미널 세션에서 다음 명령을 실행하여 부하를 시작합니다.
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 0-6 registry.redhat.io/rhel10/rteval \
/bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 0-6'
그런 다음 별도의 터미널에서 분리된 CPU의 하위 집합에서 일부 부하를 생성합니다.
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 20-30 registry.redhat.io/rhel10/rteval \
/bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 20-30'
이제 나머지 CPU에서 측정 스레드를 실행하려면 다음 두 가지 옵션이 있습니다. 분리된 CPU의 나머지 두 하위 집합을 배포하여 컨테이너를 분리하거나 나머지 CPU 하위 집합을 모두 활용하는 단일 측정 컨테이너를 실행할 수 있습니다.
옵션 1: 두 개의 측정 컨테이너 배포
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 7-19 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --noload --measurement-cpulist 7-19'$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 31-47 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --noload --measurement-cpulist 31-47'옵션 2: 단일 측정 컨테이너 배포
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 7-19,31-47 registry.redhat.io/rhel10/rteval \ /bin/bash -c 'rteval --duration 2h --noload --measurement-cpulist 7-19,31-47'