레이어 2 스위치를 통해 연결된 Ubuntu 20.04를 실행하는 두 대의 PC 간에 핑을 시도하고 있습니다. 내 목표는 "거의" 안정적인 핑 대기 시간을 얻는 것입니다. 다른 사람들과 마찬가지로 CPU 로드가 높을 때보다 CPU 로드가 낮을 때 핑 대기 시간(왕복 시간)이 더 나쁘다는 것을 발견했습니다.
https://superuser.com/questions/543503/ping-vs-cpu-usage
https://superuser.com/questions/1189531/kvm-how-is-cpu-usage-lated-to-ping
예를 들어 PC-A에서 PC-B로 ping을 실행한다고 가정해 보겠습니다. PC-B가 운영 체제의 기본 프로그램 이외의 다른 프로그램을 실행하지 않는 경우 PC-A에서 수신되는 핑 대기 시간은 약 0.5 - 0.6밀리초입니다. 그러나 CPU 부하를 높이기 위해 스트레스 도구를 사용할 때(예: 하나의 코어 스트레스를 80% 부하로 증가) PC-A에서 수신된 핑 대기 시간은 약 0.2 - 0.3밀리초에 불과한 것으로 나타났습니다.
PC-A와 PC-B 사이에 직접 케이블을 연결해 보았지만 여전히 동일한 현상이 발생하기 때문에 문제가 스위치로 인해 발생한 것이 아니라고 확신합니다. 나는 이 동작이 기본 CPU 표시기인 절전 모드로 인해 발생한다고 확신합니다. 그런데 놀랍게도 다음을 사용하여 CPU 표시기를 절전 모드에서 성능 모드로 변경했을 때CPU 주파수 도구, PC-A에서 수신된 핑 대기 시간은 여전히 약 0.5 - 0.6ms입니다(PC-B에는 부하 없음). CPU 로드를 늘리면 동일한 동작이 발생합니다(핑 대기 시간 약 0.2 - 0.3ms). CPU 지표를 변경하는 것 외에 다른 작업을 수행해야 할 것 같습니다.
답변1
낮은 부하에서 EEE(Energy Efficient Ethernet)가 활성화되면 네트워크 하드웨어는 절전 모드로 전환됩니다. 이로 인해 지연이 발생할 수 있습니다. 커널은 네트워크 사용량을 기반으로 언제 낮잠을 자야 할지 동적으로 추측합니다.
다음 방법으로 이 기능을 비활성화할 수 있습니다.이 답변을 따르십시오.
답변2
예를 들어 PC-A에서 PC-B로 ping을 실행한다고 가정해 보겠습니다. PC-B가 운영 체제의 기본 프로그램 이외의 다른 프로그램을 실행하지 않는 경우 PC-A에서 수신되는 핑 대기 시간은 약 0.5 - 0.6밀리초입니다.
이는 아마도 패킷을 수신하고 응답하는 데 걸리는 시간뿐만 아니라 CPU가 유휴 상태에서 깨어나고(나에게는 일반적으로 PLL 시작 + 잠금 시간임) IRQ를 처리하는 데 걸리는 시간을 측정합니다. 측정하려면 cpuidle.off=1로 시작해보세요.
내 목표는 "거의" 안정적인 핑 대기 시간을 얻는 것입니다.
이것이 유일한 목표이고 XY 문제가 아닌 경우 대기 시간의 영향을 이해하는 데 사용할 수 있는 몇 가지 사항은 다음과 같습니다.
- 위에서 언급한 대로, cpuidle.off=1로 시작하여 유휴 상태를 비활성화합니다. 이렇게 하면 코어가 가벼운 절전 모드에서 벗어날 때까지 기다릴 필요가 없습니다.
- isolcpus=$idOfCoreToIsolate로 시작하여 시작 시 CPU를 격리합니다. 완료되면 기본적으로 격리된 코어에서는 거의 실행되지 않습니다(아마도 타이머 IRQ). 이는 시작 코어(일반적으로 0 또는 마지막 코어)가 아닐 수 있습니다.
- /proc/interrupts를 확인하여 NIC IRQ 번호를 식별하세요.
- irqbalance를 사용하는 경우: /etc/default/irqbalance를 편집하여 격리된 코어에 대한 적절한 비트를 IRQBALANCE_BANNED_CPUS에 추가하고 --banirq=$IRQNUM을 IRQBALANCE_ARGS에 추가하고 다음 명령을 사용하여 재부팅합니다.
sudo /etc/init.d/irqbalance restart
- 다음을 실행하여 코어를 분리하도록 NIC IRQ를 설정합니다
echo $ISOLATEDCORENUM | sudo tee /proc/irq/$IRQNUM/smp_affinity_list
. 또는 NIC에 흐름 제어 기능이 있는 경우 다른 구성이 필요할 수 있습니다. - RX 인터럽트 집계 지연 비활성화:
sudo ethtool -C <nicNameHere> rx-usecs 0
. 이렇게 하면 ICMP 패킷이 수신되면 즉시 인터럽트가 발생합니다(패킷이 많고 이 작업을 위해 특별히 시스템을 최적화하지 않으면 이는 비효율적입니다).
이러한 방식으로 들어오는 NIC 패킷 수신 IRQ는 전용 코어에 인터럽트 집계가 없고 다른 IRQ가 거의 실행되지 않으며 격리된 코어가 절전 모드로 전환되지 않기 때문에 NIC가 이를 수신하는 즉시 실행됩니다.