web-dev-qa-db-ja.com

低遅延TCP設定

私のラボには、Ubuntuで実行する測定用のサーバーがあります。また、TCP接続を介してデータを受信し、できるだけ早く応答を送信する必要があるCプログラムがあります。

構成

  • CPU:2プロセッサx 4コア-Intel(R)Xeon(R)CPU E5345 @ 2.33GHz
  • RAM:12 GB
  • NIC:Intel Corporation 80003ES2LAN Gigabit Ethernet Controller/82546EB Gigabit Ethernet Controller
  • ネットワークスイッチ:Cisco Catalyst 2960
  • データ情報:データブロックは約来る。各10ミリ秒。データブロックサイズは約です。 1000バイト。

パケット受信時のネットワーク遅延は非常に重要です(数十マイクロ秒が重要です)。プログラムを最大限に最適化しましたが、Ubuntuを調整した経験がありません。

パケットの処理/送信のローカル遅延を減らすためにUbuntuで何を構成できますか?

10
Alex V

正直なところ、 これには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ホスト間のレイテンシのトラブルシューティング方法 でもいくつかの提案を見ることができます。

関連するハードウェアまたはネットワーク機器を知らずに、より具体的に取得することは困難です。

10
ewwhite

通常、高パフォーマンスのルートを使用する場合は、アプリケーションに干渉するため、他の(スケジュールされた)プロセスをできるだけ少なく実行する必要があります。

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)ファイアウォールが無効になります。

6
HBruijn