私のラボには、Ubuntuで実行する測定用のサーバーがあります。また、TCP接続を介してデータを受信し、できるだけ早く応答を送信する必要があるCプログラムがあります。
構成
パケット受信時のネットワーク遅延は非常に重要です(数十マイクロ秒が重要です)。プログラムを最大限に最適化しましたが、Ubuntuを調整した経験がありません。
パケットの処理/送信のローカル遅延を減らすためにUbuntuで何を構成できますか?
正直なところ、 これにはUbuntuを使用しません ...しかし、Linuxバリアントに適用できるオプションがあります。
ネットワークスタックバッファを作成する必要があります。
net.core.rmem_default = 10000000
net.core.wmem_default = 10000000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
アプリケーションがディスクに書き込んでいる場合は、おそらくスケジューラ/エレベーターの変更が必要になります(例:deadline
エレベーター)。
サーバーレベルでは、CPUガバナーと電源およびCPU周波数管理(P状態、C状態)を変更できます。
OSレベルでは、アプリケーションのリアルタイムの優先度を変更して( chrt
)、割り込みを減らすように最適化し、CPUまたはCPUのグループに固定することができます( taskset
)、および不要なサービスまたはデーモンを停止します。
2つのLinuxホスト間のレイテンシのトラブルシューティング方法 でもいくつかの提案を見ることができます。
関連するハードウェアまたはネットワーク機器を知らずに、より具体的に取得することは困難です。
通常、高パフォーマンスのルートを使用する場合は、アプリケーションに干渉するため、他の(スケジュールされた)プロセスをできるだけ少なく実行する必要があります。
Linuxは、従来のUNIXオペレーティングシステムと同様に、複数のアプリケーションを同時に公平に実行するように設計されており、リソースの枯渇を防止しようとします。逆を目指して、アプリケーション以外のすべてを枯渇させます。 OSレベルでの簡単な手順は、アプリケーションの Nice レベルとリアルタイムの優先度の変更、 scheduler の変更、または real-time の変更です。カーネル。
TCP/IPは通常、接続のドロップを防ぎ、利用可能な帯域幅を効率的に使用するように調整されています。いくつかの中間リンクがより制約されている接続から可能な最大の帯域幅を取得するのではなく、非常に高速なリンクから可能な限り低いレイテンシを取得するには、ネットワークスタックのチューニングを調整します。
sysctl -a
調整可能なカーネル設定のホストが表示されます。設定は、IPv4またはIPv6を使用しているかどうか、およびアプリケーションですでに何を行っているかによって異なりますが、以下の点に注意してください。
net.ipv4.tcp_window_scaling=1
RFC 1323-IPV4のサポートTCP 64Kより大きいウィンドウサイズ-通常、高帯域幅ネットワークで必要net.ipv4.tcp_reordering=3
TCPパケットストリームなしでIPV4パケットを並べ替えることができる最大の時間TCPパケット損失を想定し、スロースタートになる。net.ipv4.tcp_low_latency=1
より高いスループットよりも低いレイテンシを優先することを目的としています。 = 1に設定すると、IPV4 tcpプリキュー処理が無効になりますnet.ipv4.tcp_sack=0
1に設定すると、IPV4の選択的確認応答が有効になります。これには、tcp_timestampsを有効にする必要があり、パケットオーバーヘッドが追加されます。パケットロスが発生しない場合は不要です。net.ipv4.tcp_timestamps=0
袋が必要な場合にのみアドバイスされます。net.ipv4.tcp_fastopen=1
最初のSYNパケットでデータを送信できるようにします。すべてではないにしても、ほとんどが kernel source で文書化されています。
もちろん、raw TCPソケットをコーディングし、カーネルTCP/IPスタック全体を大部分バイパスすることができます。
多くの場合、高度に調整されたシステムは信頼できるネットワークで実行され、ローカル(iptables)ファイアウォールが無効になります。