5장. Open vSwitch DPDK를 사용한 인스턴스 VHU 인터페이스의 TX Drops


다음 절차를 사용하여 인스턴스 vHU(VHU) 인터페이스에서 전송 드롭의 문제를 해결합니다.

5.1. 증상

커널은 커널 또는 qemu 프로세스를 통과하지 않고 virtio 전송을 사용하여 vswitch에서 게스트로 이동합니다. 이는 VHU 인터페이스를 사용한 패킷을 통해 수행됩니다.

VHU는 주로 DPDK librte_vhost에 의해 구현되며 패킷 배치를 전송하거나 수신하는 기능도 제공합니다. VHU의 백엔드는 가상 머신과 패킷을 교환하기 위해 qemu에서 제공하는 virtio 링입니다. virtio 링에는 설명자 및 버퍼로 구성된 특수 형식이 있습니다.

TX/RX(transmit/receive) 통계는 OVS(OpenvSwitch)용 통계입니다. 즉, 전송 통계는 VM에 대한 통계 수신과 직접 관련이 있습니다.

VM이 패킷을 충분히 빠르게 처리하지 않으면 OVS TX 큐가 오버플로우되고 패킷을 삭제합니다.

5.1.1. 패킷 드롭다운에 대한 설명

포화화된 virtio 링으로 인해 TX가 vhost-user 장치에 드롭됩니다. virtio 링은 게스트 메모리에 있으며, vhost-user가 패킷을 푸시하고 VM에서 사용하는 대기열처럼 작동합니다. VM이 패킷을 사용하기에 충분히 빠르지 않으면 virtio 링이 버퍼가 부족하고 vhost-user가 패킷을 삭제합니다.

Perf 및 Ftrace 툴을 사용하여 패킷 드롭 문제를 해결합니다.

  • Perf를 사용하여 qemu 스레드 선점 여부를 표시할 수 있는 스케줄러 스위치 수를 계산합니다.
  • Ftrace를 사용하여 선점의 이유와 시간을 표시합니다.

선점을 위한 이유는 다음과 같습니다.

  • 시간 중단(커널 정상적인 시간):

    이는 적어도 두 개의 컨텍스트 전환 비용이 추가됩니다. 타이머 인터럽트는 또한 예기치 않은 시간이 걸릴 수 있는 RCU(Read-copy update) 콜백을 실행할 수 있습니다.

  • CPU 전원 관리 및 하이퍼 스레딩

이러한 도구는 다음 패키지에서 찾을 수 있습니다.

  • PERF: rhel-7-server-rpms/7Server/x86_64의 perf rpm. 자세한 내용은 Perf정보를 참조하십시오.
  • FTRACE: trace-cmd info rhel-7-server-rpms/7Server/x86_64. 자세한 내용은 Ftrace정보를 참조하십시오.

5.1.2. 다른 드롭 다운에 대한 설명

OVS 2.9 이전에는 vHost 사용자 포트가 in dpdkvhostuser 모드로 생성되었습니다. 이 모드에서 OVS는 vhost 서버 역할을 하며 QEMU가 클라이언트 역할을 합니다. 인스턴스가 중단되거나 재시작되면 OVS 브리지의 vhost 사용자 포트가 계속 활성 상태이면 VM에 대해 설정된 패킷을 삭제합니다. 이렇게 하면 tx_drop_counter 가 증가합니다.

다음 예에서는 nova stop <UUID> 를 사용하여 VM이 중지되었습니다.

[root@overcloud-compute-0 network-scripts]# ovs-vsctl list interface vhubd172106-73 | grep _state
admin_state         : up
link_state          : down

이는 ip link set dev <br internal port name> down 및 frame이 사용자 공간에 삭제되어 커널 포트가 종료될 때 발생하는 것과 유사합니다.

VM이 가동되면 동일한 vhu 소켓에 연결되고 virtio 링 버퍼를 비우기 시작합니다. TX는 더 이상 중단되지 않으며 정상적인 네트워크 트래픽이 재개됩니다.

5.1.3. DPDK의 TX 및 RX 큐 길이 증가

다음 OpenStack director 템플릿을 수정하여 DPDK의 TX 및 RX 큐 길이를 변경할 수 있습니다.

NovaComputeExtraConfig:
        nova::compute::libvirt::rx_queue_size: '"1024"'
        nova::compute::libvirt::tx_queue_size: '"1024"'

다음 예제에서는 검증 검사를 보여줍니다.

[root@overcloud-compute-1 ~]# ovs-vsctl get interface vhu9a9b0feb-2e status
{features="0x0000000150208182", mode=client, num_of_vrings="2", numa="0",
socket="/var/lib/vhost_sockets/vhu9a9b0feb-2e", status=connected, "vring_0_size"="1024",
"vring_1_size"="1024"}

[root@overcloud-compute-1 ~]# virsh dumpxml instance-00000017 | grep rx
<driver rx_queue_size='1024' tx_queue_size='1024'/>
<driver rx_queue_size='1024' tx_queue_size='1024'/>

커널 제한으로 인해 1024 이상으로 큐 크기를 늘릴 수 없습니다.

참고

DPDK를 통해 neutron 네트워크에 PXE 부팅을 사용할 수 있도록 계획하는 경우 PXE 버전이 1024바이트를 지원하는지 확인해야 합니다.

Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

Theme

© 2026 Red Hat
맨 위로 이동