OVS-DPDK 엔드 문제 해결 가이드
OVS-DPDK 엔드가 포함된 문제 해결 절차가 포함된 가이드
초록
머리말 링크 복사링크가 클립보드에 복사되었습니다!
이 문서에서는 Red Hat OpenStack Platform 10에서 패킷 손실과 관련된 일반적인 문제를 식별하고 해결하기 위한 OVS-DPDK 시스템 관리자를 위한 절차가 포함되어 있습니다. 이 가이드에 설명된 절차는 이전에 게시된 기술 자료 문서를 대체합니다.
1장. 사전 점검 링크 복사링크가 클립보드에 복사되었습니다!
이 가이드에서는 다음 문서에서 계획 및 배포 절차에 익숙한 것으로 가정합니다.
2장. OVS-DPDK 배포 검증 링크 복사링크가 클립보드에 복사되었습니다!
이 장에서는 배포 후 수행하는 검증 단계를 설명합니다.
2.1. OpenStack 확인 링크 복사링크가 클립보드에 복사되었습니다!
다음 명령을 사용하여 OpenStack 및 OVS-DPDK 구성을 확인합니다.
2.1.1. 네트워크 에이전트 표시 링크 복사링크가 클립보드에 복사되었습니다!
Alive 의 값이 True 이고 각 에이전트의 State 가 UP 인지 확인합니다. 문제가 있는 경우 /var/log/neutron 및 /var/log/openvswitch/ovs-vswitchd.log 에서 로그를 확인하여 문제를 확인합니다.
2.1.2. Compute 서비스에 호스트 표시 링크 복사링크가 클립보드에 복사되었습니다!
Status (상태) 값이 enabled 이고 State 가 각 호스트에 대해 up 인지 확인합니다. 문제가 있는 경우 /var/log/nova 의 로그를 참조하여 문제를 확인합니다.
2.2. 컴퓨팅 노드 OVS 설정 확인 링크 복사링크가 클립보드에 복사되었습니다!
네트워크 어댑터 및 OpenvSwitch의 구성 및 상태를 확인하려면 다음 단계를 완료하십시오.
컴퓨팅 노드에서 DPDK 네트워크 장치를 확인하려면 dpdk 툴을 설치합니다. 다음 명령을 실행합니다. 이 rpm은 repo:
rhel-7-server-extras-rpms에 있습니다.yum install dpdk-tools
$ yum install dpdk-toolsCopy to Clipboard Copied! Toggle word wrap Toggle overflow DPDK에서 관리하는 네트워크 장치와 네트워킹에 사용되는 네트워크 장치를 표시합니다.
dpdk-devbind --status
$ dpdk-devbind --statusCopy to Clipboard Copied! Toggle word wrap Toggle overflow DPDK 드라이버를 사용하는 장치는 jenkinsfileleo 컴퓨팅 역할 템플릿의
ovs_dpdk_bond또는ovs_dpdk_port유형입니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow DPDK가 활성화되었는지 확인하려면 다음 명령을 실행합니다.
sudo ovs-vsctl get Open_vSwitch . iface_types
$ sudo ovs-vsctl get Open_vSwitch . iface_types [dpdk, dpdkr, dpdkvhostuser, dpdkvhostuserclient, geneve, gre, internal, lisp, patch, stt, system, tap, vxlan]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행합니다. 결과에는 DPDK 호환 드라이버의 PCI 장치(예:
0000:04:00.1및:05:00.0)가 오류 없이dpdk로 표시됩니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 출력에서는 오류가 표시됩니다.
Port "dpdkbond0" Interface "dpdk1" type: dpdk options: {dpdk-devargs="0000:04:00.1", n_rxq="2"} error: "Error attaching device '0000:04:00.1' to DPDK"Port "dpdkbond0" Interface "dpdk1" type: dpdk options: {dpdk-devargs="0000:04:00.1", n_rxq="2"} error: "Error attaching device '0000:04:00.1' to DPDK"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 인터페이스에 대한 세부 정보를 표시하려면 다음 명령을 실행합니다.
sudo ovs-vsctl list interface dpdk1 | egrep "name|mtu|options|status"
$ sudo ovs-vsctl list interface dpdk1 | egrep "name|mtu|options|status"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행합니다. lacp는 사용할 수 없습니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 컴퓨팅 노드의 모든 ovs 브리지가 빠른 데이터 경로(사용자 공간) 네트워킹의
netdev인지 확인합니다.참고시스템(커널) 및 netdev(user space) 데이터 경로 유형을 혼합하는 것은 지원되지 않습니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 명령을 실행하여 영구 Open vSwitch 오류가 있는지 확인합니다.
grep ERROR /var/log/openvswitch/ovs-vswitchd.log
$ grep ERROR /var/log/openvswitch/ovs-vswitchd.logCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.3. 인스턴스 구성을 위한 OVS 확인 링크 복사링크가 클립보드에 복사되었습니다!
vhostuser IRQ가 작동하도록 OVS-DPDK 포트로 인스턴스를 구성하여 플레이버를 사용하여 전용 CPU 및 대규모 페이지를 사용하도록 구성합니다. 자세한 내용은 에서 3단계: 플레이버 생성 및 OVS-DPDK 인스턴스 배포를 참조하십시오.
인스턴스 구성을 확인하려면 다음 단계를 완료합니다.
인스턴스에 CPU가 고정되었는지 확인합니다. virsh로 전용 CPU를 식별할 수 있습니다.
sudo virsh vcpupin 2
$ sudo virsh vcpupin 2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 인스턴스에 사용된 에뮬레이터 스레드가 해당 인스턴스에 할당된 동일한 vCPU에서 실행되지 않는지 확인합니다.
sudo virsh emulatorpin 2
$ sudo virsh emulatorpin 2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 참고Red Hat OpenStack Platform 12를 사용하면 플레이버에서 에뮬레이터pin을 설정할 수 있습니다. Red Hat OpenStack Platform 12를 사용하여 에뮬레이터 스레드 정책 구성을 참조하십시오.
이전 버전의 경우 인스턴스의 전원이 켜지면 에뮬레이터 스레드 고정을 수동으로 수행해야 합니다. NFV와 isolcpus가 없고 최적의 에뮬레이터 스레드 고정을 통한 가상 환경에서 virsh emulatorpin 사용의 영향을 참조하십시오.
인스턴스가 최적의 성능을 위해 필요한 대규모 페이지를 사용하고 있는지 확인합니다.
sudo virsh numatune 1
$ sudo virsh numatune 1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 인스턴스의 수신 대기열이 폴링 모드 드라이버(PMD)에 의해 서비스되고 있는지 확인합니다.
포트 및 대기열은 PMD에서 동일하게 균형을 유지해야 합니다. 최적의 경우 네트워크 어댑터와 동일한 NUMA 노드에서 포트를 CPU에 의해 서비스를 제공합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow PMD에 대한 통계를 표시합니다. 이를 통해 PMD에서 대기열의 균형을 유지하는 방법을 결정하는 데 도움이 됩니다. 자세한 내용은 Open vSwitch 문서의 PMD Threads 를 참조하십시오.
참고pmd-rxq-rebalance옵션이 OVS 2.9.0에 추가되었습니다. 이 명령은 최신 rxq 처리 사이클 정보를 기반으로 PMD 간에 균형을 유지하기 위해 새로운 PMD 큐 할당을 수행합니다.pmd-stats-show명령은 PMD가 실행된 이후 또는 통계가 마지막으로 지워진 이후의 전체 기록을 표시합니다. 이를 지우지 않으면 포트가 설정되고 데이터가 시작되기 전에 통계에 통합되어 있습니다. 데이터 경로에 대한 로드를 확인하는 데 사용되는 경우(일반적으로) 사용하지 않는 것이 좋습니다.시스템을 안정된 상태로 두고 통계를 지우고 몇 초 동안 기다린 다음 통계를 표시하는 것이 가장 좋습니다. 이는 datapath에 대한 정확한 정보를 제공합니다.
다음 명령을 사용하여 PMD에 대한 통계를 표시합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow PMD 통계를 재설정합니다.
pmd-stats-show명령은 마지막pmd-stats-clear명령 이후 PMD 통계를 표시합니다. 이전에pmd-stats-clear가 발행되지 않은 경우 PMD가 실행되기 시작한 후 데이터가 포함됩니다.로드 중인 시스템을 검사하는 경우 PMD 통계를 지우고 표시되는 것이 유용합니다. 그렇지 않으면 통계에는 시스템이 로드되지 않은( 트래픽 흐름 전) 이전의 데이터가 포함될 수 있습니다.
다음 명령을 사용하여 PMD 통계를 재설정합니다.
sudo ovs-appctl dpif-netdev/pmd-stats-clear
$ sudo ovs-appctl dpif-netdev/pmd-stats-clearCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4. 기타 유용한 명령 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 추가 검증 검사를 수행합니다.
os-net-config로 구성된 OVS-DPDK 포트 및 물리적 NIC 매핑을 찾습니다.
cat /var/lib/os-net-config/dpdk_mapping.yaml
cat /var/lib/os-net-config/dpdk_mapping.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Nova 인스턴스 $ID가 있는 인스턴스의 DPDK 포트를 찾습니다.
sudo ovs-vsctl find interface external_ids:vm-uuid="$ID" | grep ^name
sudo ovs-vsctl find interface external_ids:vm-uuid="$ID" | grep ^nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow DPDK 포트를 사용하여 인스턴스의 Nova ID를 찾습니다.
sudo ovs-vsctl get interface vhu24e6c032-db external_ids:vm-uuid
sudo ovs-vsctl get interface vhu24e6c032-db external_ids:vm-uuidCopy to Clipboard Copied! Toggle word wrap Toggle overflow dpdk 포트에서 tcpdump를 수행합니다.
sudo ovs-tcpdump -i vhu94ccc316-ea
sudo ovs-tcpdump -i vhu94ccc316-eaCopy to Clipboard Copied! Toggle word wrap Toggle overflow
OVS-tcpdump 는 rhel-7-server-openstack-10-devtools-rpms 리포지토리에 있는 openvswitch-test RPM에서 가져온 것입니다.
성능 우려의 경우 ovs-tcpdump 를 프로덕션 환경에 사용하지 않는 것이 좋습니다. 자세한 내용은 Red Hat OpenStack Platform의 vhost-user 인터페이스에서 ovs-tcpdump를 사용하는 방법을 참조하십시오.
2.5. 간단한 컴퓨팅 노드 CPU 파티션 및 메모리 검사 링크 복사링크가 클립보드에 복사되었습니다!
사전 요구 사항
배포된 계산 노드에서 이 명령을 실행하고 cpu mask가 TripleO Heat 템플릿 값에 매핑되는 방법을 확인합니다.
sudo ovs-vsctl get Open_vSwitch . other_config
$ sudo ovs-vsctl get Open_vSwitch . other_config
{dpdk-init="true", dpdk-lcore-mask="300003", dpdk-socket-mem="3072,1024", pmd-cpu-mask="c0000c"}
다음을 확인합니다.
-
DPDK-lcore-mask은 TripleO Heat 템플릿의HostCpusList에 매핑됩니다. -
DPDK-socket-mem은 TripleO Heat 템플릿에서NeutronDpdkSocketMemory에 매핑됩니다. PMD-cpu-mask은 TripleO Heat 템플릿의NeutronDpdkCoreList에 매핑됩니다.이러한 CPU 마스크를 TripleO Heat 템플릿 및 실제 시스템 값으로 조정할 수 있는 10진수 값으로 변환하려면 16진수 CPU 마스크를 비트 마스크로 변환하고 마스크된 CPU를 식별하는 방법을참조하십시오.
2.5.1. CPU 탐지 링크 복사링크가 클립보드에 복사되었습니다!
pid 1의 CPU를 감지하려면 다음 명령을 사용하십시오. 다음 코어에서 PMD 또는 Nova vCPU를 실행하지 않아야 합니다.
taskset -c -p 1
$ taskset -c -p 1
pid 1's current affinity list: 0,1,20,21
2.5.2. PMD 스레드 감지 링크 복사링크가 클립보드에 복사되었습니다!
PMD 스레드를 보려면 다음 명령을 사용하십시오. 출력은 tripleo 매개변수 NeutronDpdkCoreList 의 값을 반영해야 합니다. controlPlaneleo 매개변수 HostCpusList 또는 HostIsolatedCoreslist 의 값과 겹치지 않아야 합니다.
2.5.3. NUMA 노드 탐지 링크 복사링크가 클립보드에 복사되었습니다!
최적의 성능을 위해 물리적 네트워크 어댑터, PMD 스레드 및 인스턴스의 고정 CPU가 모두 동일한 NUMA 노드에 있도록 합니다. 자세한 내용은 CPU 및 NUMA 노드를 참조하십시오.
다음은 NUMA 할당을 검사하기 위한 간단한 연습입니다.
계산 노드에서 인스턴스의 vhu 포트를 검사합니다.
sudo virsh domiflist 1
$ sudo virsh domiflist 1 Interface Type Source Model MAC ------------------------------------------------------- vhu24e6c032-db vhostuser - virtio fa:16:3e:e3:c4:c2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 해당 포트를 서비스하는 PMD 스레드를 검사하고 NUMA 노드를 확인합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 인스턴스의 물리적 고정 CPU를 찾습니다. 예를 들어, PMD는 이 인스턴스의 포트는 cpu 2에 있으며 인스턴스는 cpus 34 및 6에 의해 서비스를 제공합니다.
sudo virsh dumpxml 1 | grep cpuset
$ sudo virsh dumpxml 1 | grep cpuset <vcpupin 1 vcpu='0' cpuset='34'/> <emulatorpin cpuset='6'/>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 각 NUMA 노드의 코어를 검사합니다. 인스턴스(34,6)를 제공하는 CPU는 동일한 NUMA 노드(0)에 있습니다.
lscpu | grep ^NUMA
$ lscpu | grep ^NUMA NUMA node(s): 2 NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38 NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39Copy to Clipboard Copied! Toggle word wrap Toggle overflow
또한 OVS DPDK에서 관리하지 않는 네트워크 어댑터에는 자신이 속한 NUMA 노드를 나타내는 항목이 있습니다.
sudo cat /sys/class/net/<device name>/device/numa_node
$ sudo cat /sys/class/net/<device name>/device/numa_node
또는 OVS DPDK에서 관리하는 경우 PCI 주소를 쿼리하여 네트워크 어댑터의 NUMA 노드를 확인할 수 있습니다.
sudo lspci -v -s 05:00.1 | grep -i numa
$ sudo lspci -v -s 05:00.1 | grep -i numa
Flags: bus master, fast devsel, latency 0, IRQ 203, NUMA node 0
이러한 연습은 PMD, 인스턴스 및 네트워크 어댑터가 모두 NUMA 0에 있음을 보여줍니다. 이 방법은 성능에 가장 적합한 것입니다. openvswitch 로그( /var/log/openvswitch에 있음)에서 NUMA 폴링 간 표시를 보려면 다음과 유사한 로그 항목을 찾습니다.
dpif_netdev|WARN|There's no available (non-isolated) pmd thread on numa node 0. Queue 0 on port 'dpdk0' will be assigned to the pmd on core 7 (numa node 1). Expect reduced performance.
dpif_netdev|WARN|There's no available (non-isolated) pmd thread on numa node 0. Queue 0 on port 'dpdk0' will be assigned to the pmd on core 7 (numa node 1). Expect reduced performance.
2.5.4. 감지된 CPU 링크 복사링크가 클립보드에 복사되었습니다!
다음 명령을 사용하여 분리된 CPU를 표시합니다. 출력은 TripleO 매개변수 HostIsolatedCoreList 의 값과 동일해야 합니다.
cat /etc/tuned/cpu-partitioning-variables.conf | grep -v ^# isolated_cores=2-19,22-39
$ cat /etc/tuned/cpu-partitioning-variables.conf | grep -v ^#
isolated_cores=2-19,22-39
2.5.5. Detectng CPU Dedicated to Nova Instances 링크 복사링크가 클립보드에 복사되었습니다!
다음 명령을 사용하여 Nova 인스턴스 전용 CPU를 표시합니다. 이 출력은 PMD( poll mode driver) CPU 없이 isolcpus 값과 동일해야 합니다.
grep ^vcpu_pin_set /etc/nova/nova.conf
$ grep ^vcpu_pin_set /etc/nova/nova.conf
vcpu_pin_set=4-19,24-39
2.5.6. 대규모 페이지 구성 확인 링크 복사링크가 클립보드에 복사되었습니다!
계산 노드에서 대규모 페이지 구성을 확인합니다.
hugepages가 구성되지 않았거나 고갈된 경우 ComputeKernelArgs 를 참조하십시오.
2.6. 패킷 드롭의 원인 링크 복사링크가 클립보드에 복사되었습니다!
일반적으로 큐가 충분히 빨리 드레이닝되지 않을 때 패킷이 삭제됩니다. 성능 장애는 큐가 충분히 빨리 드레이닝되지 않을 때 큐를 드레이닝해야 하는 엔티티입니다. 대부분의 경우 드롭 카운터는 삭제된 패킷을 추적하는 데 사용됩니다. 하드웨어 또는 소프트웨어 설계의 버그가 발생하면 패킷이 드롭 카운터를 건너뛰도록 할 수 있습니다.
DPDK(Data Plan Development Kit)에는 패킷을 전달하기 위한 testpmd 애플리케이션이 포함되어 있습니다. 이 장에 표시된 시나리오에서는 testpmd 가 VM에 설치되고 할당된 논리 코어(lcore)가 있는 포트를 폴링하여 한 포트에서 다른 포트로 패킷을 전달합니다. testpmd 는 트래픽 생성기와 함께 사용하여 물리적 PVP(physical-virtual-physical) 경로에서 처리량을 테스트합니다.
2.6.1. OVS-DPDK 물리적 NIC로 전환 링크 복사링크가 클립보드에 복사되었습니다!
이 예에서는 PMD 스레드가 물리적 네트워크 어댑터(dpdk0)의 수신(RX) 대기열을 폴링하는 것을 보여줍니다. PMD 스레드가 패킷 볼륨을 유지할 수 없거나 중단된 경우 패킷이 삭제될 수 있습니다.
그림 2.1. 물리적 어댑터 RX 대기열 폴링
다음 명령은 dpdk0 인터페이스의 통계를 보여줍니다. ovs-dpdk가 물리적 어댑터를 충분히 빨리 드레이닝하지 않아 패킷이 삭제되는 경우, rx_dropped 값이 빠르게 증가하는 것을 확인할 수 있습니다.
PMD의 NUMA 노드당 물리적 CPU 코어가 두 개 이상 없어야 합니다.
2.6.2. VM Too Slow to Drain vhost-user 링크 복사링크가 클립보드에 복사되었습니다!
이 예는 figure 2.1 의 예제와 유사합니다. 즉, 인스턴스 수신(RX) 큐로 전송된 패킷 볼륨에 의해 lcore 스레드가 과해지면 패킷 손실이 발생할 수 있습니다.
자세한 내용은 다음 문서를 참조하십시오.
그림 2.2. 가상 어댑터 RX 대기열 폴링
호스트의 tx_dropped 값이 VM의 rx_dropped 값에 해당하는지 확인하려면 다음 명령을 실행합니다.
ovs-vsctl --column statistics list interface vhud8ada965-ce
statistics : {"rx_1024_to_1522_packets"=0, "rx_128_to_255_packets"=0, "rx_1523_to_max_packets"=0,
"rx_1_to_64_packets"=0, "rx_256_to_511_packets"=0, "rx_512_to_1023_packets"=0, "rx_65_to_127_packets"=0, rx_bytes=0,
rx_dropped=0, rx_errors=0, rx_packets=0, tx_bytes=0, tx_dropped=0, tx_packets=0}
ovs-vsctl --column statistics list interface vhud8ada965-ce
statistics : {"rx_1024_to_1522_packets"=0, "rx_128_to_255_packets"=0, "rx_1523_to_max_packets"=0,
"rx_1_to_64_packets"=0, "rx_256_to_511_packets"=0, "rx_512_to_1023_packets"=0, "rx_65_to_127_packets"=0, rx_bytes=0,
rx_dropped=0, rx_errors=0, rx_packets=0, tx_bytes=0, tx_dropped=0, tx_packets=0}
2.6.3. OVS-DPDK Too to Drain vhost-user 링크 복사링크가 클립보드에 복사되었습니다!
이 예에서 PMD 스레드는 호스트 관점에서 수신 대기열인 virtio TX를 폴링합니다. 패킷 볼륨에 의해 PMD 스레드가 과압되거나 중단된 경우 패킷이 삭제될 수 있습니다.
그림 2.3. 가상 어댑터 TX 대기열 폴링
VM에서 패킷의 반환 경로를 추적하고 호스트(tx_dropped) 및 VM(rx_dropped) 양쪽에서 모두 드롭 카운터에서 값을 제공하고 다음 명령을 실행합니다.
ovs-vsctl --column statistics list interface vhue5146cdf-aa
statistics : {"rx_1024_to_1522_packets"=0, "rx_128_to_255_packets"=0, "rx_1523_to_max_packets"=0,
"rx_1_to_64_packets"=0, "rx_256_to_511_packets"=0, "rx_512_to_1023_packets"=0, "rx_65_to_127_packets"=0,
rx_bytes=0, rx_dropped=0, rx_errors=0, rx_packets=0, tx_bytes=0, tx_dropped=0, tx_packets=0}
ovs-vsctl --column statistics list interface vhue5146cdf-aa
statistics : {"rx_1024_to_1522_packets"=0, "rx_128_to_255_packets"=0, "rx_1523_to_max_packets"=0,
"rx_1_to_64_packets"=0, "rx_256_to_511_packets"=0, "rx_512_to_1023_packets"=0, "rx_65_to_127_packets"=0,
rx_bytes=0, rx_dropped=0, rx_errors=0, rx_packets=0, tx_bytes=0, tx_dropped=0, tx_packets=0}
2.6.4. Egress 물리 인터페이스의 패킷 손실 링크 복사링크가 클립보드에 복사되었습니다!
controlPlane과 RAM 간의 느린 전송 속도는 TX 큐에서 패킷을 삭제하는 물리적 어댑터가 발생할 수 있습니다. 이 문제는 자주 발생하지 않지만 이 문제를 식별하고 해결하는 방법을 알아야 합니다.
그림 2.4. 물리적 어댑터 TX 대기열 폴링
다음 명령은 dpdk1 인터페이스의 통계를 보여줍니다. tx_dropped 가 0보다 크고 빠르게 증가하는 경우 Red Hat의 지원 케이스를 여십시오.
이러한 유형의 패킷 손실이 표시되면 메모리 채널을 재구성하는 것이 좋습니다.
- 메모리 채널을 계산하려면 Network Functions Virtualization Planning and Conifguration Guide 의 메모리 매개변수를 참조하십시오.
- 메모리 채널 수를 확인하려면 Red Hat OpenStack Platform의 NeutronDpdkMemoryChannels 또는 OvsDpdkMemoryChannels의 메모리 채널 수를 결정하는 방법을 참조하십시오.
3장. NFV Command Cheat city 링크 복사링크가 클립보드에 복사되었습니다!
이 장에는 Red Hat OpenStack Platform 10 시스템 관찰 기능에서 가장 일반적으로 사용되는 많은 명령이 포함되어 있습니다.
아래 일부 명령은 기본적으로 제공되지 않을 수 있습니다. 지정된 노드에 필요한 툴을 설치하려면 다음 명령을 실행합니다.
sudo yum install tuna qemu-kvm-tools perf kernel-tools dmidecode
3.1. UNIX 소켓 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 프로세스 포트 및 UNIX 소켓 도메인을 표시합니다.
| 동작 | 명령 |
|---|---|
| 호스트 이름 조회 없이 모든 상태(LISTEN, happenBLISHED, CLOSE_WAIT 등)에서 모든 TCP 및 UDPBOOTKETS를 표시합니다. | # lsof -ni |
| 호스트 이름 조회 없이 모든 상태(LISTEN, ESTABLISHED, CLOSE_WAIT 등)에서 모든 TCPRBDKETS를 표시합니다. | # lsof -nit |
| 모든 상태(LISTEN, ESTABLISHED, CLOSE_WAIT 등)에서 호스트 이름을 조회하지 않고 모든 UDPRBDKETS를 표시합니다. | # lsof -niu |
| IPv4에 대한 호스트 이름 조회 없이 모든 TCP 및 UDPBOOTKETS(LISTEN, ESTABLISHED, CLOSE_WAIT 등)를 표시합니다. | # lsof -ni4 |
| IPv6에 대한 호스트 이름 조회 없이 모든 TCP 및 UDPBOOTKETS(LISTEN, ESTABLISHED, CLOSE_WAIT 등)를 표시합니다. | # lsof -ni6 |
| 지정된 포트에 대한 호스트 이름 조회 없이 관련된 모든RBDKETS(LISTEN, alphaBLISHED, CLOSE_WAIT 등)를 표시합니다. | # lsof -ni :4789 |
| 호스트 이름 조회 없이 LISTEN 상태에서 모든 RSSKETS 표시 | # ss -ln |
| IPv4에 대한 호스트 이름 조회 없이 LISTEN 상태에서 모든 RSSKETS 표시 | # ss -ln4 |
| IPv6에 대한 호스트 이름 조회 없이 LISTEN 상태에서 모든 RSSKETS 표시 | # ss -ln6 |
3.2. IP 링크 복사링크가 클립보드에 복사되었습니다!
이 명령을 사용하여 IP L2 및 L3 구성, 드라이버, PCI 버스 및 네트워크 통계를 표시합니다.
| 동작 | 명령 |
|---|---|
| 모든 L2(실제 및 가상 인터페이스 모두) 및 해당 통계 표시 | # IP -s 링크 표시 |
| 모든 L3 인터페이스 및 해당 통계 표시 | # IP -s addr show |
| 기본(유지 관리) IP 라우팅 테이블 표시 | # IP 경로 표시 |
| 지정된 라우팅 테이블의 라우팅 규칙 표시 | # IP route show table external |
| 모든 라우팅 테이블 표시 | # IP 규칙 표시 |
| 지정된 대상에 대한 라우팅 규칙 표시 | # IP route get 1.1.1.1 |
| 모든 Linux 네임스페이스 표시 | # IP netns show |
| Linux 네임스페이스에 로그인합니다. | # IP netns exec ns0 bash |
| 지정된 인터페이스의 자세한 네트워크 인터페이스 카운터 표시 | # tail /sys/class/net/ens6/statistics/* |
| 지정된 본딩 장치의 자세한 본딩 정보 표시 | # cat /proc/net/bonding/bond1 |
| 글로벌 네트워크 인터페이스 카운터 보기 표시 | # cat /proc/net/dev |
| 물리적 연결 유형(TP, FIBER 등) 표시, 지정된 네트워크 인터페이스에 대해 링크 속도 모드를 지원하고 연결 | # ethtool ens6 |
| 지정된 네트워크 인터페이스의 Linux 드라이버, 드라이버 버전, 펌웨어 및 NetNamespace BUS ID 표시 | # ethtool -i ens6 |
| 지정된 네트워크 인터페이스에 대한 기본, 활성화 및 비활성화 하드웨어 오프로드 표시 | # ethtool -k ens6 |
| 지정된 네트워크 인터페이스에 대한 showtekton(multiqueue) 구성 | # ethtool -l ens6 |
| 지정된 네트워크 인터페이스의 RX 및 TX 둘 다에 대한 NetNamespace 설정 변경 | # ethtool -L ens6 combined 8 |
| 지정된 네트워크 인터페이스에 대한 TX 설정만 변경 | # ethtool -L ens6 tx 8 |
| 지정된 네트워크 인터페이스의 대기열 크기 표시 | # ethtool -g ens6 |
| 지정된 네트워크 인터페이스의 RX 큐 크기 변경 | # ethtool -G ens6 rx 4096 |
| 향상된 네트워크 통계 표시 | # cat /proc/net/softnet_stat |
| 빠른 중요한 네트워크 장치 정보(Interface name, MAC, NUMA, PKCS 슬롯, 펌웨어, 커널 드라이버)를 표시합니다. | # BIOSsdevname -d |
| 커널 내부 드롭 카운터를 표시합니다. 자세한 내용은 네트워크 데이터 처리 모니터링 을 참조하십시오. | # cat /proc/net/softnet_stat |
3.3. OVS 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 Open vSwitch 관련 정보를 표시합니다.
| 동작 | 명령 |
|---|---|
| OVS DPDK 사람이 읽을 수 있는 통계 | Open vSwitch DPDK statistics 를 참조하십시오. |
| OVS 기본 정보(버전, dpdk enabled, PMD 코어, lcore, ODL 브리지 매핑, 밸런싱, 자동 밸런싱 등)를 표시합니다. | # OVS-vsctl list Open_vSwitch |
| OVS 글로벌 전환 보기 표시 | # OVS-vsctl show |
| OVS 모든 세부 인터페이스 표시 | # OVS-vsctl 목록 인터페이스 |
| 하나의 인터페이스에 대한 OVS 세부 정보 표시 (링크 속도, MAC, 상태, 통계 등) | # OVS-vsctl 목록 인터페이스 dpdk0 |
| 지정된 인터페이스에 OVS 카운터 표시 | # OVS-vsctl get 인터페이스 dpdk0 통계 |
| OVS 모든 세부 포트 표시 | # OVS-vsctl 목록 포트 |
| 하나의 포트에 대한 OVS 세부 정보 표시 (링크 속도, MAC, 상태, 통계 등) | # OVS-vsctl 목록 포트 vhu3gf0442-00 |
| 하나의 브릿지에 대한 OVS 세부 정보 표시 (데이터 경로 유형, 멀티 캐스트 스노핑, stp 상태 등) | # OVS-vsctl list bridge br-int |
| OVS 로그 상태 표시 | # OVS-appctl vlog/list |
| 모든 OVS 로그를 debug로 변경 | # OVS-appctl vlog/set dbg |
| 파일 로그 출력에 대한 특정 OVS 하위 시스템을 디버그 모드로 변경합니다. | # OVS-appctl vlog/set file:backtrace:dbg |
| 모든 OVS 로그 비활성화 | # OVS-appctl vlog/set off |
| 파일 로그 출력에 대해서만 디버그하도록 모든 OVS 하위 시스템 변경 | # OVS-appctl vlog/set file:dbg |
| 모든 OVS 고급 명령 표시 | # OVS-appctl list-commands |
| 모든 OVS 본딩 표시 | # OVS-appctl bond/list |
| 특정 OVS 본딩(상태, 본딩 모드, 전달 모드, LACP 상태, 본딩 멤버, 본딩 멤버 상태, 링크 상태)에 대한 세부 정보를 표시합니다. | # OVS-appctl bond/show bond1 |
| 멤버, 본딩 및 파트너 스위치에 대한 고급 LACP 정보 표시 | # OVS-appctl lacp/show |
| OVS 인터페이스 카운터 표시 | # OVS-appctl dpctl/show -s |
| 반복 간의 차이점을 강조하는 OVS 인터페이스 카운터 표시 | # watch -d -n1 "ovs-appctl dpctl/show -s|grep -A4 -E '(dpdk|dpdkvhostuser)'|grep -v '\-\-'" |
| 지정된 포트에 대한 OVS mempool 정보를 표시 | # OVS-appctl netdev-dpdk/get-mempool-info dpdk0 |
| PMD 성능 통계 표시 | # ovs-appctl dpif-netdev/pmd-stats-show |
| 일관된 방식으로 PMD 성능 통계 표시 | # OVS-appctl dpif-netdev/pmd-stats-clear && sleep 60s && ovs-appctl dpif-netdev/pmd-stats-show |
| 사람이 읽을 수 있는 DPDK 인터페이스 통계 표시 | # OVS-vsctl get interface dpdk0 statistics|sed -e "s/,/\n/g" -e "s/[\",\{,\}, ]/g" -e "s/=/ =tekton /g" |
| ports/queue와 PMD 스레드 간 OVS 매핑 표시 | # ovs-appctl dpif-netdev/pmd-rxq-show |
| trigger OVS PMD 리밸런스 ( PMD 사이클 사용률 기반) | # ovs-appctl dpif-netdev/pmd-rxq-rebalance |
| OVS 포트와 특정 PMD 간의 유사성 생성 (모든 분산에서 PMD 분리) | # ovs-vsctl set interface dpdk other_config:pmd-rxq-affinity="0:2,1:4" |
| (OVS 2.11 이상 및 FDP18.09) 주기에 따라 PMD 밸런싱 설정 | # OVS-vsctl set Open_vSwitch . other_config:pmd-rxq-assign=cycles |
| (OVS 2.11 이상 및 FDP18.09) 라운드 로빈에서 PMD 밸런싱을 설정합니다. | # OVS-vsctl set Open_vSwitch . other_config:pmd-rxq-assign=roundrobin |
| OVS-DPDK 물리 포트 대기열 수 설정 | # ovs-vsctl set interface dpdk options:n_rxq=2 |
| OVS-DPDK 물리 포트 대기열 크기 설정 | # ovs-vsctl set Interface dpdk0 options:n_rxq_desc=4096 # ovs-vsctl set Interface dpdk0 options:n_txq_desc=4096 |
| OVS MAC 주소 테이블 표시 (action=normal에 사용됨) | # OVS-appctl fdb/show br-provider |
| OVS vSwitch MAC 주소 테이블 노화 시간 설정 (기본 300s) | # ovs-vsctl set bridge br-provider other_config:mac-aging-time=900 |
| OVS vSwitch MAC Address 테이블 크기 설정(기본값 2048s) | # ovs-vsctl set bridge br-provider other_config:mac-table-size=204800 |
| OVS 데이터 경로 흐름(커널 공간) 표시 | # OVS-dpctl dump-flows -m |
| OVS 데이터 경로 흐름(dpdk) 표시 | # ovs-appctl dpif/dump-flows -m br-provider |
| datapath flows 포트 번호와 포트 이름 간 매핑 표시 | # OVS-dpctl show |
| 지정된 브리지에서 OVS OpenFlow 규칙 표시 | # OVS-ofctl dump-flows br-provider |
| OpenFlow 흐름 포트 번호와 포트 이름 간 매핑 표시 | # OVS-ofctl show br-provider |
| (OVS 2.11 이상) - 자동 리밸런스 사용 | # ovs-vsctl set Open_vSwitch . other_config:pmd-auto-lb="true" |
| (OVS 2.11+) - 자동 리밸런스 간격을 다른 값으로 변경합니다(기본값 1분) | # ovs-vsctl set Open_vSwitch . other_config:pmd-auto-lb-rebalance-intvl="5" |
| 자세한 OVS 내부 구성 | # man ovs-vswitchd.conf.db |
| OVS tcpdump를 다운로드하려면 | # curl -O -L ovs-tcpdump.in |
| DPDK 인터페이스에서 패킷 캡처 수행 | # OVS-tcpdump.py --db-sock unix:/var/run/openvswitch/db.sock -i <bond/vhu> <tcpdump 표준 인수 such as -v -nn -e -w <path/to/file>> |
| (OVS 2.10 이상) PMD 성능 통계 | # ovs-appctl dpif-netdev/pmd-perf-show |
3.4. IRQ 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 Interrupt Request Line (IRQ) 소프트웨어 및 하드웨어 인터럽트를 표시합니다.
| 동작 | 명령 |
|---|---|
| ksoftirqd 작업자가 실행하는 CPU당 softIRQ 밸런싱 표시 | # cat /proc/softirqs | less -S |
| ksoftirqd 작업자가 초당 ksoftirqd 작업자가 실행하는 CPU당 softIRQ 밸런싱 표시 | # watch -n1 -d -t "cat /proc/softirqs" |
| 하드웨어 및 소프트웨어 인터럽트 (NMI, LOC, TLB, RSE, Pin, NPI, PIW) 밸런싱을 표시합니다. | # cat /proc/interrupts | less -S |
| 하드웨어 및 소프트웨어 인터럽트 (NMI, LOC, TLB, RSE, Pin, NPI, PIW) 밸런싱을 1초마다 표시합니다. | # watch -n1 -d -t "cat /proc/interrupts" |
| 타이머 인터럽트 표시 | # cat /proc/interrupts | grep -E "LOC|CPU" | less -S |
| 1초마다 timer 인터럽트를 표시 | # watch -n1 -d -t "cat /proc/interrupts | grep -E 'LOC|CPU'" |
| 기본 IRQ CPU 선호도 표시 | # cat /proc/irq/default_smp_affinity |
| 지정된 IRQ(CPUMask)의 IRQ 선호도 표시 | # cat /proc/irq/89/smp_affinity |
| 지정된 IRQ(DEC)의 IRQ 선호도 표시 | # cat /proc/irq/89/smp_affinity_list |
| 지정된 IRQ(CPUMask)의 IRQ 선호도 설정 | # echo -n 1000 > /proc/irq/89/smp_affinity |
| 지정된 IRQ(DEC)의 IRQ 선호도 설정 | # echo -n 12 > /proc/irq/89/smp_affinity_list |
| 하드웨어 인터럽트 CPU 선호도 표시 | # tuna --show_irqs |
| 지정된 IRQ에 대한 IRQ 선호도 설정 (예: 0-4에서 4까지) | # tuna --irqs=<IRQ> --cpus=<CPU> --move |
| IRQ CPU 사용률 배포 표시 | # MPstat -I CPU | less -S |
| 지정된 CPU의 IRQ CPU 사용량 배포 표시 | # MPstat -I CPU -P 4 | less -S |
| softIRQ CPU 사용률 분배 표시 | # MPstat -I SCPU | less -S |
| 지정된 CPU의 softIRQ CPU 사용률 분배 표시 | # MPstat -I SCPU -P 4 | less -S |
3.5. 프로세스 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 Linux, 프로세스 스케줄러 및 CPU 선호도의 프로세스 및 스레드를 표시합니다.
| 동작 | 명령 |
|---|---|
| 모든 프로세스 스레드를 포함한 지정된 프로세스 이름 분배 CPU 사용량 및 CPU 선호도 표시 | # pidstat -p $(pidof qemu-kvm) -t |
| 모든 프로세스 스레드를 포함하여 지정된 프로세스 이름 분배 CPU 사용량 및 CPU 선호도, 30초 동안 10초 동안 표시 | # pidstat -p $(pidof qemu-kvm) -t 10 30 |
| 모든 프로세스 스레드를 포함하여 지정된 프로세스 이름 페이지 폴트 및 메모리 사용률 표시 | # pidstat -p $(pidof qemu-kvm) -t -r |
| 모든 프로세스 스레드를 포함한 지정된 프로세스 이름 I/O 통계 표시 | # pidstat -p $(pidof qemu-kvm) -t -d |
| 지정된 프로세스 이름에 대한 PID, 프로세스 이름을 포함한 모든 하위 PID, CPU 시간 표시 | # PS -T -C qemu-kvm |
| 지정된 프로세스에 대한 표시 및 모든 하위 PID(s) 실시간 성능 통계 | # top -H -p $(pidof qemu-kvm) |
| 프로세스 스케줄러 유형, 우선 순위, 명령, CPU 선호도 및 컨텍스트 전환 정보로 모든 시스템 스레드 표시 | # tuna --show_threads |
| 우선 순위가 가장 높은 지정된 PID RealTime (VNet) 스케줄링에 대해 설정 | # tuna --threads=<PID> --priority=FIFO:99 |
| PMD 및 CPU 스레드의 일정 변경 작업 표시 | # watch -n1 -d "grep -E 'pmd|CPU' /proc/sched_debug" |
| 브라우저 스케줄러 내부 작업 통계 | # less /proc/sched_debug |
| 포괄적인 프로세스 통계 및 선호도 보기를 표시합니다.
| # top |
| 모든 시스템 프로세스 및 해당 CPU 선호도 표시 | # ps -eF |
| 유휴 상태 및 실행 중인 프로세스를 표시하는 모든 시스템 프로세스 표시 및 일시 정지 시 기능 표시 | # ps -elfL |
| 지정된 PID의 CPU 선호도 표시 | # taskset --pid $(pidof qemu-kvm) |
| 지정된 PID의 CPU 유사성 설정 | # taskset --pid --cpu-list 0-9,20-29 $(pidof <Process>) |
3.6. KVM 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 KVM(커널 기반 가상 시스템) 관련 도메인 통계를 표시합니다.
| 동작 | 명령 |
|---|---|
| 실시간 KVM 하이퍼바이저 통계(VMExit, VMEntry, vCPU 작동, 컨텍스트 전환, 타이머, Halt Pool, vIRQ) 표시 | # kvm_stat |
| 딥 KVM 하이퍼바이저 통계 표시 | # kvm_stat --once |
| 지정된 게스트에 대한 실시간 KVM 하이퍼바이저 통계(VMExit, VMEntry, vCPU 중단, 컨텍스트 전환, 타이머, Halt Pool, vIRQ)를 표시합니다. | # kvm_stat --guest=<VM name> |
| 지정된 게스트에 대한 딥 KVM 하이퍼바이저 통계 표시 | # kvm_stat --once --guest=<VM name> |
| KVM 프로파일링 트랩 통계 표시 | # perf kvm 통계 |
| KVM 프로파일링 통계 표시 | # perf kvm 최상위 |
| 지정된 VM의 vCPU 고정 표시 | # virsh vcpupin <Domain name/ID> |
| 지정된 VM의 QEMU 에뮬레이터 스레드 표시 | # virsh emulatorpin <Domain name/ID> |
| 지정된 VM의 NUMA 고정 표시 | # virsh numatune <Domain name/ID> |
| 지정된 VM의 메모리 통계 표시 | # virsh dommemstat <Domain name/ID> |
| 지정된 VM에 대한 vCPU 통계 표시 | # virsh nodecpustats <Domain name/ID> |
| 지정된 VM의 모든 vNIC 표시 | # virsh domiflist <Domain name/ID> |
| 지정된 VM에 대한 vNIC 통계 표시( DPDK VHU에서는 작동하지 않음) | # virsh domifstat <Domain name/ID> <vNIC> |
| 지정된 VM의 모든 vDisk 표시 | # virsh domblklist <Domain name/ID> |
| 지정된 VM의 vDisk 통계 표시 | # virsh domblkstat <Domain name/ID> <vDisk> |
| 지정된 VM의 모든 통계 표시 | # virsh domstats <Domain name/ID> |
3.7. CPU 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 CPU 사용률, 프로세스 CPU 배포, 빈도 및 SMI를 표시합니다.
| 동작 | 명령 |
|---|---|
| 모든 프로세스 스레드를 포함한 지정된 프로세스 이름 분배 CPU 사용량 및 CPU 선호도 표시 | # pidstat -p $(pidof qemu-kvm) -t |
| 가상 메모리, I/O, CPU 통계 표시 | # vmstat 1 |
| 집계된 세부 CPU 사용량 표시 | # MPstat |
| 자세한 CPU 사용량 배포 표시 | # MPstat -P ALL |
| 지정된 CPU의 자세한 CPU 사용 배포 표시 (범위를 지원하지 않음) | # MPstat -P 2,3,4,5 |
| 30초 동안 지정된 CPU의 세부 CPU 사용량 배포 표시 | # MPstat -P 2,3,4,5 10 30 |
| 지정된 CPU 빈도에 대한 하드웨어 제한 및 빈도 정책 표시 | # cpupower -c 24 frequency-info |
| 현재 CPU 빈도 정보 표시 | # cpupower -c all frequency-info|grep -E "current CPU frequency|analyzing CPU" |
| 모든 CPU에 대한 빈도 및 CPU % C-States stats 표시 | # cpupower monitor |
| 모든 CPU의 변형을 강조하는 모든 CPU에 대한 실시간 빈도 및 CPU % C-States stats 표시 | # watch -n1 -d "cpupower monitor" |
| SMI를 포함한 모든 CPU에 대한 더 자세한 빈도 및 CPU % C-States stats 보기 | # turbostat --interval 1 |
| SMI( RT 사용)를 포함하여 지정된 CPU의 더 자세한 빈도 및 CPU % C-States stats 표시 | # turbostat --interval 1 --cpu 4 |
| CPU 세부 정보 및 supported CPU 세부 정보 표시 | # lscpu |
| Intel CPU의 경우: CPU 사용량, CPU IPC, %, L3 및 L2 캐시 Hit, Miss, Misss per instruction, Temperature, Memory channel usage, QPI/UPI Usage에 대한 매우 낮은 수준의 세부 정보를 표시합니다. | Git 복제 프로세서 NV Monitor 만들기 ./pcm.x" |
3.8. NUMA 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 NUMA(Non-Uniform Memory Access) 통계 및 프로세스 배포를 표시합니다.
| 동작 | 명령 |
|---|---|
| 하드웨어 NUMA 토폴로지 표시 | # numactl -H |
| NUMA 통계 표시 | # numastat -n |
| 시스템 전체 메모리 사용과 같은 meminfo 표시 | # numastat -m |
| NUMA 메모리 세부 정보 표시 및 지정된 프로세스 이름에 대한 밸런싱 | # numastat qemu-kvm |
| 지정된 NUMA 노드 특정 통계에 대해 표시 | # /sys/devices/system/node<NUMA 노드 번호>/numastat |
| NUMA 노드 및 PCI 장치가 있는 NUMA 토폴로지를 매우 명확하게 표시 | # lstopo --physical |
| 관련 장치를 사용하여 물리적 NUMA 토폴로지의 그래프(svg 형식) 생성 | # lstopo --physical --output-format svg > topology.svg |
3.9. 메모리 링크 복사링크가 클립보드에 복사되었습니다!
이 명령을 사용하여 메모리 통계, 대규모 페이지, DPC, 물리적 DIMM 및 빈도를 표시합니다.
| 동작 | 명령 |
|---|---|
| 시스템 전체 메모리 사용과 같은 meminfo 표시 | # numastat -m |
| 가상 메모리, I/O, CPU 통계 표시 | # vmstat 1 |
| 글로벌 메모리 정보 보기 | # cat /proc/meminfo |
| 지정된 NUMA 노드의 총 2MB 대규모 페이지 수 표시 | # /sys/devices/system/node/node<NUMA node number>/hugepages/hugepages-2048kB/nr_hugepages |
| 지정된 NUMA 노드의 총 1GB 대규모 페이지 수 표시 | # /sys/devices/system/node/node<NUMA node number>/hugepages/hugepages-1048576kB/nr_hugepages |
| 지정된 NUMA 노드의 사용 가능한 총 2MB 대규모 페이지 표시 | # /sys/devices/system/node/node<NUMA 노드 번호>/hugepages/hugepages-2048kB/free_hugepages |
| 지정된 NUMA 노드의 사용 가능한 총 1GB 대규모 페이지 표시 | # /sys/devices/system/node/node<NUMA 노드 번호>/hugepages/hugepages-1048576kB/free_hugepages |
| 100x 2MB 대규모 페이지를 NUMA0에 실시간으로 할당(NUMA 노드를 변경할 수 있음) | # echo 100 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages |
| NUMA0에 100x 1GB 대규모 페이지를 실시간으로 할당합니다(NUMA 노드를 변경할 수 있음) | # echo 100 > /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages |
| 실시간 SLAB 정보 표시 | # slabtop |
| 자세한 SLAB 정보 표시 | # cat /proc/slabinfo |
| 설치된 총 메모리 DIMM 표시 | # dmidecode -t memory | grepoctets |
| 설치된 메모리 DIMM 속도 표시 | # dmidecode -t memory | grep Speed |
3.10. PCI 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 PCI 통계, PCI 세부 정보 및 PCI 드라이버 재정의를 표시합니다.
| 동작 | 명령 |
|---|---|
| 시스템에 자세한 PCI 장치 정보 표시 | # lspci -vvvnn |
| PCI 트리 보기 표시 | # lspci -vnnt |
| PCI 장치 NUMA 정보 표시 | # lspci -vmm |
| 지정된 장치의 DASD 최대 링크 속도 표시 | # lspci -s 81:00.0 -vv | grep LnkCap |
| 지정된 장치의 DASD 링크 속도 상태 표시 | # lspci -s 81:00.0 -vv | grep LnkSta |
| PCI 장치 및 커널 드라이버 표시 | # driverctl list-devices |
| PCI 장치 드라이버 덮어쓰기( DPDK 및 SR-IOV 인터페이스의 유사) 표시 | # driverctl list-overrides |
| PCI 장치의 다른 커널 드라이버 설정(재부팅 영구) | # driverctl set-override 0000:81:00.0 vfio-pci |
| PCI 장치에 대한 재정의된 커널 드라이버 설정(명령 사용 시 장치가 중단됨) | # driverctl unset-override 0000:81.0 |
3.11. tuned 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 tuned 프로필, 확인 및 로그를 표시합니다.
| 동작 | 명령 |
|---|---|
| tuned 현재 활성화된 프로필 및 설명 표시 | # tuned-adm profile_info |
| tuned 사용 가능한 프로필 및 현재 활성화된 프로필 표시 | # tuned-adm list |
| 특정 tuned 프로필 활성화 | # tuned-adm 프로필 realtime-virtual-host |
| 현재 활성화된 프로필 확인 | # tuned-adm verify |
| tuned의 로그 | # less /var/log/tuned/tuned.log |
3.12. 프로파일링 프로세스 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 CPU 프로파일링, 프로세스 프로파일링, KVM 프로파일링을 표시합니다.
| 섹션 | 동작 | 명령 |
|---|---|---|
| 프로세스 | 특정 PID의 프로파일링 | # perf 레코드 -F 99 -p PID |
| 프로세스 | 특정 PID에서 30초 동안의 프로파일링 | # perf 레코드 -F 99 -p PID sleep 30 |
| 프로세스 | 특정 PID에서 실시간 프로파일링 | # perf top -F 99 -p PID |
| CPU | 특정 CPU Core 목록에서 모든 이벤트에 대한 프로파일링 | # perf 레코드 -F 99 -g -C <CPU Core(s)>tekton-databindsleep 30s |
| CPU | 모든 이벤트에 대한 특정 CPU 코어 목록에서 실시간 프로파일링 | # perf top -F 99 -g -C <CPU Core(s)> |
| 컨텍스트 전환 | 특정 CPU 코어 목록에서 30초 동안 프로파일링하고 컨텍스트 전환만 검색합니다. | # perf 레코드 -F 99 -g -e sched:sched_switch -C <CPU Core(s)>tekton-databindsleep 30 |
| KVM | 특정 시간 동안 KVM 게스트 프로파일링 | #f kvm 레코드 수면 30s |
| cache | 특정 CPU 코어 목록에서 캐시 효율성을 5초 동안 프로파일링 | # perf stat -C <CPU Core(s)> -B -e cache-references,cache-misses,cycles,instructions,branches,faults,migrations 5 |
| 보고서 | perf 프로파일링 분석 | #f 보고서 |
| 보고서 | stdout에서 Report perf 프로파일링 | #f 보고서 --stdio |
| 보고서 | stdout에서 KVM 프로파일링 보고 | # perf kvm 통계 보고서 |
3.13. 블록 I/O 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 스토리지 I/O 배포 및 I/O 프로파일링을 표시합니다.
| 동작 | 명령 |
|---|---|
| 모든 시스템 장치에 대한 I/O 세부 정보 표시 | # iostat |
| 모든 시스템 장치에 대한 고급 I/O 세부 정보 표시 | # iostat -x |
| 30초 동안 모든 시스템 장치에 대한 고급 I/O 세부 정보 표시 | # iostat -x 10 30 |
| 지정된 블록 장치에 대한 고급 I/O 프로파일링 생성 | # blktrace -d /dev/sda -w 10 && blkparse -i sda.* -d sda.bin |
| blktrace 프로파일링 보고 | # btt -i sda.bin |
3.14. 실시간 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 관련 실시간 테스트, SMI 및 대기 시간을 표시합니다.
| 동작 | 명령 |
|---|---|
| SMI가 정의된 임계값을 실행하는 일반 RT 커널 실행을 차단하는지 확인합니다. | # hwlatdetect --duration=3600 --threshold=25 |
| 여러 추가 옵션을 사용하여 지정된 시간에 대한 최대 스케줄링 대기 시간을 확인합니다.
| # cyclictest --duration=3600 \ --mlockall \ --priority=99 \ --nanosleep \ --interval=200 \ --histogram=5000 \ --histfile=./output \ --threads \ --numa \ --notrace |
3.15. 보안 링크 복사링크가 클립보드에 복사되었습니다!
이러한 명령을 사용하여 예측 실행 및 GRUB 부팅 매개 변수를 확인합니다.
| 동작 | 명령 |
|---|---|
| 현재 모든 Speculative 실행 보안 상태 확인 | Linux 및 BSD 용 Spectre & Meltdown 취약점/완전 검사기 ( Spectre & Meltdown vulnerability/mitigation checker for Linux & BSD )를 참조하십시오. |
| 모든 Speculative Execution 수정을 비활성화하는 GRUB 매개변수 | spectre_v2=off spec_store_bypass_disable=off pti=off l1tf=off kvm-intel.vmentry_l1d_flush=never |
| CVE-2017-5753 (Spectre variant 1) 상태 확인 | # cat /sys/devices/system/cpu/vulnerabilities/spectre_v1 |
| IBPB 및 Retpoline 확인 (CVE-2017-5715 Spectre variant 2) 상태 | # cat /sys/devices/system/cpu/vulnerabilities/spectre_v2 |
| KPTI 확인 (CVE-2017-5754 Meltdown) 상태 | # cat /sys/devices/system/cpu/vulnerabilities/meltdown |
| Spectre-NG 확인 (CVE-2018-3639 Spectre Variant 4) 상태 | # cat /sys/devices/system/cpu/vulnerabilities/spec_store_bypass |
| Foreshadow (CVE-2018-3615 Spectre Varian 5라고도 함) 상태 확인 | # cat /sys/devices/system/cpu/vulnerabilities/l1tf |
| Foreshadow VMEntry L1 캐시 효과 확인 | # cat /sys/module/kvm_intel/parameters/vmentry_l1d_flush |
| SMT 상태 확인 | # cat /sys/devices/system/cpu/smt/control |
3.16. Juniper Contrail vRouter 링크 복사링크가 클립보드에 복사되었습니다!
다음 명령을 사용하여 vRouter VIF, MPLS, Nexthost, VRF, VRF의 경로, 흐름 및 덤프 정보를 표시합니다.
| 동작 | 명령 |
|---|---|
| vRouter 커널 공간 사람이 읽을 수 있는 통계 | see: Contrail vRouter 통계 표시. |
| vRouter DPDK 사람이 읽을 수 있는 통계 | see: Contrail vRouter 통계 표시. |
| DPDK 인터페이스에서 패킷 캡처를 수행하려면 ( vifdump 후에 grep을 사용하지 않음) | # vifdump vif0/234 <tcpdump 표준 인수 such as -v -nn -e -w <path/to/file>> |
| 모든 vRouter 인터페이스 및 하위 인터페이스 통계 및 세부 정보 표시 | # VIF --list |
| 지정된 인터페이스에 대한 vRouter 통계 및 세부 정보 표시 | # VIF --list --get 234 |
| 모든 인터페이스 및 하위 인터페이스에 대한 vRouter packer 속도 표시 | # VIF --list --rate |
| 지정된 인터페이스에 대한 vRouter packer 속도 표시 | # VIF --list --rate --get 234 |
| 지정된 인터페이스에 대한 vRouter 패킷 삭제 통계 표시 | # VIF --list --get 234 --get-drop-stats |
| vRouter 흐름 표시 | # flow -l |
| 실시간 vRouter 흐름 작업 표시 | # flow -r |
| 지정된 VRF에 대한 vRouter 패킷 통계를 표시합니다(vif --list에서 VRF 번호를 찾을 수 있음) | # vrfstats --get 0 |
| 모든 VRF에 대한 vRouter 패킷 통계 표시 | # vrfstats --dump |
| 지정된 VRF의 vRouter 라우팅 테이블을 표시합니다(vif --list에서 VRF 번호를 찾을 수 있음) | # RT --dump 0 |
| 지정된 VRF에 대한 vRouter IPv4 라우팅 테이블을 표시합니다(vif --list에서 VRF 번호를 찾을 수 있음) | # RT --dump 0 --family inet |
| 지정된 VRF에 대한 vRouter IPv6 라우팅 테이블을 표시합니다(vif --list에서 VRF 번호를 찾을 수 있음) | # RT --dump 0 --family inet6 |
| 지정된 VRF에 대한 vRouter 전달 테이블을 표시합니다(vif --list에서 VRF 번호를 찾을 수 있음) | # RT --dump 0 --family bridge |
| 지정된 주소에 대해 지정된 VRF의 vRouter 경로 대상 표시 | # RT --get 0.0.0.0/0 --vrf 0 --family inet |
| vRouter 드롭 통계 표시 | # dropstats |
| 지정된 DPDK 코어에 대한 vRouter 드롭 통계 표시 | # dropstats --core 11 |
| vRouter MPLS 라벨 표시 | # MPLS --dump |
| 주어진 하나에 대한 vRouter next hop을 표시합니다 (다이프로즈 --dump 출력에서 찾을 수 있음) | # NH --get 21 |
| 모든 vRouter 다음 rms 표시 | # NH --list |
| 모든 vRouter VXLAN VNID 표시 | # VXLAN --dump |
| vRouter 에이전트(supervisor, xmmp 연결, vrouter 에이전트 등) 표시 | # contrail-status |
| vRouter를 다시 시작 (및 모든 Contrail 로컬 컴퓨팅 노드 구성 요소) | # systemctl restart supervisor-vrouter |
3.17. OpenStack 링크 복사링크가 클립보드에 복사되었습니다!
이러한 OpenStack 명령을 사용하여 VM 컴퓨팅 노드를 표시합니다.
| 동작 | 명령 |
|---|---|
| 컴퓨팅 노드에 의해 정렬된 컴퓨팅 노드의 모든 VM 목록 표시 | $ Nova list --fields 이름,OS-EXT-SRV-ATTR:host --sort host |
| 컴퓨팅 노드에 있는 모든 VM 목록 표시 vm 이름으로 정렬됨 | $ Nova list --fields 이름,OS-EXT-SRV-ATTR:host |
4장. 인스턴스 Tap 인터페이스의 TX 큐에서 높은 패킷 손실 링크 복사링크가 클립보드에 복사되었습니다!
TX 큐의 패킷 손실 문제를 해결하려면 이 섹션을 사용합니다.
4.1. 증상 링크 복사링크가 클립보드에 복사되었습니다!
호스트 전용 네트워킹을 사용하는 VNF(가상 네트워크 기능) 테스트 중에 인스턴스 탭 인터페이스의 TX 큐에서 높은 패킷 손실을 확인할 수 있습니다. 테스트 설정에서는 노드의 한 VM에서 동일한 노드의 다른 VM으로 패킷을 전송합니다. 패킷 손실은 버스트에 나타납니다.
다음 예제에서는 탭의 TX 큐에서 삭제된 패킷 수를 보여줍니다.
4.2. 진단 링크 복사링크가 클립보드에 복사되었습니다!
이 섹션에서는 패킷 드롭인 탭(커널 경로) 인터페이스를 검사합니다. 사용자 datapath의 vhost 사용자 인터페이스에서 패킷이 삭제되는 경우 https://access.redhat.com/solutions/3381011을 참조하십시오.
TX는 인스턴스의 vCPU와 하이퍼바이저의 다른 프로세스 간의 간섭으로 인해 발생합니다. 탭 인터페이스의 TX 큐는 인스턴스가 패킷을 가져올 수 없는 동안 잠시 동안 패킷을 저장할 수 있는 버퍼입니다. 이 문제는 인스턴스의 CPU가 오랜 시간 동안 실행되지 않거나 정지되지 않는 경우 발생합니다.
TUN/TAP 장치는 하나의 엔드가 커널 네트워크 인터페이스이고, 다른 쪽 끝은 사용자 공간 파일 설명자입니다.
TUN/TAP 인터페이스는 다음 두 가지 모드 중 하나로 실행할 수 있습니다.
- 탭 모드는 L2 헤더가 있는 L2 이더넷 프레임을 장치에 제공하며 사용자 공간으로부터 동일한 값을 수신할 것으로 예상합니다. 이 모드는 VM에 사용됩니다.
- tun 모드에서는 L3 헤더가 있는 L3 IP 패킷을 장치에 제공하며 사용자 공간으로부터 동일한 데이터가 수신될 것으로 예상합니다. 이 모드는 주로 VPN 클라이언트에 사용됩니다.
KVM 네트워킹에서 사용자 공간 파일 설명자는 qemu-kvm 프로세스에서 소유합니다. 탭(하이퍼바이저 관점에서 TX)으로 전송되는 프레임은 qemu-kvm 내에서 L2 프레임으로 이루어집니다. 그러면 가상 네트워크 인터페이스(VM 관점에서 RX)로 수신한 네트워크 패킷이 VM의 가상 네트워크 장치에 해당 프레임을 제공할 수 있습니다.
TUN/TAP의 주요 개념은 하이퍼바이저에서의 전송 방향이 가상 머신에 대한 수신 방향이라는 것입니다. 이는 반대 방향과 동일합니다. 하이퍼바이저에 대한 수신은 가상 머신에서 전송하는 것과 동일합니다.
virtio-net 장치에 패킷의 "링 버퍼"는 없습니다. 즉, VM이 수신되지 않거나(전체적으로는) 수신되지 않기 때문에 TUN/TAP 장치의 TX 대기열이 채워지면 새 패킷이 갈 곳이 없으며 하이퍼바이저는 탭에서 TX 손실을 볼 수 있습니다.
TUN/TAP에서 TX 손실을 확인한 경우 물리적 NIC에서 손실을 중지하도록 RX 링 버퍼를 늘리는 것과 유사하게 TUN/TAP의 탭 txqueuelen 을 늘립니다.
그러나 VM은 수신 시 "slow" 및 "bursty"라고 가정합니다. VM이 항상 충분히 빨리 실행되지 않거나 전혀 수신되지 않으면 TX 큐 길이 조정이 도움이 되지 않습니다. VM이 실행되고 있지 않거나 수신하는 이유를 확인해야 합니다.
VM 패킷 처리 성능을 개선하려면 다음 단계를 완료합니다.
-
하이퍼바이저에서
virtio-net 멀티 큐를 활성화합니다. - VM 내부의 차이점 코어에서 여러 가상 장치 인터럽트를 분산합니다.
이 내용은 KVM의 libvirt 도메인 사양에 설명되어 있으며 RHEL KVM 하이퍼바이저에서 virsh edit 를 사용하여 수행할 수 있습니다.
Red Hat OpenStack Platform에서 virtio-net 멀티 큐 를 구성할 수 없는 경우, 소프트웨어를 사용하여 여러 CPU 코어의 부하를 분산하도록 VM 내에서 RPS를 구성하는 것이 좋습니다. 자세한 내용은 kernel-doc 패키지의 scaling.txt 를 참조하거나 RHEL 제품 문서의 RPS 섹션을 참조하십시오.
4.2.1. 해결방법 링크 복사링크가 클립보드에 복사되었습니다!
대기 시간이 길어지고 다른 단점에 따라 약간의 동결을 완화하려면 TX 대기열을 늘리십시오.
일시적으로 txqueuelen 을 늘리려면 다음 명령을 사용하십시오.
/sbin/ip link set tap<uuid> txqueuelen <new queue length>
/sbin/ip link set tap<uuid> txqueuelen <new queue length>
txqueulen 을 영구적으로 늘리려면 udev 규칙을 만듭니다.
cat <<'EOF'>/etc/udev/rules.d/71-net-txqueuelen.rules
SUBSYSTEM=="net", ACTION=="add", KERNEL=="tap*", ATTR{tx_queue_len}="10000"
EOF
cat <<'EOF'>/etc/udev/rules.d/71-net-txqueuelen.rules
SUBSYSTEM=="net", ACTION=="add", KERNEL=="tap*", ATTR{tx_queue_len}="10000"
EOF
udev를 다시 로드하거나 시스템을 재부팅한 후 새 탭 인터페이스는 대기열 길이가 10000으로 표시됩니다. 예를 들어 다음과 같습니다.
ip link ls | grep tap
[root@overcloud-compute-0 ~]# ip link ls | grep tap
29: tap122be807-cd: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 5505
qdisc pfifo_fast master qbr122be807-cd state UNKNOWN mode DEFAULT
group default qlen 10000
4.2.2. 진단 단계 링크 복사링크가 클립보드에 복사되었습니다!
하이퍼 바이저에서 CPU 시간 발생 시의 영향을 보려면 다음 스크립트를 사용하십시오.
인스턴스에 로그인하고 dd if=/dev/zero of=/dev/null 를 시작하여 유일한 vCPU에서 추가 로드를 생성합니다. 이는 설명용입니다. VM에서 로드 및 로드 없이 동일한 테스트를 반복할 수 있습니다. TX는 하이퍼바이저의 다른 프로세스가 인스턴스의 vCPU에서 시간을 훔치는 경우에만 발생합니다.
다음 예제에서는 테스트 전에 인스턴스를 보여줍니다.
다음 스크립트를 실행하고 TX 큐에서 삭제된 패키지를 관찰합니다. 이는 dd 프로세스가 인스턴스의 CPU에서 상당한 처리 시간을 사용하는 경우에만 발생합니다.
다음 예제에서는 테스트 중에 하이퍼바이저에 dd 의 영향을 보여줍니다. st 레이블은 하이퍼바이저에서 도용된 시간의 백분율을 식별합니다.
ssh 는 인스턴스에서 테스트의 두 번째 절반 동안 느려질 수 있으며 테스트가 너무 오래 실행되는 경우 시간 초과 가능성이 포함될 수 있습니다.
4.3. 해결책 링크 복사링크가 클립보드에 복사되었습니다!
TX 큐를 늘리면 이러한 작은 동결을 완화하는 데 도움이되지만 커널 매개변수의 CPU 고정 및 isolcpu를 사용하여 완전히 격리하는 것이 가장 좋은 솔루션입니다. 자세한 내용은 Configure CPU pinning with NUMA in OpenStack 에서 참조하십시오.
5장. Open vSwitch DPDK를 사용한 인스턴스 VHU 인터페이스에서 TX Drops on Instance VHU interfaces 링크 복사링크가 클립보드에 복사되었습니다!
인스턴스 VHU(vhost-user) 인터페이스에서 전송 드롭의 문제를 해결하려면 다음 절차를 사용하십시오.
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를 사용하여 선점 이유와 그 이유를 표시합니다.
선점의 이유는 다음과 같습니다.
시간 Interrupt(커널 종료):
이를 통해 최소한 두 개의 컨텍스트 전환 비용이 추가됩니다. 타이머 인터럽트는 예기치 않은 시간이 걸릴 수 있는 read-copy update (RCU) 콜백을 실행할 수도 있습니다.
- CPU 전원 관리 및 하이퍼 스레딩
다음 패키지에서 이러한 도구를 찾을 수 있습니다.
5.1.2. 다른 방울에 대한 설명 링크 복사링크가 클립보드에 복사되었습니다!
OVS 2.9 이전에는 vHost 사용자 포트가 dpdkvhostuser 모드로 생성되었습니다. 이 모드에서 OVS는 vhost 서버 역할을 하며 QEMU는 클라이언트 역할을 합니다. 인스턴스가 다운되거나 다시 시작되면 OVS 브리지의 vhost 사용자 포트는 계속 활성 상태로 유지되며 VM으로 향하는 패킷이 삭제됩니다. 이렇게 하면 tx_drop_counter 가 증가합니다.
다음 예제에서는 nova stop <UUID>를 사용하여 VM이 중지되었습니다.
ovs-vsctl list interface vhubd172106-73 | grep _state
[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 내부 포트 이름 > down으로 종료되고 사용자 공간에 프레임이 삭제될 때 발생하는 것과 비슷합니다.
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"'
NovaComputeExtraConfig:
nova::compute::libvirt::rx_queue_size: '"1024"'
nova::compute::libvirt::tx_queue_size: '"1024"'
다음 예제에서는 검증 검사를 보여줍니다.
커널 제한으로 인해 1024 이상으로 큐 크기를 늘릴 수 없습니다.
DPDK를 통해 neutron 네트워크에 PXE 부팅을 사용할 예정이면 PXE 버전이 1024바이트를 지원하는지 확인해야 합니다.
5.2. 진단 링크 복사링크가 클립보드에 복사되었습니다!
게스트가 패킷을 수신할 수 없는 경우 TX가 vhost 사용자 포트로 연결되는 것을 볼 수 있습니다. TCP는 일반적인 네트워크 상태에서 발생하는 패킷 손실에서 복구하도록 설계되었습니다. NFVi는 패킷 드롭에 대한 허용 오차가 감소하고 엄격한 요구 사항이 있습니다.
kernel datapath가 NFVi에 비해 너무 느리기 때문에 DPDK 가속 OVS를 사용합니다. 또한 호스트의 패킷 처리 속도와 일치할 수 있는 DPDK 지원 게스트를 배포하는 것이 중요합니다.
5.3. 해결책 링크 복사링크가 클립보드에 복사되었습니다!
VM에 할당된 vCPU가 게스트에 대한 작업만 처리하도록 합니다.
heat 다음 템플릿 매개변수를 사용하여 클러스터가 배포되었는지 확인합니다.
-
IsolcpusList: 예약에서 CPU를 제거 -
NovaVcpuPinSet: 고정에 CPU 할당 -
NovaComputeCpuSharedSet: 에뮬레이터 스레드 고정을 위해 CPU 할당
-
예제:
- 고정 CPU 및 에뮬레이터 풀 세트를 사용하는 플레이버를 사용하여 VM을 배포해야 합니다.
예제:
openstack flavor create --ram <size_mb> --disk <size_gb> -\ -vcpus <vcpus> --property dpdk=true \ --property hw:mem_page_size=1G \ --property hw:cpu_policy=dedicated \ --property hw:emulator_threads_policy=share <flavor>
openstack flavor create --ram <size_mb> --disk <size_gb> -\
-vcpus <vcpus> --property dpdk=true \
--property hw:mem_page_size=1G \
--property hw:cpu_policy=dedicated \
--property hw:emulator_threads_policy=share <flavor>
- 이러한 설정이 의도한 대로 작동하는지 확인합니다. 자세한 내용은 간단한 컴퓨팅 노드 CPU 파티션 및 메모리 검사를 참조하십시오.
인스턴스에 완전히 전용 CPU 리소스를 할당하고 네트워크 패킷 손실을 계속 관찰하는 경우 인스턴스가 올바르게 조정되고 DPDK가 활성화되어 있는지 확인합니다.
6장. DPDK를 사용하여 Open vSwitch에서 pmd-stats-show 명령 출력 해석 링크 복사링크가 클립보드에 복사되었습니다!
이 섹션을 사용하여 DPDK(Open vSwitch)의 pmd-stats-show 명령(ovs-appctl dpif-netdev/pmd-stats-show)의 출력을 해석합니다.
6.1. 증상 링크 복사링크가 클립보드에 복사되었습니다!
ovs-appctl dpif-netdev/pmd-stats-show 명령은 부정확한 측정을 제공합니다. 이는 PMD가 시작된 이후 차트화된 통계로 인해 발생합니다.
6.2. 진단 링크 복사링크가 클립보드에 복사되었습니다!
유용한 출력을 얻으려면 시스템을 안정된 상태로 두고 측정하려는 통계를 재설정합니다.
put system into steady state wait <x> seconds
# put system into steady state
ovs-appctl dpif-netdev/pmd-stats-clear
# wait <x> seconds
sleep <x>
ovs-appctl dpif-netdev/pmd-stats-show
출력 예는 다음과 같습니다.
core_id 2 는 주로 바쁘기 때문에 시간 처리의 70%와 시간 폴링의 30%를 소비합니다.
polling cycles:5460724802 (29.10%) processing cycles:13305794333 (70.90%)
polling cycles:5460724802 (29.10%)
processing cycles:13305794333 (70.90%)
이 예에서 miss 은 DPDK 데이터 경로('emc' 또는 'dp' classification)에서 분류되지 않은 패킷을 나타냅니다. 정상적인 상황에서는 다음과 같이 proto 계층으로 전송됩니다. 드문 경우지만 flow revalidation 잠금으로 인해 또는 ofproto 계층이 오류를 반환하면 패킷이 삭제됩니다. 이 경우 손실 값도 손실을 나타내기 위해 증가합니다.
emc hits:14874381 megaflow hits:0 avg. subtable lookups per hit:0.00 miss:0 lost:0
emc hits:14874381
megaflow hits:0
avg. subtable lookups per hit:0.00
miss:0
lost:0
자세한 내용은 OVS-DPDK Datapath Classifier 를 참조하십시오.
6.3. 해결책 링크 복사링크가 클립보드에 복사되었습니다!
이 섹션에서는 ovs-appctl 명령을 사용하여 트래픽 흐름을 확인하는 절차를 보여줍니다.
6.3.1. 유휴 PMD 링크 복사링크가 클립보드에 복사되었습니다!
다음 예제에서는 core_ids가 dpdk0을 통해 이동하는 관리 트래픽만 사용하여 dpdk0에 고정된 PMD를 제공하는 시스템을 보여줍니다.
6.3.2. 패킷 드롭이 있는 로드 테스트에서 PMD 링크 복사링크가 클립보드에 복사되었습니다!
다음 예제에서는 core_ids가 dpdk0에 고정된 PMD를 제공하는 시스템을 보여줍니다. dpdk0을 통해 로드 테스트 흐름으로 많은 RX가 감소합니다.
패킷 감소가 발생하는 경우 처리 주기 vs 폴링 사이클의 높은 비율(90 % 이상)을 볼 수 있습니다.
polling cycles:1497174615 (6.85%) processing cycles:20354613261 (93.15%)
polling cycles:1497174615 (6.85%)
processing cycles:20354613261 (93.15%)
패킷당 평균 주기(CPP) 및 패킷당 평균 처리 주기(PCPP)를 확인합니다. 유휴 상태의 주기가 계산되지 않으므로 완전히 로드된 PMD에 대해 PCPP/CPP 비율 1을 기대할 수 있습니다.
avg cycles per packet: 723.96 (21851787876/30183584) avg processing cycles per packet: 674.36 (20354613261/30183584)
avg cycles per packet: 723.96 (21851787876/30183584)
avg processing cycles per packet: 674.36 (20354613261/30183584)
6.3.3. 50%의 MPps 용량으로 PMD(MD) 링크 복사링크가 클립보드에 복사되었습니다!
다음 예는 core_ids가 dpdk0을 통해 dpdk0에 고정되는 PMD를 제공하는 시스템을 보여줍니다. 이 dpdk0 인터페이스(약 12.85 Mpps)의 6.4 Mpps(최대 용량의 50% 이상)를 전송하는 로드 테스트가 포함됩니다.
pps가 인터페이스에 대한 최대값의 약 절반인 경우, 처리 주기 vs 폴링 사이클 (약 70%의 처리 주기)의 더 낮은 비율을 확인할 수 있습니다.
polling cycles:5460724802 (29.10%) processing cycles:13305794333 (70.90%)
polling cycles:5460724802 (29.10%)
processing cycles:13305794333 (70.90%)
6.3.4. 조회 vs miss vs lost vs miss vs lost vs miss vs lost 링크 복사링크가 클립보드에 복사되었습니다!
다음 예제에서는 주제와 관련된 도움말 페이지를 보여줍니다.
이 문서 중 일부는 커널 데이터 경로를 참조하므로 사용자 공간 처리를 할 때 패킷이 커널 스w 캐시( emc & dpcls와 동등)에서 분류되지 않음을 의미하고 사용자 공간의 ofproto 계층으로 전송됩니다.
7장. nova에서 SR-IOV 포트 연결 및 분리 링크 복사링크가 클립보드에 복사되었습니다!
다음 섹션을 사용하여 SR-IOV 포트를 연결 및 분리합니다.
7.1. 증상 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat OpenStack Platform 10 이상에서 nova에서 SR-IOV 포트를 연결하거나 분리할 수 없습니다. Nova 로그는 아직 hw_veb 유형의 VIF 유형 hw_veb에 대한 변환도 보고하지 않습니다.
7.2. 진단 링크 복사링크가 클립보드에 복사되었습니다!
SR-IOV 포트를 이미 생성된 인스턴스에 연결하거나 분리할 수 없습니다. 인스턴스 생성 시 SR-IOV 포트를 연결해야 합니다.
7.3. 해결책 링크 복사링크가 클립보드에 복사되었습니다!
다음 예제에서는 인스턴스 부팅 후 인터페이스를 연결하려고 합니다.
다음 오류와 함께 실패합니다.
ERROR (ClientException): Unexpected API Error. Please report this at http://bugs.launchpad.net/nova/ and attach the Nova API log if possible. <type 'exceptions.KeyError'> (HTTP 500) (Request-ID: req-36b544f4-91a6-442e-a30d-6148220d1449)
ERROR (ClientException): Unexpected API Error. Please report this at http://bugs.launchpad.net/nova/ and attach the Nova API log if possible.
<type 'exceptions.KeyError'> (HTTP 500) (Request-ID: req-36b544f4-91a6-442e-a30d-6148220d1449)
올바른 방법은 SR-IOV 포트로 직접 인스턴스를 생성하는 것입니다.
8장. Open vSwitch DPDK를 사용하여 LACP 결합 구성 및 테스트 링크 복사링크가 클립보드에 복사되었습니다!
사용 중인 RHOSP(Red Hat OpenStack Platform) 버전에 따라 LACP와의 OVS 본딩은 지원되지 않을 수 있습니다. 제품 설명서를 확인하여 LACP와의 OVS 본딩이 지원되는지 확인합니다.
Open vSwitch DPDK를 사용하여 LACP 본딩을 구성 및 테스트하려면 다음 작업을 완료합니다.
- LACP의 스위치 포트를 구성합니다.
- LACP의 Linux 커널 본딩을 기준으로 구성합니다.
- LACP에 대한 OVS DPDK 본딩을 구성합니다.
이 항목에서는 Dell S4048-ON 스위치의 스위치 구성에 대해 설명합니다. RHEL 및 OVS 구성은 동일하게 유지되지만 벤더의 운영 체제는 다른 구문을 사용하여 LACP를 구성합니다.
8.1. LACP의 Switch Ports 구성 링크 복사링크가 클립보드에 복사되었습니다!
스위치 인터페이스를 기본 설정으로 재설정합니다.
S4048-ON-sw#config t S4048-ON-sw(conf)#default int te1/2 S4048-ON-sw(conf)#default int te1/7
S4048-ON-sw#config t S4048-ON-sw(conf)#default int te1/2 S4048-ON-sw(conf)#default int te1/7Copy to Clipboard Copied! Toggle word wrap Toggle overflow port-channel 및 기타 포트 설정을 구성합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow VLAN을 구성합니다.
S4048-ON-sw#config t S4048-ON-sw(conf)#int range vlan901-909 S4048-ON-sw(conf-if-range-vl-901-909)#tagged Port-channel 1 S4048-ON-sw(conf-if-range-vl-901-909)#end S4048-ON-sw#
S4048-ON-sw#config t S4048-ON-sw(conf)#int range vlan901-909 S4048-ON-sw(conf-if-range-vl-901-909)#tagged Port-channel 1 S4048-ON-sw(conf-if-range-vl-901-909)#end S4048-ON-sw#Copy to Clipboard Copied! Toggle word wrap Toggle overflow VLAN 태그를 확인합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow LACP 구성을 확인합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.2. 기본 라인으로 LACP의 Linux 커널 결합 구성 링크 복사링크가 클립보드에 복사되었습니다!
Linux 커널 본딩을 기준으로 구성한 다음, 스위치와 함께 호스트가 LACP 본딩을 형성할 수 있는지 확인합니다.
모든 인터페이스를 커널 공간으로 이동하고 커널 공간 본딩으로 테스트합니다. 이 예에서 p1p1은 버스 주소
0000:04:00.0에 매핑하고 p1p2는 버스 주소0000:04:00.1에 매핑됩니다.driverctl unset-override 0000:04:00.0 driverctl unset-override 0000:04:00.1
[root@baremetal ~]# driverctl unset-override 0000:04:00.0 [root@baremetal ~]# driverctl unset-override 0000:04:00.1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 본딩 드라이버를 로드하고 본딩 인터페이스(
bond10)및 enslave 인터페이스p1p1및p1p2를 구성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow RHEL에서 LACP를 확인합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 스위치에서 LACP를 확인합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 본딩 구성을 제거합니다.
ip link del dev bond10
[root@baremetal ~]# ip link del dev bond10 [root@baremetal ~]#Copy to Clipboard Copied! Toggle word wrap Toggle overflow
본딩 모드 변경에 대한 자세한 내용은 시스템을 재부팅하지 않고 본딩 모드를 변경하는 방법을참조하십시오.
8.3. LACP를 위한 OVS DPDK 결합 구성 링크 복사링크가 클립보드에 복사되었습니다!
다음 목표는 OVS DPDK 내에서 LACP 본딩을 구성하는 것입니다.
8.3.1. Open vSwitch 준비 링크 복사링크가 클립보드에 복사되었습니다!
RHEL에서 대규모 페이지 및 기타 값이 구성되었는지 확인합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow DPDK에 대해 OVS를 구성합니다.
ovs-vsctl list Open_vSwitch | grep other ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0x17c0017c ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x00000001 ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init="true"
[root@baremetal bonding]# ovs-vsctl list Open_vSwitch | grep other other_config : {} [root@baremetal bonding]# ovs-vsctl --no-wait set Open_vSwitch . other_config:pmd-cpu-mask=0x17c0017c [root@baremetal bonding]# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-lcore-mask=0x00000001 [root@baremetal bonding]# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init="true"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 인터페이스를 사용자 공간으로 전환합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Open vSwitch를 다시 시작,
journalctl -u ovs-vswitchd -f & 백그라운드에서 실행:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.3.2. LACP 본딩 구성 링크 복사링크가 클립보드에 복사되었습니다!
본딩을 추가합니다.
ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev ovs-vsctl add-bond ovsbr0 dpdkbond dpdk0 dpdk1 bond_mode=balance-tcp lacp=active -- set
[root@baremetal bonding]# ovs-vsctl add-br ovsbr0 -- set bridge ovsbr0 datapath_type=netdev [root@baremetal bonding]# ovs-vsctl add-bond ovsbr0 dpdkbond dpdk0 dpdk1 bond_mode=balance-tcp lacp=active -- set interface dpdk0 type=dpdk -- set Interface dpdk1 type=dpdkCopy to Clipboard Copied! Toggle word wrap Toggle overflow Open vSwitch에서 확인합니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 스위치에서 확인:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.3.3. OVS에서 포트 활성화/비활성화 링크 복사링크가 클립보드에 복사되었습니다!
ovs-ofctl mod-port <bridge> <port> [up|down]을 사용하여 포트를 활성화하거나 비활성화할 수 있습니다.
포트를 종료합니다.
ovs-ofctl mod-port ovsbr0 dpdk1 down
[root@baremetal bonding]# ovs-ofctl mod-port ovsbr0 dpdk1 downCopy to Clipboard Copied! Toggle word wrap Toggle overflow 종료 확인:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 스위치에서 확인:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 포트를 다시 활성화합니다.
ovs-ofctl mod-port ovsbr0 dpdk1 up
[root@baremetal bonding]# ovs-ofctl mod-port ovsbr0 dpdk1 upCopy to Clipboard Copied! Toggle word wrap Toggle overflow RHEL에서 확인:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 스위치에서 확인:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9장. OVS DPDK를 사용하여 다양한 본딩 모드 배포 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat OpenStack Platform에서 OVS-DPDK로 다양한 본딩 모드를 배포하려면 다음 절차를 사용하십시오.
9.1. 해결책 링크 복사링크가 클립보드에 복사되었습니다!
compute.yaml 환경 파일을 다음과 같이 변경합니다. 이 예제에서는 MTU 값을 2000으로 설정합니다.
위의 템플릿 변경 사항을 사용하여 오버클라우드를 배포하거나 재배포합니다. 완료되면 오버클라우드 노드에서 다음 단계를 수행합니다.
os-net-config 구성을 확인합니다.
본딩 확인:
10장. ovs-vsctl show 메시지에서 Could not open network device dpdk0 (No such device) 메시지를 수신 링크 복사링크가 클립보드에 복사되었습니다!
10.1. 증상 링크 복사링크가 클립보드에 복사되었습니다!
ovs-vsctl show 메시지에서 Could not open network device dpdk0 (No such device) 메시지가 표시됩니다.
10.2. 진단 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat은 DPDK 지원 하드웨어에 나열된 Poll Mode Drivers (PMD)의 서브 세트를 지원합니다. Red Hat은 2017년 8월에 지원되지 않는 PMD를 비활성화했습니다.
업스트림 PMD에는 보안 또는 성능 문제가 있을 수 있습니다. 따라서 PMD는 Red Hat의 자격 테스트를 통과하기 위해 중요한 테스트를 거쳐야 합니다.
/usr/share/doc/openvswitch-<version>/README.DPDK-PMDS에서 활성화된 모든 PMD 목록을 볼 수 있습니다. 이 목록에는 Red Hat에서 지원하지 않는 PMD가 포함될 수 있습니다. README.DPDK-PMDS 에 나열되지 않은 폴링 모드 드라이버는 지원되지 않습니다.
10.3. 해결책 링크 복사링크가 클립보드에 복사되었습니다!
다음 예제는 openvswitch-2.6.1에 대해 지원되는 PMD를 보여줍니다.
이 예에서는 openvswitch-2.9.0에 대해 지원되는 PMD를 보여줍니다.
11장. Open vSwitch DPDK를 사용하여 게스트 RAM을 할당하기 위해 사용 가능한 무료 호스트 메모리 페이지가 충분하지 않음 링크 복사링크가 클립보드에 복사되었습니다!
11.1. 증상 링크 복사링크가 클립보드에 복사되었습니다!
인스턴스를 배포하고 인스턴스에 충분한 pCPU가 있는 계산 노드에 스케줄링할 때 nova는 인스턴스 메모리에 충분한 대규모 페이지도 반환합니다.
또한 컴퓨팅 노드의 /var/log/nova/nova-compute.log 는 다음과 같은 ERROR 메시지를 제공합니다.
2017-11-23 19:53:21.021 153615 ERROR nova.compute.manager [instance: 1b72e7a1-c298-4c92-8d2c-0a9fe886e9bc] 2017-11-23T19:53:20.477183Z qemu-kvm: -object memory-backend-file,id=ram-node0,prealloc=yes,mem-path=/dev/hugepages/libvirt /qemu/7-instance-00000006,share=yes,size=536870912,host-nodes=0,policy=bind: os_mem_prealloc: Insufficient free host memory pages available to allocate guest RAM
2017-11-23 19:53:21.021 153615 ERROR nova.compute.manager [instance: 1b72e7a1-c298-4c92-8d2c-0a9fe886e9bc]
2017-11-23T19:53:20.477183Z qemu-kvm: -object memory-backend-file,id=ram-node0,prealloc=yes,mem-path=/dev/hugepages/libvirt
/qemu/7-instance-00000006,share=yes,size=536870912,host-nodes=0,policy=bind: os_mem_prealloc: Insufficient free host memory
pages available to allocate guest RAM
libvirt는 다음 로그 파일을 생성합니다.
11.2. 진단 링크 복사링크가 클립보드에 복사되었습니다!
추가 설정 없이 nova는 다른 프로세스에서 일정 양의 대규모 페이지 메모리가 사용되는지 알 수 없습니다. 기본적으로 nova는 모든 대규모 페이지 메모리를 인스턴스에 사용할 수 있다고 가정합니다. 이 NUMA 노드에 사용 가능한 pCPU 및 사용 가능한 hugepage 메모리가 여전히 있는 경우 Nova에서 NUMA 노드 0을 먼저 채웁니다. 이 문제는 다음과 같은 원인으로 인해 발생할 수 있습니다.
- 요청된 pCPU는 여전히 NUMA 0에 적합합니다.
- 기존 인스턴스의 결합된 메모리와 생성되는 인스턴스의 메모리가 NUMA 노드 0에 적합합니다.
- OVS와 같은 또 다른 프로세스는 NUMA 노드 0에 일정량의 hugepage 메모리를 보유하고 있습니다.
11.2.1. 진단 단계 링크 복사링크가 클립보드에 복사되었습니다!
meminfo를 확인합니다. 다음은 NUMA 노드당 2MB hugepages 및 512 무료 hugepages가 있는 하이퍼바이저를 보여줍니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow NUMA 아키텍처를 확인합니다.
lscpu | grep -i NUMA
[root@overcloud-compute-1 nova]# lscpu | grep -i NUMA NUMA node(s): 2 NUMA node0 CPU(s): 0-3 NUMA node1 CPU(s): 4-7Copy to Clipboard Copied! Toggle word wrap Toggle overflow OVS에서 예약한 대규모 페이지를 확인합니다. 다음 출력에서 OVS는 NUMA 노드당 512MB의 대규모 페이지를 예약합니다.
ovs-vsctl list Open_vSwitch | grep mem
[root@overcloud-compute-1 virt]# ovs-vsctl list Open_vSwitch | grep mem other_config : {dpdk-init="true", dpdk-lcore-mask="3", dpdk-socket-mem="512,512", pmd-cpu-mask="1e"}Copy to Clipboard Copied! Toggle word wrap Toggle overflow 다음 플레이버를 사용하여 인스턴스 배포(1 vCPU 및 512MB 또는 메모리)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 새 인스턴스가 부팅되고 NUMA 1의 메모리를 사용합니다.
nova list | grep d98772d1-119e-48fa-b1d9-8a68411cba0b
[stack@undercloud-4 ~]$ nova list | grep d98772d1-119e-48fa-b1d9-8a68411cba0b | d98772d1-119e-48fa-b1d9-8a68411cba0b | cirros-test0 | ACTIVE | - | Running | provider1=2000:10::f816:3eff:fe8d:a6ef, 10.0.0.102 |Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow nova boot --nic net-id=$NETID --image cirros --flavor m1.tiny --key-name id_rsa cirros-test0
nova boot --nic net-id=$NETID --image cirros --flavor m1.tiny --key-name id_rsa cirros-test0Copy to Clipboard Copied! Toggle word wrap Toggle overflow 이 인스턴스가 부팅되지 않습니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 계산 노드에서 NUMA 노드 0의 사용 가능한 대규모 페이지가 소진되었는지 확인합니다. 그러나 NUMA 노드 1에는 충분한 공간이 있습니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/log/nova/nova-compute.log의 정보는 인스턴스 CPU가 NUMA 노드 0에 고정되어 있음을 보여줍니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow
numatune 섹션의 nodeset="0"은 NUMA 0에서 메모리가 요청됨을 나타냅니다.
11.3. 해결책 링크 복사링크가 클립보드에 복사되었습니다!
관리자는 인스턴스에서 nova로 사용하지 않는 대규모 페이지 메모리 양을 입력할 수 있습니다.
grep reserved_huge /etc/nova/nova.conf -B1
[root@overcloud-compute-1 virt]# grep reserved_huge /etc/nova/nova.conf -B1
[DEFAULT]
reserved_huge_pages=node:0,size:2048,count:512
reserved_huge_pages=node:1,size:2048,count:512
size 매개변수는 KiB의 대규모 페이지 크기입니다. count 매개변수는 NUMA 노드당 OVS에서 사용하는 대규모 페이지 수입니다. 예를 들어 Open vSwitch에서 사용하는 소켓 메모리 4096의 경우 다음 값을 사용합니다.
[DEFAULT] reserved_huge_pages=node:0,size:1GB,count:4 reserved_huge_pages=node:1,size:1GB,count:4
[DEFAULT]
reserved_huge_pages=node:0,size:1GB,count:4
reserved_huge_pages=node:1,size:1GB,count:4
OpenStack director 로 구현하는 방법에 대한 자세한 내용은 Red Hat OpenStack Platform 10의 /etc/nova/nova.conf에서 reserved_huge_pages를 설정하는 방법을 참조하십시오.
이 옵션은 Red Hat OpenStack Platform 10에서 설명되지 않습니다. OpenStack nova.conf - 구성 옵션
Red Hat OpenStack Platform 11에서 이 내용은 다음과 같습니다. OpenStack nova.conf - 구성 옵션
/etc/nova/nova.conf 에서 debug가 활성화된 경우 openstack-nova-compute 를 다시 시작한 후 로그에 다음 정보가 표시되어야 합니다.
12장. perf 및 Collect 및 Troubleshooting 데이터 전송과 함께 OVS DPDK PMD CPU 사용량 문제 해결 링크 복사링크가 클립보드에 복사되었습니다!
- 사전 요구 사항 이 섹션의 단계를 사용하여 문제 해결 툴을 설치합니다.
compute 노드에
perf를 설치합니다.yum install perf -y
yum install perf -yCopy to Clipboard Copied! Toggle word wrap Toggle overflow Open vSwitch 디버그 RPM을 설치합니다.
subscription-manager repos --enable=rhel-7-server-openstack-10-debug-rpms
subscription-manager repos --enable=rhel-7-server-openstack-10-debug-rpmsCopy to Clipboard Copied! Toggle word wrap Toggle overflow task를 설치합니다(
pidstat명령에 필요):yum install sysstat -y
yum install sysstat -yCopy to Clipboard Copied! Toggle word wrap Toggle overflow
12.1. 진단 링크 복사링크가 클립보드에 복사되었습니다!
이 섹션의 단계를 사용하여 데이터 문제를 해결하고 수집합니다.
12.1.1. PMD 스레드 링크 복사링크가 클립보드에 복사되었습니다!
PMD 스레드의 위치를 결정합니다.
IFS=$'\n' ; for l in $(ps -T -p `pidof ovs-vswitchd` | grep pmd);do PID=`echo $l | awk '{print $2}'`; PMD=`echo $l | awk '{print $NF}'` ; PCPU=`taskset -c -p $PID | awk '{print $NF}'` ; echo "$PMD with PID $PID in on pCPU $PCPU"; doneIFS=$'\n' ; for l in $(ps -T -p `pidof ovs-vswitchd` | grep pmd);do PID=`echo $l | awk '{print $2}'`; PMD=`echo $l | awk '{print $NF}'` ; PCPU=`taskset -c -p $PID | awk '{print $NF}'` ; echo "$PMD with PID $PID in on pCPU $PCPU"; doneCopy to Clipboard Copied! Toggle word wrap Toggle overflow 예를 들어 다음과 같습니다.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 문제를 재현하는 동안 perf 레코드 및 perf 보고서를 실행하고 출력을 저장합니다.
gather_perf_data_a.sh스크립트를 생성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 스크립트를 실행합니다.
chmod +x gather_perf_data_a.sh ./gather_perf_data_a.sh
chmod +x gather_perf_data_a.sh ./gather_perf_data_a.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow
이 보고서는 perf report -i ${archive_name} 을 사용하여 읽을 수 있습니다. Red Hat 지원을 통해 개설된 사례의 경우 결과 tar 아카이브를 케이스에 첨부하십시오.
12.1.2. 추가 데이터 링크 복사링크가 클립보드에 복사되었습니다!
추가 데이터를 수집하기 위해
gather_perf_data_b.sh스크립트를 생성합니다.Copy to Clipboard Copied! Toggle word wrap Toggle overflow 스크립트를 실행합니다.
chmod +x gather_perf_data_b.sh ./gather_perf_data_b.sh
chmod +x gather_perf_data_b.sh ./gather_perf_data_b.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow 참고디스크 공간이 충분한지 확인합니다. 'perf.data' 파일은 여러 기가바이트의 디스크 공간을 차지할 수 있습니다.
Red Hat 지원 티켓에 대한 경우 결과 tar 아카이브를 케이스에 첨부하십시오.
12.1.3. Open vSwitch 로그 링크 복사링크가 클립보드에 복사되었습니다!
모든 OVS(Open vSwitch) 로그를 제공합니다.
/var에 디스크 공간이 충분한지 확인합니다.df -h를 사용하여 /var 및du -sh /var/log/openvswitch에서 사용 가능한 디스크 공간을 결정하여 OVS 로그의 총 크기를 결정합니다.tar -cvzf /var/openvswitch_`hostname`_`date +"%F_%H%M%S"`.tar.gz /var/log/openvswitch
tar -cvzf /var/openvswitch_`hostname`_`date +"%F_%H%M%S"`.tar.gz /var/log/openvswitchCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
결과 파일(예:
/var/openvswitch_overcloud-compute-0_2018-02-27_153713.tar.gz)을 분석 지원 케이스에 연결합니다. sosreport를 생성하고 제공합니다.
/var에 디스크 공간이 충분한지 확인합니다.df -h를 사용하여/var에서 사용 가능한 디스크 공간을 확인합니다.sosreport --batch --all-logs
sosreport --batch --all-logsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
13장. NFV와 함께 가상 환경에서 virsh emulatorpin 사용 링크 복사링크가 클립보드에 복사되었습니다!
NFV와 함께 Red Hat OpenStack Platform에서 virsh emulatorpin 사용의 영향을 확인하려면 다음 절차를 사용하십시오.
13.1. 증상 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat OpenStack Platform {vernum} NFV 환경에서 패킷 손실을 경험하고 에뮬레이터 스레드 고정을 구성하지 않았습니다.
Red Hat OpenStack Platform 10에서 고객은 에뮬레이터 스레드를 고정하기 위해 지원 예외가 필요합니다. 그러나 거의 모든 NFV 사례에서 Red Hat에서 에뮬레이터 스레드를 고정하는 것이 좋습니다. 기본 에뮬레이터 스레드 구성을 변경하여 성능을 크게 높일 수 있습니다. Red Hat 지원 티켓을 열고 필요한 경우 지원 예외를 요청하십시오.
13.2. 해결책 링크 복사링크가 클립보드에 복사되었습니다!
이 섹션을 사용하여 에뮬레이터 스레드 고정을 조사하고 구성합니다.
13.2.1. QEMU-kvm 에뮬레이터 스레드 링크 복사링크가 클립보드에 복사되었습니다!
에뮬레이터 스레드는 가상 시스템 하드웨어 에뮬레이션에 대한 인터럽트 요청 및 비차단 프로세스를 처리합니다. vCPU를 실행하지 않는 스레드는 qemu-kvm 에뮬레이터 스레드입니다. 다음 예제를 참조하십시오.
Linux CFS(완전 공정 스케줄러)로 인해 에뮬레이터 스레드는 일반적으로 libvirt의 에뮬레이터 핀 세트에 정의된 내에서 하나의 pCPU에서 다른 pCPU로 주기적으로 이동합니다.
NFV 컨텍스트에서 isolcpus 매개변수를 사용할 때 에뮬레이터 스레드를 구성하면 해당 CPU에서 CFS 스케줄링을 비활성화하기 때문에 문제가 발생할 수 있습니다. isolcpus 매개변수를 사용하지 않는 경우 에뮬레이터 스레드에서 패킷을 처리하는 CPU를 중단하면 패킷 손실이 발생할 수 있습니다.
에뮬레이터 스레드의 예는 다음과 같습니다.
- QEMU-kvm 스레드
- vnc_worker 스레드
- vhost-<qemu-kvm PID> 커널 스레드( virtio-net 사용 시)(하이퍼바이저에서 커널 네트워킹)
13.2.2. emulator Thread Pinning의 기본 동작 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 nova는 모든 vCPU에 할당된 pCPU를 확장하는 에뮬레이터 스레드 핀을 구성합니다. isolcpus 매개변수를 사용하지 않는 경우 에뮬레이터 스레드를 pCPU에서 예약할 수 있으며 주기적으로 하나의 pCPU에서 다른 pCPU로 이동합니다.
따라서 이러한 CPU의 모든 CPU는 qemu의 에뮬레이터 스레드에서 선점할 수 있으며 패킷의 위험이 감소됩니다.
13.2.3. OpenStack nova(OpenStack Platform 10)의 현재 구현 Thread Pinning 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat OpenStack Platform 10에서는 에뮬레이터 스레드를 고정할 수 있는 공식적으로 지원되는 방법은 없습니다. 다음 예제와 같이 virsh emulatorpin(…) --live 를 사용하여 에뮬레이터 스레드를 일시적으로 pCPU 세트로 이동할 수 있습니다.
to pin emulator threads of instance instance-0000001d to CPU 34 to pin emulator threads of instance instance-0000001d to CPUs 32,34
# to pin emulator threads of instance instance-0000001d to CPU 34
virsh emulatorpin instance-0000001d 34 -live
# to pin emulator threads of instance instance-0000001d to CPUs 32,34
virsh emulatorpin instance-0000001d 32,34 --live
이러한 변경 사항은 인스턴스의 런타임에만 마지막으로 변경됩니다. 영구 수정에는 cron 작업, bash 스크립트 또는 Ansible 작업과 같은 외부 메커니즘이 필요합니다. 이는 지원 예외의 대상이어야 합니다.
13.2.4. 에뮬레이터 스레드 스케줄링에서 isolcpus의 영향 정보 링크 복사링크가 클립보드에 복사되었습니다!
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"`
PCPU=MIN([EMULATORPINSET])
VCPU=REVERSE_CPUSET(PCPU)
REVERSE_CPUSET := SELECT pcpu from `virsh dumpxml <instance name> | grep "cpuset=$PCPU"`
예를 들어 이 경우 모든 에뮬레이터 스레드와 자식은 기본 에뮬레이터 핀 세트에서 선호도 1-3을 상속합니다.For example, in this instance, all emulator threads and children inherit affinity 1-3 from the default emulator pin set:
isolcpus와 함께 모든 에뮬레이터 스레드와 vhost-* 스레드가 pCPU1에서 실행되고 다시 예약되지 않습니다.
13.2.5. 에뮬레이터 스레드의 최적 위치 링크 복사링크가 클립보드에 복사되었습니다!
이 섹션에서는 에뮬레이터 스레드를 다음 네트워크에 배치하는 방법에 대한 설명을 제공합니다.This section provides descriptions for placing emulator threads on the following networks:
- Open vSwitch의 인스턴스 및 netdev 데이터 경로 내의 DPDK 네트워킹
- 인스턴스 내의 DPDK 네트워킹, Open vSwitch의 시스템 데이터 경로 및 하이퍼바이저의 커널 공간 네트워킹
- Open vSwitch의 인스턴스 및 netdev datapath 내의 커널 네트워킹
13.2.5.1. Open vSwitch의 인스턴스 및 netdev 데이터 경로를 사용하여 DPDK 네트워킹을 통한 에뮬레이터 스레드의 최적 배치 링크 복사링크가 클립보드에 복사되었습니다!
DPDK가 인스턴스 내에서 실행되면 패킷 처리가 전적으로 사용자 공간으로 수행됩니다. OS 및 인터럽트 처리는 유지해야 하므로 vCPU0에서 실행하도록 PMD를 예약하지 마십시오. 인스턴스 내의 PMD CPU는 활성 루프를 실행하고 CPU의 100%가 필요하므로 선점해서는 안 됩니다. 이러한 vCPU 중 하나가 선점되는 경우 패킷 손실이 발생할 수 있습니다. 따라서 emulatorpin cpuset는 1 이상으로 번호가 매겨진 가상 CPU를 처리하는 물리적 CPU와 겹치지 않도록 구성해야 합니다.
인스턴스 내의 DPDK 네트워킹을 사용하면 에뮬레이터 스레드에 최적의 위치는 vCPU 0 또는 가상 CPU를 전혀 처리하지 않는 전용 물리적 CPU를 처리하는 pCPU입니다.
인스턴스 내의 하이퍼바이저 및 DPDK에서 OVS-DPDK를 사용하는 경우 에뮬레이터 스레드를 vCPU 0에 배치합니다.
13.2.5.2. Open vSwitch의 인스턴스 및 시스템 데이터 경로 내에서 DPDK 네트워킹을 통한 에뮬레이터 스레드의 최적 배치 링크 복사링크가 클립보드에 복사되었습니다!
하이퍼바이저에서 커널 공간 네트워킹을 사용하는 경우 하이퍼바이저의 패킷 처리가 커널 내에서 실행됩니다.
인스턴스 내의 DPDK 네트워킹을 사용하면 에뮬레이터 스레드에 최적의 위치는 vCPU 0을 처리하는 pCPU 또는 가상 CPU를 처리하지 않는 전용 물리적 CPU입니다.
이 시나리오에서는 vNIC 큐에 대한 패킷 처리는 하이퍼바이저의 vhost-<qemu-kvm PID > 커널 스레드 내에서 실행됩니다. 높은 트래픽에서 이러한 커널 스레드는 상당한 CPU 부하를 생성할 수 있습니다. 에뮬레이터 스레드의 최적 위치는 케이스에 따라 결정되어야 합니다.
ps aux | grep vhost-
[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]
13.2.5.3. Open vSwitch의 인스턴스 및 netdev 데이터 경로 내에서 커널 네트워킹을 사용하여 에뮬레이터 스레드의 최적 배치 링크 복사링크가 클립보드에 복사되었습니다!
인스턴스 내에 커널 네트워킹에는 다음 두 가지 옵션이 있습니다.
- 예를 들어 인스턴스 내에서 인터럽트 배포를 최적화합니다. 이러한 경우 에뮬레이터 스레드에 추가 pCPU를 할당할 필요가 없으며 네트워크 인터럽트를 처리하지 않는 pCPU에 에뮬레이터 스레드를 할당할 수 있습니다.
- 에뮬레이터 스레드에 대해 동일한 NUMA 노드에서 전용 pCPU를 사용합니다.
첫 번째 옵션의 복잡성으로 인해 두 번째 옵션이 권장됩니다.
13.3. 진단 링크 복사링크가 클립보드에 복사되었습니다!
13.3.1. 데모 환경 링크 복사링크가 클립보드에 복사되었습니다!
데모 환경에서는 하나의 인스턴스 instance-0000001d 를 실행합니다. 연결된 qemu-kvm 스레드에는 다음과 같은 PID가 있습니다.
pidof qemu-kvm
[root@overcloud-compute-0 ~]# pidof qemu-kvm
73517
13.3.2. rshpin이 작동하는 방식 링크 복사링크가 클립보드에 복사되었습니다!
기본적으로 Red Hat OpenStack Platform 배포에서는 다음 설정을 사용합니다.
이로 인해 qemu-kvm, vnc_worker 등과 같은 에뮬레이터 스레드가 예기치 않은 할당이 발생합니다.
에뮬레이터 스레드는 virsh 에뮬레이터pin을 사용하여 이동할 수 있습니다.
virsh emulatorpin instance-0000001d 34
virsh emulatorpin instance-0000001d 34
모든 CPU 스레드의 선호도는 변경됩니다.
/proc/sched_debug 의 과거 데이터의 전환 수를 확인합니다. 다음 예에서 PID 73517은 이미 cpu#34로 이동했습니다. 다른 에뮬레이터 작업자는 마지막 출력 이후 실행되지 않아 cpu#10에 계속 표시됩니다.
스레드 73517이 cpu#34로 이동하는 방법에 유의하십시오. 이제 VNC 세션과 상호 작용하면 /proc/sched_debug가 cpu#34에서 vnc_worker 스레드를 표시하는 것을 확인할 수 있습니다.