13.2. 해결책


이 섹션을 사용하여 에뮬레이터 스레드 고정을 조사하고 구성합니다.

13.2.1. qemu-kvm 에뮬레이터 스레드

에뮬레이터 스레드는 가상 머신 하드웨어 에뮬레이션을 위한 인터럽트 요청 및 비차단 프로세스를 처리합니다. vCPU를 실행하지 않는 스레드는 qemu-kvm 에뮬레이터 스레드입니다. 다음 예제를 참조하십시오.

[root@overcloud-compute-0 ~]# ps -Tp `pgrep -f instance-00000009`
    PID    SPID TTY          TIME CMD
 364936  364936 ?        00:00:02 qemu-kvm
 364936  364946 ?        00:00:00 qemu-kvm
 364936  364952 ?        00:00:52 CPU 0/KVM
 364936  364953 ?        00:00:26 CPU 1/KVM
 364936  364954 ?        00:00:30 CPU 2/KVM
 364936  364956 ?        00:00:00 vnc_worker
Copy to Clipboard Toggle word wrap

Linux CFS(완전히 공정한 스케줄러)로 인해 에뮬레이터 스레드는 일반적으로 libvirt의 에뮬레이터 핀 세트에 정의된 내에서 하나의 pCPU에서 다른 pCPU로 주기적으로 이동합니다.

NFV 컨텍스트에서 isolcpus 매개변수를 사용할 때 에뮬레이터 스레드를 구성하면 문제가 발생할 수 있습니다. 이 커널 구성은 해당 CPU에서 CFS 스케줄링을 비활성화하기 때문입니다. isolcpus 매개변수 를 사용하지 않는 경우 에뮬레이터 스레드가 패킷을 처리하는 CPU를 중단하면 패킷 손실이 발생할 수 있습니다.

에뮬레이터 스레드의 예는 다음과 같습니다.

  • QEMU-kvm 스레드
  • vnc_worker 스레드
  • vhost-<qemu-kvm PID> 커널 스레드( virtio virtio-net 사용)(하이퍼바이저의 커널 네트워킹)

13.2.2. 에뮬레이터 스레드 고정의 기본 동작

기본적으로 nova는 모든 vCPU에 할당된 pCPU에 걸쳐 설정된 에뮬레이터 스레드 고정을 구성합니다. isolcpus 매개변수를 사용하지 않는 경우 에뮬레이터 스레드는 모든 pCPU에서 예약할 수 있으며 주기적으로 하나의 pCPU에서 다른 스레드로 이동합니다.

virsh dumpxml instance-0000001d
(...)
  <vcpu placement='static'>4</vcpu>
  <cputune>
    <shares>4096</shares>
    <vcpupin vcpu='0' cpuset='34'/>
    <vcpupin vcpu='1' cpuset='14'/>
    <vcpupin vcpu='2' cpuset='10'/>
    <vcpupin vcpu='3' cpuset='30'/>
    <emulatorpin cpuset='10,14,30,34'/>
  </cputune>
(...)
Copy to Clipboard Toggle word wrap
[root@overcloud-compute-0 ~]# virsh dumpxml instance-00000009
(...)
        <nova:vcpus>3</nova:vcpus>
  <vcpu placement='static'>3</vcpu>
    <vcpupin vcpu='0' cpuset='1'/>
    <vcpupin vcpu='1' cpuset='2'/>
    <vcpupin vcpu='2' cpuset='3'/>
(...)
<emulatorpin cpuset='1-3'/>
(...)
Copy to Clipboard Toggle word wrap

따라서 이러한 CPU는 qemu의 에뮬레이터 스레드로 선점할 수 있으므로 패킷이 손실될 수 있습니다.

에뮬레이터 스레드 고정의 새로운 기능의 현재 진행 상황에 대한 자세한 내용은 버그 1468004OpenStack Change 510897을 참조하십시오.

이 작성 시점에서 초안에서 다음 스레드 정책을 지정했습니다.

Valid THREAD-POLICY values are:

  - ``share``: (default) The emulator threads float across the pCPUs
    associated to the guest. To place a workload's emulator threads on
    a set of isolated physical CPUs, set ``share``` and
    ``[compute]/cpu_shared_set`` configuration option to the set of
    host CPUs that should be used for best-effort CPU resources.

  - ``isolate``: The emulator threads are isolated on a single pCPU.
Copy to Clipboard Toggle word wrap

13.2.3. isolcpus on emulator Thread Scheduling의 영향 정보

isolcpus가 사용되는 경우 CFS 스케줄러가 비활성화되고 모든 에뮬레이터 스레드가 사용 가능한 가장 낮은 색인된 pCPU에서 실행됩니다. 결과적으로 개입 또는 추가 구성이 없으면 인스턴스 중 하나의 vCPU가 에뮬레이터 스레드와의 리소스 경합 위험이 높아집니다.

자세한 내용은 Kernel.org Bugzilla - Bug 116701 에서 확인할 수 있습니다.

다음 알고리즘을 사용하여 에뮬레이터 스레드에서 사용하는 vCPU를 확인합니다.

PCPU=MIN([EMULATORPINSET])
VCPU=REVERSE_CPUSET(PCPU)

REVERSE_CPUSET :=  SELECT pcpu from `virsh dumpxml <instance name> | grep "cpuset=$PCPU"`
Copy to Clipboard Toggle word wrap

예를 들어 이 인스턴스에서 모든 에뮬레이터 스레드와 하위 항목은 기본 에뮬레이터 핀 세트에서 선호도 1-3을 상속합니다.

[root@overcloud-compute-0 ~]# taskset -a -c -p `pgrep -f instance-00000009`
pid 364936's current affinity list: 1-3
pid 364946's current affinity list: 1-3
pid 364952's current affinity list: 1
pid 364953's current affinity list: 2
pid 364954's current affinity list: 3
pid 364956's current affinity list: 1-3
[root@overcloud-compute-0 ~]# ps -Tp `pgrep -f instance-00000009`
    PID    SPID TTY          TIME CMD
 364936  364936 ?        00:00:02 qemu-kvm
 364936  364946 ?        00:00:00 qemu-kvm
 364936  364952 ?        00:00:51 CPU 0/KVM
 364936  364953 ?        00:00:26 CPU 1/KVM
 364936  364954 ?        00:00:30 CPU 2/KVM
 364936  364956 ?        00:00:00 vnc_worker
[root@overcloud-compute-0 ~]# pgrep -f vhost- | xargs -I {} taskset -a -c -p {}
pid 364948's current affinity list: 1-3
pid 364949's current affinity list: 1-3
pid 364950's current affinity list: 1-3
[root@overcloud-compute-0 ~]#
Copy to Clipboard Toggle word wrap

isolcpus와 함께 모든 에뮬레이터 스레드와 vhost-* 스레드는 pCPU1에서 실행되고 다시 예약되지 않습니다.

cat /proc/sched_debug | sed '/^cpu#/,/^runnable/{//!d}' | grep vhost -C3
(...)
cpu#1, 2099.998 MHz
runnable tasks:
            task   PID         tree-key  switches  prio     wait-time             sum-exec        sum-sleep
----------------------------------------------------------------------------------------------------------
      watchdog/1    11        -2.995579    410285     0         0.000000      5025.887998         0.000000 0 /
     migration/1    12         0.000000        79     0         0.000000         3.375060         0.000000 0 /
     ksoftirqd/1    13   5172444.259776        54   120         0.000000         0.570500         0.000000 0 /
     kworker/1:0    14   5188475.472257       370   120         0.000000        14.707114         0.000000 0 /
    kworker/1:0H    15      8360.049510        10   100         0.000000         0.150151         0.000000 0 /
     kworker/1:1  2707   5045807.055876     16370   120         0.000000       793.611916         0.000000 0 /
    kworker/1:1H  2763   5187682.987749     11755   100         0.000000       191.949725         0.000000 0 /
        qemu-kvm 364936      3419.522791     50276   120         0.000000      2476.880384         0.000000 0 /machine.slice/machine-qemu\x2d6\x2dinstance\x2d00000009.scope/emulator
        qemu-kvm 364946      1270.815296       102   120         0.000000        23.204111         0.000000 0 /machine.slice/machine-qemu\x2d6\x2dinstance\x2d00000009.scope/emulator
       CPU 0/KVM 364952     52703.660314     53709   120         0.000000     52715.105472         0.000000 0 /machine.slice/machine-qemu\x2d6\x2dinstance\x2d00000009.scope/vcpu0
      vnc_worker 364956       123.609634         1   120         0.000000         0.016849         0.000000 0 /machine.slice/machine-qemu\x2d6\x2dinstance\x2d00000009.scope/emulator
    vhost-364936 364948      3410.527677      1039   120         0.000000        84.254772         0.000000 0 /machine.slice/machine-qemu\x2d6\x2dinstance\x2d00000009.scope/emulator
    vhost-364936 364949      3407.341502        55   120         0.000000         2.894394         0.000000 0 /machine.slice/machine-qemu\x2d6\x2dinstance\x2d00000009.scope/emulator
    vhost-364936 364950      3410.395220       174   120         0.000000        10.969077         0.000000 0 /machine.slice/machine-qemu\x2d6\x2dinstance\x2d00000009.scope/emulator

cpu#2, 2099.998 MHz
runnable tasks:
            task   PID         tree-key  switches  prio     wait-time             sum-exec        sum-sleep
----------------------------------------------------------------------------------------------------------
      watchdog/2    16        -5.995418    410285     0         0.000000      5197.571153         0.000000 0 /
     migration/2    17         0.000000        79     0         0.000000         3.384688         0.000000 0 /
     ksoftirqd/2    18        -7.031102         3   120         0.000000         0.019079         0.000000 0 /
     kworker/2:0    19         0.119413        39   120         0.000000         0.588589         0.000000 0 /
    kworker/2:0H    20        -1.047613         8   100         0.000000         0.086272         0.000000 0 /
     kworker/2:1  2734   1475469.236026     11322   120         0.000000       241.388582         0.000000 0 /
       CPU 1/KVM 364953     27258.370583     33294   120         0.000000     27269.017017         0.000000 0 /machine.slice/machine-qemu\x2d6\x2dinstance\x2d00000009.scope/vcpu1

cpu#3, 2099.998 MHz
runnable tasks:
            task   PID         tree-key  switches  prio     wait-time             sum-exec        sum-sleep
----------------------------------------------------------------------------------------------------------
      watchdog/3    21        -5.996592    410285     0         0.000000      4970.777439         0.000000 0 /
     migration/3    22         0.000000        79     0         0.000000         3.886799         0.000000 0 /
     ksoftirqd/3    23        -7.035295         3   120         0.000000         0.014677         0.000000 0 /
     kworker/3:0    24        17.758583        38   120         0.000000         0.637152         0.000000 0 /
    kworker/3:0H    25        -1.047727         8   100         0.000000         0.077141         0.000000 0 /
     kworker/3:1 362530    154177.523420        83   120         0.000000         6.544285         0.000000 0 /
       CPU 2/KVM 364954     32456.061889     25966   120         0.000000     32466.719084         0.000000 0 /machine.slice/machine-qemu\x2d6\x2dinstance\x2d00000009.scope/vcpu2
Copy to Clipboard Toggle word wrap

13.2.4. 에뮬레이터 스레드의 최적 위치

이 섹션에서는 에뮬레이터 스레드를 다음 네트워크에 배치하는 방법에 대해 설명합니다.

  • Open vSwitch의 인스턴스 및 netdev 데이터 경로 내의 DPDK 네트워킹
  • 인스턴스 내의 DPDK 네트워킹, Open vSwitch의 시스템 데이터 경로 및 하이퍼바이저의 커널 공간 네트워킹
  • Open vSwitch의 인스턴스 내 커널 네트워킹 및 netdev datapath

DPDK가 인스턴스 내에서 실행되면 패킷 처리가 전적으로 사용자 공간에서 수행됩니다. vCPU0에서 실행되도록 PMD를 예약하지 마십시오. 이는 OS 및 인터럽트 처리용으로 남아 있어야 하기 때문입니다. 인스턴스 내의 PMD CPU는 활성 루프를 실행하고 CPU의 100%가 필요하므로 선점해서는 안 됩니다. 이러한 vCPU 중 하나가 선점된 경우 패킷 손실이 발생할 수 있습니다. 따라서 emulatorpin cpuset은 1 이상 번호가 지정된 가상 CPU를 처리하는 물리적 CPU와 겹치지 않는 방식으로 구성해야 합니다.

인스턴스 내에서 DPDK 네트워킹을 사용하는 경우 에뮬레이터 스레드의 최적 위치는 vCPU 0을 처리하는 pCPU 또는 가상 CPU를 전혀 처리하지 않는 전용 물리적 CPU입니다.

인스턴스 내의 하이퍼바이저 및 DPDK에서 OVS-DPDK를 사용하는 경우 에뮬레이터 스레드를 vCPU 0에 배치합니다.

하이퍼바이저에서 커널 공간 네트워킹을 사용하면 하이퍼바이저에서 패킷 처리가 커널 내에서 실행됩니다.

인스턴스 내에서 DPDK 네트워킹을 사용하는 경우 에뮬레이터 스레드의 최적 위치는 vCPU 0을 처리하는 pCPU 또는 가상 CPU를 처리하지 않는 전용 물리적 CPU입니다.

이 시나리오에서는 vNIC 대기열에 대한 패킷 처리가 하이퍼바이저의 vhost-<qemu-kvm PID> 커널 스레드 내에서 실행됩니다. 트래픽이 많은 경우 이러한 커널 스레드는 상당한 CPU 로드를 생성할 수 있습니다. 에뮬레이터 스레드의 최적 위치는 상황에 따라 결정되어야 합니다.

[root@overcloud-compute-0 ~]# ps aux | grep vhost-
root      364948  0.0  0.0      0     0 ?        S    20:32   0:00 [vhost-364936]
root      364949  0.0  0.0      0     0 ?        S    20:32   0:00 [vhost-364936]
root      364950  0.0  0.0      0     0 ?        S    20:32   0:00 [vhost-364936]
Copy to Clipboard Toggle word wrap

인스턴스 내 커널 네트워킹에는 다음 두 가지 옵션이 있습니다.

  • 예를 들어 인스턴스 내에서 소프트irqs와 같은 인터럽트 배포를 최적화합니다. 이러한 경우 에뮬레이터 스레드에 추가 pCPU를 할당할 필요가 없으며 네트워크 인터럽트를 처리하지 않는 pCPU에 에뮬레이터 스레드를 할당할 수 있습니다.
  • 에뮬레이터 스레드에 대해 동일한 NUMA 노드에서 전용 pCPU를 사용합니다.

첫 번째 옵션의 복잡성으로 인해 두 번째 옵션이 권장됩니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2026 Red Hat