
レイヤ2スイッチを介して接続されたUbuntu 20.04を実行している2台のPC間でpingを試みています。私の目標は、「ほぼ」安定したping待ち時間を取得することです。他の人と同様に、CPU負荷が高い場合よりも、CPU負荷が低いときにping待ち時間(往復時間)が悪いことがわかりました。
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で受信されるping待ち時間は約0.5〜0.6ミリ秒です。ただし、CPU負荷を高めるためにストレスツールを使用した場合(たとえば、1つのコアストレスを80%の負荷に増やす)、PC-Aで受信されたping待ち時間は約0.2〜0.3ミリ秒にすぎません。
PC-AとPC-Bの間に直接ケーブルを接続してみましたが、まだ同じ現象が発生するため、問題はスイッチが原因ではないと確信しています。私はこの動作がデフォルトのCPUインジケータであるスリープモードによって引き起こされると確信しています。しかし、驚くべきことに、次のようにCPUインジケータをスリープモードからパフォーマンスモードに変更したときCPU周波数ツール、PC-Aで受信されたping待ち時間はまだ約0.5 - 0.6msです(PC-Bには負荷がありません)。 CPU負荷を増やすと同じ動作が発生します(ping待ち時間約0.2 - 0.3ms)。 CPU指標を変更する以外に、他のタスクを実行する必要があるようです。
答え1
低負荷でEEE(Energy Efficient Ethernet)が有効になると、ネットワークハードウェアはスリープモードになります。これにより遅延が発生する可能性があります。カーネルは、ネットワーク使用量に基づいていつ昼寝するかを動的に推測します。
次の方法でこの機能を無効にできます。この回答に従ってください。
答え2
たとえば、PC-AからPC-Bへのpingを実行しているとします。 PC-Bがオペレーティングシステムの基本プログラム以外のプログラムを実行していない場合、PC-Aで受信されるping待ち時間は約0.5〜0.6ミリ秒です。
これはおそらく、パケットを受信して応答するのにかかる時間だけでなく、CPUがアイドル状態で目を覚ます(通常はPLLの開始+ロック時間)、IRQを処理するのにかかる時間を測定します。測定するには、cpuidle.off = 1で始めてください。
私の目標は、「ほぼ」安定したping待ち時間を取得することです。
これが唯一の目標であり、XYの問題ではない場合、待ち時間の影響を理解するために使用できるいくつかの点は次のとおりです。
- 上記のように、cpuidle.off = 1で始まりアイドル状態を無効にします。これにより、コアが軽いスリープモードから外れるまで待つ必要がなくなります。
- isolcpus=$idOfCoreToIsolate で始まり、起動時に CPU を分離します。完了すると、デフォルトでは隔離されたコアではほとんど実行されません(おそらくタイマーIRQ)。これは開始コア(通常はゼロまたは最後のコア)ではない可能性があります。
- /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がそれを受信するとすぐに実行されます。