Stack Overflow Careers は次のように提供されます:
user -> internet -> our fw -> nginx -> haproxy -> web farm
通常の操作中に、nginxはHTTPリクエストを受信して処理を行い、同じボックスのループバックアドレス(127.0.0.1)にバインドされているhaproxyインスタンスにリクエストを渡します。
先日、トラブルシューティングを行うために、haproxyインスタンスをnginxが実行されていたのと同じインターフェイスに移動しました。これにより、すべてのリクエストに100ミリ秒のレイテンシがすぐに追加されました。このインターフェースは真の物理インターフェースではありませんが、 コイインターフェース です。
なぜそうなったのか誰かが私に説明できますか?多分パケットキューとの競合?または、「ソフト」であるため、ループバックは常に高速ですか?私がここで見逃している基本的なことがあります。誰かが親切に私を教えてくれることを願っています。
一定の100msの遅延は奇妙に見えます。パケットがバッファリングされ、すぐには配信されないようです。または、それらの一部がドロップされて再送信される可能性があります。このインターフェイスでtcpdumpを実行して、問題を表示できますか? FreeBSDでIPスタックがどのように機能するのか、CARPがどのように実装されるのかはわかりませんが、たとえば、スレーブが定期的に無償のARPでMACアドレスをアドバタイズし、マスターが交互にパケットを両側に送信する可能性はありますか?
また、実際のインターフェイスでtcpdumpを実行して、何も出力されないようにすることはできますか?
システムがCARPデバイスのARPエントリのキャッシュを控え、セッションの各パケットに対してARP要求が発行され、CARPデーモンが応答する必要がある可能性はありますか?
それらのほとんどはいくつかの愚かな考えですが、それはあなたが正しい方向に検索するのを助けるためです。
わかりやすくするために、アクセス方法を127アドレスからローカルIPに変更しただけです。正しい?
それが事実であり、それが違いを生んだ場合、何かが正しくありません。 netstat -rn
を使用してルーティングテーブルを確認し、ローカルIPのルーティング先を確認します。これは、lo0インターフェイス(127と同様)にルーティングする必要があります。
netstat -rn
の出力は、漠然と次のようになります。
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 1.2.3.1 UGS 131 2655014 nge1
1.2.3.0/23 link#2 U 0 88 nge1
1.2.3.4 link#2 UHS 0 34848 lo0
127.0.0.1 link#5 UH 0 64678 lo0
192.168.0.0/26 link#1 U 2 41703537 nge0
192.168.0.1 link#1 UHS 0 70088 lo0
トラフィックがボックスの外に出ないように、ループバックが割り込みレベルのソフトウェアi/fとして実装されているのを見てきました。これは、ループバックを実行していたときのケースでしたか?免責事項:一般的な質問です。 FreeBSDについては何も知りません。
-ピート