Ubuntuでの低遅延TCP設定


10

私のラボには、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で何を設定できますか?


はい、サーバーのメーカー/モデルを知りたいのですが。
ewwhite 2014

もっと深く掘る必要があります。高頻度取引のためのカーネル最適化についていくつか読んでください。販売Cisco Paper:cisco.com/c/dam/en/us/products/collat​​eral/switches/…です ので、両側にまともなPCI-Eカードを取り付けると、多少の節約になります。ほとんどの場合(これに費やす時間に応じて)、少なくともカーネルをさまざまな設定で再構築し、ubuntuが必要とするものの多くを削除しますが、必要はありません。したがって、ewwhiteがコメントに書き込んだように、ubuntuは最低の設定には完全ではない可能性があります。
Dennis Nolte 2014

記載されているハードウェアは、2008年の機器(Intel 5300シリーズCPU)です。当時は、特別な低レイテンシのハードウェア変更はそれほど多くありませんでした。システムBIOSを高性能モードで実行し、CPU Cステートを無効にするように設定しました。
ewwhite 2014

@ewwhiteはい、あなたは2008年の時代の機器について正しいです。私はあなたの提案を試みます。ありがとうございました!
Alex V

このソフトウェアをTCP_NODELAY用に調整する機能はありますか?
マット

回答:


10

正直なところ、私はこのために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ホスト間の待ち時間をトラブルシューティングする方法

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


3
これは本当に宗教的な議論にふさわしい場所ではありません。チャットなど、他の場所に持っていきます。
マイケルハンプトン

1
@MichaelHampton質問に関連するディスカッションに興味深いリンクがありました:Red Hat Realtime Tuning Guide
Alex V

6

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

Linuxは、従来のUNIXオペレーティングシステムと同様に、複数のアプリケーションを同時に公平に実行するように設計されており、リソースの枯渇を防止しようとします。逆を狙って、アプリケーション以外のすべてを枯渇させます。OSレベルでの簡単な手順は、アプリケーションのniceレベルとリアルタイムの優先度の変更、スケジューラーの変更、またはリアルタイムカーネルへの移行です。

TCP / IPは通常、接続のドロップを防ぎ、利用可能な帯域幅を効率的に使用するように調整されています。いくつかの中間リンクがより制約されている接続から可能な最大の帯域幅を取得するのではなく、非常に高速なリンクから可能な限り低いレイテンシを取得するには、ネットワークスタックの調整を調整します。

 sysctl -a 

調整可能なカーネル設定のホストが表示されます。設定は、IPv4またはIPv6を使用しているかどうか、およびアプリケーションですでに正確に何を行っているかによって異なりますが、以下の点に注意してください。

  • net.ipv4.tcp_window_scaling=1 RFC 1323-64Kより大きいIPV4 TCPウィンドウサイズのサポート-通常、高帯域幅ネットワークで必要
  • net.ipv4.tcp_reordering=3 TCPがパケット損失を想定してスロースタートすることなく、TCPパケットストリームでIPV4パケットを並べ替えることができる最大回数。
  • 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パケットでデータを送信できるようにします。

すべてではないにしても、ほとんどのものがカーネルソースに詳しく記載されています

もちろん、未加工のTCPソケットをコーディングして、カーネルのTCP / IPスタックを完全にバイパスすることができます。

多くの場合、高度に調整されたシステムは信頼できるネットワークで実行され、ローカル(iptables)ファイアウォールが無効になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.