解決策 1:
正直なところ、これに 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 ホスト間の遅延をトラブルシューティングする方法
関連するハードウェアやネットワーク機器を知らずに、より具体的に把握することは困難です。
解決策 2:
通常、高パフォーマンスのルートに進む場合は、他の (スケジュールされた) プロセスをできるだけ実行しないようにする必要があります。これは、アプリケーションに干渉するからです。
Linux は、従来の UNIX オペレーティング システムと同様に、複数のアプリケーションを公正な方法で同時に実行するように設計されており、リソースの枯渇を防ごうとします。逆に、アプリケーション以外のすべてを枯渇させることになります。 OS レベルでの簡単な手順は、アプリケーションのナイス レベルとリアルタイム優先度の変更、スケジューラの変更、またはリアルタイム カーネルへの移行です。
TCP/IP は通常、接続の切断を防ぎ、利用可能な帯域幅を効率的に使用するように調整されています。一部の中間リンクがより制約されている接続から可能な限り最大の帯域幅を取得するのではなく、非常に高速なリンクから可能な限り低いレイテンシを取得するには、ネットワーク スタックの調整を調整します。
sysctl -a
チューニングできるカーネル設定のホストが表示されます。設定は、IPv4 を使用しているか IPv6 を使用しているかによって異なります。また、アプリケーションで既に何を行っているかによっても異なりますが、関心のあるものは次のとおりです。
net.ipv4.tcp_window_scaling=1
RFC 1323 - 64K を超える IPV4 TCPwindow サイズのサポート - 通常、高帯域幅ネットワークで必要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) ファイアウォールが無効になっています。