CoreOS:tcpdumpはネットワークの問題を不思議に解決します(過剰な数のソケットが使用されています)


14

今日はあなたのために謎があります。AzureでCoreOS(2023.5.0 / Linux 4.19.25-coreos)に基づいた小さな3ノードのElasticsearchクラスターを実行します。Elasticsearchは、ホストネットワークモードのDockerコンテナ内で実行されます。ほぼ完全にメンテナンスフリーで1年以上稼働した後、マシンが非常に興味深い状態になるのを見てきました。

更新

この問題は、Linuxカーネルのドライバーを修正することで解決しました。以下の回答をご覧ください。

症状

基本的に、影響を受けるマシンと他の2つのノード間のネットワークは停止します。すべてが同じ仮想ネットワークと同じサブネットにあり、通常は他のeathと通信できます。影響を受けるノードは、他のサブネット(sshに接続できます)および別のピア仮想ネットワークからも到達できます。マシンにはインターネットへの(非常にむらのある)接続もありますが、ほとんどの要求はタイムアウトになります。

影響を受けるノードで報告される「使用されるソケット」の数/proc/net/sockstatが非常に多いことを確認しました(正常なノードでは〜300ではなく〜4.5k)。監視により、この数はノードが利用できなくなった瞬間から急速に増加することがわかります。

面白いのは、これらの使用済みソケットのソースを特定できないように見えることです。

# cat /proc/net/sockstat
sockets: used 4566
TCP: inuse 2 orphan 0 tw 2 alloc 98 mem 4
UDP: inuse 1 mem 0
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

# cat /proc/net/sockstat6
TCP6: inuse 98
UDP6: inuse 1
UDPLITE6: inuse 0
RAW6: inuse 1
FRAG6: inuse 0 memory 0

それ以外は、マシンは問題ないようです。疑わしいプロセスは実行されておらず、CPU使用量は最小限であり、使用可能なメモリは十分にあります。

同じサブネット内の「到達不能な」VMにpingを実行すると、にいくつかのEAGAIN応答recvmsgENOBUFS返され、から戻ってに戻りsendmsgます。ここでstrace ping出力

(システムに変更を加える前に)追加の出力を収集し、この要点に投稿しました:https : //gist.github.com/privatwolke/e7e2e7eb0272787765f5d3726f37107c

分析

Elasticsearchが最初の容疑者であるため、サーバー上で考えられるすべてのものをシャットダウンしようとしました。ただし、elasticsearchコンテナをシャットダウンしても、使用済みのソケットは解放されません。すべてのCoreOS関連プロセス(update-engine、locksmithdなど)、またはDockerランタイム全体またはAzure固有のものでも同じです。何も役に立たなかったようです。

しかし、今ではさらに奇妙にtcpdumpなっています。マシン上で実行して、何が起こっているのかを確認しようとしました。そして見よ:問題はそれ自体で解決し、接続が回復した。私たちの理論では、tcpdumpはそれを解決するある種のsyscallを実行します。gdbでtcpdumpを実行し、すべてのsyscallにブレークポイントを設定しました。ブレークポイントのロードをステップ実行した後、キャプチャソケット(具体的にはlibpcapのこの行)で無差別モードを設定する行為は、使用されているソケットをリセットし、通常の状態に戻すことであることが最終的にわかりました。

追加の調査結果

  • フラグを指定して実行tcpdumpしても-p/--no-promiscuous-mode、ソケット使用カウンタがクリアされず、マシンが使用可能な状態に戻らないことを確認しました。
  • 実行するとifconfig eth0 txqueuelen 1001使用されているソケットのカウンターがリセットされますが、接続は復元されません
  • ip link set eth0 promisc onまた、promiscモードを手動で設定しても、接続は復元されません。
    • net.ipv4.xfrm4_gc_thresh を32768に設定し、少し大きくしても問題は解決しません。

使用されるソケット

私たちは、私たちと同じくらい困惑しているAzureと連絡を取り合っています。これはおそらく問題ではなく、単なる症状であることを理解しています。しかし、これは私がこれまでに見つけた唯一の具体的なものです。私の希望は、症状を理解することで根本原因に近づくことができることです。Azureのネットワークインターフェイスは、このネットワークドライバーで実行されます

CoreOS / Kernelのせいかもしれない?

タイムラインの観点から、問題は2019-03-11に始まりました。これは、CoreOSが最新バージョンに自動更新された日です。リリースノートによると、このアップデートには4.15.23から4.19.25へのカーネルアップデートが含まれていました。私はまだ変更ログを調べて、何か問題があるかどうかを確認しています。これまでのところ、hypervネットワークドライバーがここ数か月かなりの数の更新を受け取っていることを発見しただけで、そのすべてが4.19.25の一部であるとは限りません。CoreOSが4.19.25に適用したパッチセットはそれほど印象的はありませんが、偽のnf_conntrack_ipv4モジュールを導入するパッチは新しいものです。

更新:可能性のある関連する着信カーネルパッチ?

助けて!

これまでの質問は次のとおりです。

  • この「使用済みソケット」メトリックが急騰する原因は何ですか?私はこのメトリックのカーネルソースを読みましたが、実際にはどのようなソケットであるか、またはどのソケットを作成したかについては言及していない単なるカウンターのようです。

  • 数が約4.5kで平坦になるのはなぜですか?どの制限が原因ですか?

  • カーネル4.14.96と4.19.25の間で何か大きな変更がありましたか?

  • setsockopt()libpcap の呼び出しが状態をリセットするのはなぜですか?

関連するCoreOSバグ:https : //github.com/coreos/bugs/issues/2572


ソケットのオープンは結果的な問題であり、根本的な問題ではありません。ブリッジデバイス上のmacvlanデバイス(独自のMACアドレス)を使用するLinuxシステムでこの動作が発生しました。ブリッジをpromiscに設定すると、macvlanデバイスが機能しました。coreosやazureがわかりません。問題は、下位層が上位レベルのMACアドレスを知らないことです。
アンドレアス

コメントありがとうございます!使用されている多数のソケットが根本的な原因ではなく、マシン上で異常であると特定できる具体的なものに固執しているだけです。
ステファンクライン

こんにちはステファン。連絡あった?1)WOLは有効になっていますか?2)sysctl -w net.ipv4.route.flush = 1は解決しますか?3)動作状態にないarpキャッシュとは何ですか?稼働状態ですか?
マッシモ

回答:


4

まず第一に、非常によく書かれた質問をありがとう!

あなたが説明した詳細レベルは非常に高く、あなたはすでにgdbレベルにいるので、私の答えはあまり役に立たないと思います。とにかく、試してみてください:

  • おそらくあなたはすでにのようなものを試してみましたss -aelsof -n
  • dmesgこの問題が発生したときの戻り何も興味深いのは?
  • サーバーでiptablesを使用していますか?
  • tcpdump以外の方法(たとえば、ip link set [interface] promisc on)を使用してプロミスキャスモードを設定した場合、これも問題を解決しますか?
  • 疑わしいプロセス、ファイル、またはその他の奇妙なアクティビティをチェックしましたか?たぶん、いくつかの招かれざる厄介なプロセスが自分自身を隠す影に潜んでいて、無差別モードが設定されるたびに静かになると考えていますか?
  • tcpdumpをバックグラウンドで実行したままにすると、この問題は再発しますか?

これがお役に立てば幸いです。


1
お返事ありがとうございます!あなたが参照するコマンドのいくつかの出力を実際に集めました。これらは、質問(gist.github.com/privatwolke/e7e2e7eb0272787765f5d3726f37107c)でもリンクされています。奇妙なことは、から報告されるソケットがsslsofそしてnetstatで使用されるソケットよりも少なくなることです/proc/net/sockstat。合計数(そのファイルから読み取られたように見える)のみが同じです。 iptables実行されますが、特別なルールはありません(要点を参照)。自分でプロミスカスモードを設定したり、tcpdumpを継続的に実行したりしていません。次回はそれをします。
ステファンクライン

の出力をss -aepi出力コレクションに追加しました:gist.github.com/privatwolke/…-悲しいことに、dmesgはこれが起こっているときにまったく何も返しません。実際、インシデントの前の最新のエントリは5日前です。
ステファンクライン

dmesg / journalctl -k出力を追加しました。
ステファンクライン

ip link set eth0 promisc on単独ではマシンを使用可能な状態に復元しないことを確認しました。
ステファンクライン

こんにちは、このサイトでこの他の質問を見ましたか?serverfault.com/questions/614453/... あなたがxfrm4 destのキャッシュを破壊する可能性がある暗示するようです。このカーネル設定でこれを増やすことができ xfrm4_gc_thresh - INTEGER The threshold at which we will start garbage collecting for IPv4 destination cache entries. At twice this value the system will refuse new allocations. ます。ただし、IPsecに関連していると言えば、ここでも実行されていないようです。
ペドロ・ペレス

0

これは、Linuxカーネルのhv_netsvcドライバーのバグが原因でした。Microsoftの開発者でこれを解決し、修正プログラムをアップストリームに適用することができました。

問題を非常にうまくまとめているので、ここでコミットメッセージを引用します。

RX完了メッセージが原因でリングバッファがほぼいっぱいになると、TXパケットが「最低水準点」に到達し、キューが停止する場合があります。TXの完了がキューの停止よりも早く到着すると、ウェイクアップが失われる可能性があります。

このパッチは、EAGAINと成功の両方のケースをカバーするために最後の保留中のパケットのチェックを移動するため、キューは必要に応じて確実にウェイクアップされます。

将来の参考のために、これを修正するコミットはhttps://github.com/torvalds/linux/commit/6d9cfab853ca60b2f77b5e4c40443216988cba1fです。

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