今日、HAProxy VMの1つで少しフェイルオーバーの問題が発生しました。掘り下げたところ、これが見つかりました。
1月26日07:41:45 haproxy2カーネル:[226818.070059] __ratelimit:10コールバックの抑制 1月26日07:41:45 haproxy2カーネル:[226818.070064]ソケットメモリ不足 1月26日07:41:47 haproxy2カーネル:[226819.560048]ソケットメモリ不足 1月26日07:41:49 haproxy2カーネル:[226822.030044]ソケットメモリ不足
このリンクごとに、のデフォルト設定が低いことに関係しているようですnet.ipv4.tcp_mem
。そのため、デフォルトの4倍に増やしました(これはUbuntu Serverであり、Linuxフレーバーが重要かどうかはわかりません)。
現在の値:45984 61312 91968 新しい値:183936 245248 367872
その後、奇妙なエラーメッセージが表示され始めました。
Jan 26 08:18:49 haproxy1 kernel:[2291.579726]ルートハッシュチェーンが長すぎます! Jan 26 08:18:49 haproxy1 kernel:[2291.579732] secret_intervalを調整してください!
Shh .. それは秘密です!!
これは明らかに/proc/sys/net/ipv4/route/secret_interval
デフォルトの600に関係しており、ルートキャッシュの定期的なフラッシュを制御します
これ
secret_interval
は、カーネルの新旧に関係なく、ルートハッシュエントリをすべて吹き飛ばす頻度をカーネルに指示します。私たちの環境では、これは一般的に悪いです。CPUは、キャッシュがクリアされるたびに毎秒数千のエントリの再構築に忙しくなります。ただし、メモリリークを寄せ付けないように、これを1日に1回実行するように設定しました(1つはありませんでした)。
これを減らすことはできますが、単にルートキャッシュから古い値をより速くプッシュするのではなく、定期的にルートキャッシュ全体をドロップすることをお勧めするのは奇妙に思えます。
いくつかの調査の後/proc/sys/net/ipv4/route/gc_elasticity
、ルートテーブルのサイズを抑えるためのより良いオプションであると思われるものが見つかりました。
gc_elasticity
カーネルがルートハッシュエントリの有効期限が切れる前に受け入れる平均バケット深度として最もよく説明できます。これは、アクティブなルートの上限を維持するのに役立ちます。
ルートキャッシュがより積極的にプルーニングされることを期待して、弾性を8から4に調整しました。secret_interval
私たちに正しい感じていません。しかし、たくさんの設定があり、どれが実際にここに行くのが正しいかは不明です。
- / proc / sys / net / ipv4 / route / gc_elasticity(8)
- / proc / sys / net / ipv4 / route / gc_interval(60)
- / proc / sys / net / ipv4 / route / gc_min_interval(0)
- / proc / sys / net / ipv4 / route / gc_timeout(300)
- / proc / sys / net / ipv4 / route / secret_interval(600)
- / proc / sys / net / ipv4 / route / gc_thresh(?)
- rhash_entries(カーネルパラメーター、デフォルトは不明?)
Linuxのルーティングを悪化させたくないので、これらの設定のいくつかを台無しにすることを恐れています。
トラフィックの多いHAProxyインスタンスに対して、どのルーティングパラメーターを調整するのが最適かをアドバイスできますか?